http://ucooper.com ·´µ÷ÊÔ¼¼Êõ ............................................................................................................................... 2
·¢ÏÖODµÄ´¦Àí ............................................................................................................... 2 1. ´°¿ÚÀàÃû¡¢´°¿ÚÃû ................................................................................................... 3 2. ¼ì²âµ÷ÊÔÆ÷½ø³Ì ....................................................................................................... 4 3. ¸¸½ø³ÌÊÇ·ñÊÇExplorer ............................................................................................ 5 4. RDTSC/ GetTickCountʱ¼äÃô¸Ð³ÌÐò¶Î ................................................................ 6 5. StartupInfo½á¹¹ ........................................................................................................ 7 6. BeingDebugged ......................................................................................................... 8 7. PEB.NtGlobalFlag , Heap.HeapFlags, Heap.ForceFlags .......................................... 9 8. DebugPort: CheckRemoteDebuggerPresent()/NtQueryInformationProcess() ........ 12 9. SetUnhandledExceptionFilter/ Debugger Interrupts ............................................... 14 10. Trap Flagµ¥²½±êÖ¾Òì³£ .................................................................................... 16 11. SeDebugPrivilege ½ø³ÌȨÏÞ .............................................................................. 16 12. DebugObject: NtQueryObject() .......................................................................... 17 13. OllyDbg£ºGuard Pages ...................................................................................... 20 14. Software Breakpoint Detection ........................................................................... 22 15. Hardware Breakpoints Detection ........................................................................ 24 16. PatchingDetection CodeChecksumCalculation²¹¶¡¼ì²â£¬´úÂë¼ìÑéºÍ .......... 25 17. block input·âËø¼üÅÌ¡¢Êó±êÊäÈë ...................................................................... 26 18. EnableWindow½ûÓô°¿Ú ................................................................................... 27 19. ThreadHideFromDebugger ................................................................................. 27 20. Disabling Breakpoints½ûÓÃÓ²¼þ¶Ïµã ................................................................ 29 21. OllyDbg:OutputDebugString() Format String Bug ............................................. 30 22. TLS Callbacks ..................................................................................................... 30 ·´·´µ÷ÊÔ¼¼Êõ ................................................................................................................. 35
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com ·´µ÷ÊÔ¼¼Êõ VC°æ
ÌÆ¾ÃÌÎ
¿´Ñ©ID£ºtangjiutao
±¾È˿ռ䣺http://ucooper.com
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓÃµÈ ÉùÃ÷£ºÕâÆªÎÄÕÂÊDZ¾ÈËѧϰµÄ×ܽᣬÀíÂÛ²¿·Ö²Î¿¼ÁË¡¶ÍѿǵÄÒÕÊõ¡·¡¢¡¶¼ÓÃÜÓë½âÃÜ¡·ÒÔ¼°±¾ÈË´ÓÍøÂçÉÏÊÕ¼¯µÄ×ÊÁÏ£¬ÔÚ´ËÏòÔ×÷ÕßÖ¾´¡£±¾È˵űÏ×ÔÚÓÚ¸ù¾Ý¸öÈËÀí½â¶Ô¸÷ÖÖ·´µ÷ÊÔ¼¼Êõ½øÐÐÁË»ã×ܺ͸߶ȹéÄÉ£¬²¢ÌṩÁ˱¾ÈË´´×÷µÄ¸÷ÖÖ·´µ÷ÊÔʵÀý¼°Ô´´úÂë¡£±¾ÈËÓÚ09Äê9Ô·ݿªÊ¼Ñ§Ï°Èí¼þÄæÏò¹¤³ÌµÄÏà¹ØÖªÊ¶£¬ÔÚѧϰ¹ý³ÌÖеõ½´óÁ¿ÍøÓѵÄÈÈÐİïÖú£¬ÔÚ´ËÏò¸÷λÖÂÒÔ³ÏֿлÒ⡣ϣÍû±¾È˵ÄÕâЩ¹¤×÷Äܹ»¶Ô¸÷λÓÐËù°ïÖú£¬Ç³ÂªÖ®´¦£¬ÄªÒª¼ûЦ¡£¸÷ÖÖÐÎʽµÄ×ªÔØ¶¼±ØÐë±£Áô×÷ÕßÐÅÏ¢¼°±¾ÉùÃ÷¡£
ÓÉÓÚ±¾ÈËÈëÃŽÏÍí¡¢ÄÜÁ¦ÓÐÏÞ£¬²¿·Ö·½·¨ÉÐδʵÏÖ£¬Íû¸ßÊÖ²»Áߴͽ̡£ÊµÏÖÁ˵ķ½·¨´ó¶¼¸½ÓÐʵÀý³ÌÐò¡£ ºÜ¶à·½·¨¶ÔÓÚÐ޸İæµÄODÒѾʧЧ£¬ÇëÓÃÔ°æOD½øÐвâÊÔ¡£
·¢ÏÖODµÄ´¦Àí
Ò»¡¢ÈçºÎ»ñÈ¡OD´°¿ÚµÄ¾ä±ú
1.ÒѾ»ñÈ¡ÁË´°¿ÚÀàÃû»ò±êÌ⣺FindWindowº¯Êý
2.ûÓлñÈ¡´°¿ÚÀàÃû»ò±êÌ⣺GetForeGroundWindow·µ»ØÇ°Ì¨´°¿Ú£¬ÕâÀï¾ÍÊÇODµÄ´°¿Ú¾ä±úÁË¡£×¢ÒâÕâÖÖ·½·¨¸üÎªÖØÒª£¬ÒòΪ´ó¶àÊýÇé¿öϲ»»áÖªµÀODµÄ´°¿ÚÀàÃû¡£
invoke IsDebuggerPresent
.if eax invoke GetForegroundWindow ;»ñµÃµÄÊÇODµÄ´°¿Ú¾ä±ú invoke SendMessage,eax,WM_CLOSE,NULL,NULL .endif
¶þ¡¢»ñÈ¡OD´°¿Ú¾ä±úºóµÄ´¦Àí £¨1£©Ïò´°¿Ú·¢ËÍWM_CLOSEÏûÏ¢ void CDetectODDlg::OnWndcls() { // TODO: Add your control notification handler code here HWND hWnd; if(hWnd=::FindWindow(\ { MessageBox(\·¢ÏÖOD\ ::SendMessage(hWnd,WM_CLOSE,NULL,NULL); }else{ MessageBox(\û·¢ÏÖOD\ } }
£¨2£©Ê¹OD´°¿Ú²»¿ÉÓÃ
HWND hd_od=FindWindow(\
SetWindowLong(hd_od,GWL_STYLE,WS_DISABLED);
£¨3£©ÖÕÖ¹Ïà¹Ø½ø³Ì£¬¸ù¾Ý´°¿Ú¾ä±ú»ñÈ¡½ø³ÌID£¬¸ù¾Ý½ø³ÌID»ñÈ¡½ø³Ì¾ä±ú£¬ HWND hWnd; HANDLE hProc; DWORD pId;
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com if(hWnd=::FindWindow(\ //»ñÈ¡´°¿Ú¾ä±ú { MessageBox(\·¢ÏÖOD\ GetWindowThreadProcessId(hWnd,&pId); //»ñÈ¡½ø³ÌID hProc=OpenProcess(PROCESS_TERMINATE,TRUE,pId); //»ñÈ¡½ø³Ì¾ä±ú TerminateProcess(hProc,200); //ÖÕÖ¹½ø³Ì CloseHandle(hProc); }else{ MessageBox(\û·¢ÏÖOD\ }
£¨2£©³ÌÐò×ÔÉíÖ±½ÓÍ˳ö
1. ´°¿ÚÀàÃû¡¢´°¿ÚÃû
£¨1£© FindWindow
£¨2£© EnumWindowº¯Êýµ÷Óúó£¬ÏµÍ³Ã¶¾ÙËùÓж¥¼¶´°¿Ú£¬ÎªÃ¿¸ö´°¿Úµ÷ÓÃÒ»´Î»Øµ÷º¯Êý¡£
Ôڻص÷º¯ÊýÖÐÓÃGetWindowTextµÃµ½´°¿Ú±êÌ⣬ÓÃstrstrµÈº¯Êý²éÕÒÓÐÎÞOllydbg×Ö·û´®¡£StrStr(´óСдÃô¸Ð£¬¶ÔÓ¦µÄStrStrI´óСд²»Ãô¸Ð)º¯Êý·µ»Østr2µÚÒ»´Î³öÏÖÔÚstr1ÖеÄλÖã¬Èç¹ûûÓÐÕÒµ½£¬·µ»ØNULL¡£
£¨3£© GetForeGroundWindow·µ»ØÇ°Ì¨´°¿Ú£¨Óû§µ±Ç°¹¤×÷µÄ´°¿Ú£©¡£µ±³ÌÐò±»µ÷ÊÔʱ£¬µ÷
ÓÃÕâ¸öº¯Êý½«»ñµÃOllydbgµÄ´°¿Ú¾ä±ú£¬ÕâÑù¾Í¿ÉÒÔÏòÆä·¢ËÍWM_CLOSEÏûÏ¢½«Æä¹Ø±ÕÁË¡£
£¨1£©FindWindow
void CDetectODDlg::OnWndcls() { // TODO: Add your control notification handler code here HWND hWnd; if(hWnd=::FindWindow(\ { MessageBox(\·¢ÏÖOD\ ::SendMessage(hWnd,WM_CLOSE,NULL,NULL); }else{ MessageBox(\û·¢ÏÖOD\ } }
£¨2£©EnumWindow
°üº¬Í·Îļþ£º#include \
BOOL CALLBACK EnumWindowsProc(
HWND hwnd, // handle to parent window LPARAM lParam // application-defined value ) {
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com char ch[100]; CString str=\ if(IsWindowVisible(hwnd)) { ::GetWindowText(hwnd,ch,100); //AfxMessageBox(ch); if(::StrStrI(ch,str)) { AfxMessageBox(\·¢ÏÖOD\ return FALSE; } } return TRUE; }
void CDetectODDlg::OnEnumwindow() { // TODO: Add your control notification handler code here EnumWindows(EnumWindowsProc,NULL);
AfxMessageBox(\ö¾Ù´°¿Ú½áÊø£¬Î´Ìáʾ·¢ÏÖOD£¬ÔòûÓÐOD\}
2. ¼ì²âµ÷ÊÔÆ÷½ø³Ì
ö¾Ù½ø³ÌÁÐ±í£¬¿´ÊÇ·ñÓе÷ÊÔÆ÷½ø³Ì£¨OLLYDBG.EXE,windbg.exeµÈ£©¡£
ÀûÓÃkernel32!ReadProcessMemory()¶ÁÈ¡½ø³ÌÄڴ棬ȻºóѰÕÒµ÷ÊÔÆ÷Ïà¹ØµÄ×Ö·û´®£¨È硱OLLYDBG¡±£©ÒÔ·ÀֹĿÏò·ÖÎöÈËÔ±Ð޸ĵ÷ÊÔÆ÷µÄ¿ÉÖ´ÐÐÎļþÃû¡£ ÐèҪͷÎļþ£º#include \
void CDetectODDlg::OnEnumProcess() { // TODO: Add your control notification handler code here HANDLE hwnd; PROCESSENTRY32 tp32; //½á¹¹Ìå CString str=\YDBG.EXE\ BOOL bFindOD=FALSE; hwnd=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL); if(INVALID_HANDLE_VALUE!=hwnd) { Process32First(hwnd,&tp32); do{ if(0==lstrcmp(str,tp32.szExeFile)) { AfxMessageBox(\·¢ÏÖOD\
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com bFindOD=TRUE; break; } }while(Process32Next(hwnd,&tp32)); if(!bFindOD) AfxMessageBox(\ûÓÐOD\ } CloseHandle(hwnd); }
3. ¸¸½ø³ÌÊÇ·ñÊÇExplorer
ÔÀí£ºÍ¨³£½ø³ÌµÄ¸¸½ø³ÌÊÇexplorer.exe£¨Ë«»÷Ö´ÐеÄÇé¿öÏ£©£¬·ñÔò¿ÉÄܳÌÐò±»µ÷ÊÔ¡£ ÏÂÃæÊÇʵÏÖÕâÖÖ¼ì²éµÄÒ»ÖÖ·½·¨£º
1£®Í¨¹ýTEB(TEB.ClientId)»òÕßʹÓÃGetCurrentProcessId()À´¼ìË÷µ±Ç°½ø³ÌµÄPID
2£®ÓÃProcess32First/Next()µÃµ½ËùÓнø³ÌµÄÁÐ±í£¬×¢Òâexplorer.exeµÄPID£¨Í¨¹ýPROCESSENTRY32.szExeFile£©ºÍͨ¹ýPROCESSENTRY32.th32ParentProcessID»ñµÃµÄµ±Ç°½ø³ÌµÄ¸¸½ø³ÌPID¡£Explorer½ø³ÌIDÒ²¿ÉÒÔͨ¹ý×ÀÃæ´°¿ÚÀàºÍÃû³Æ»ñµÃ¡£
3£®Èç¹û¸¸½ø³ÌµÄPID²»ÊÇexplorer.exe£¬cmd.exe£¬Services.exeµÄPID£¬ÔòÄ¿±ê½ø³ÌºÜ¿ÉÄܱ»µ÷ÊÔ
¶Ô²ß£ºOlly AdvancedÌṩµÄ·½·¨ÊÇÈÃProcess32Next()×ÜÊÇ·µ»Øfail£¬Ê¹½ø³Ìö¾ÙʧЧ£¬PID¼ì²é½«»á±»Ìø¹ý¡£ÕâЩÊÇͨ¹ý²¹¶¡ kernel32!Process32NextW()µÄÈë¿Ú´úÂ루½«EAXÖµÉèΪ0È»ºóÖ±½Ó·µ»Ø£©ÊµÏֵġ£
£¨1£©Í¨¹ý×ÀÃæÀàºÍÃû³Æ»ñµÃExplorerµÄPID Ô´Âë¼û¸½¼þ DWORD ExplorerID; ::GetWindowThreadProcessId(::FindWindow(\ £¨2£©Í¨¹ý½ø³ÌÁбí¿ìÕÕ»ñµÃExplorerµÄPID Ô´Âë¼û¸½¼þ void CDetectODDlg::OnExplorer() { // TODO: Add your control notification handler code here HANDLE hwnd; PROCESSENTRY32 tp32; //½á¹¹Ìå CString str=\ DWORD ExplorerID; DWORD SelfID; DWORD SelfParentID; SelfID=GetCurrentProcessId(); ::GetWindowThreadProcessId(::FindWindow(\ hwnd=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL); if(INVALID_HANDLE_VALUE!=hwnd) { Process32First(hwnd,&tp32); do{
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com if(0==lstrcmp(str,tp32.szExeFile)) { // ExplorerID=tp32.th32ProcessID; // AfxMessageBox(\ } if(SelfID==tp32.th32ProcessID) { SelfParentID=tp32.th32ParentProcessID; } }while(Process32Next(hwnd,&tp32)); str.Format(\±¾½ø³Ì£º%d ¸¸½ø³Ì£º%d Explorer\ MessageBox(str); if(ExplorerID==SelfParentID) { AfxMessageBox(\ûÓÐOD\ } else { AfxMessageBox(\·¢ÏÖOD\ } } CloseHandle(hwnd); }
½ø³Ì: %d
4. RDTSC/ GetTickCountʱ¼äÃô¸Ð³ÌÐò¶Î
µ±½ø³Ì±»µ÷ÊÔʱ£¬µ÷ÊÔÆ÷ʼþ´¦Àí´úÂë¡¢²½¹ýÖ¸ÁîµÈ½«Õ¼ÓÃCPUÑ»·¡£Èç¹ûÏàÁÚÖ¸ÁîÖ®¼äËù»¨·ÑµÄʱ¼äÈç¹û´ó´ó³¬³ö³£¹æ£¬¾ÍÒâζ׎ø³ÌºÜ¿ÉÄÜÊÇÔÚ±»µ÷ÊÔ¡£ £¨1£©RDTSC
½«¼ÆËã»úÆô¶¯ÒÔÀ´µÄCPUÔËÐÐÖÜÆÚÊý·Åµ½EDX£ºEAXÀïÃæ£¬EDXÊǸß룬EAXÊǵÍλ¡£ Èç¹ûCR4µÄTSD(time stamp disabled)ÖÃλ,ÔòrdtscÔÚring3ÏÂÔËÐлᵼÖÂÒì³£(ÌØÈ¨Ö¸Áî),ËùÒÔ½øÈëring0,°ÑÕâ¸ö±ê¼ÇÖÃÉÏ,È»ºóHook ODµÄWaitForDebugEvent,À¹½ØÒ쳣ʼþ,µ±Òì³£´úÂëÎªÌØÈ¨Ö¸Áîʱ,°ÑÒì³£´¦µÄopcode¶Á³ö¼ì²é,Èç¹ûÊÇrdtsc,°Ñeip¼Ó2,SetThreadContext,edx:eaxµÄ·µ»ØÓÉÄãÁË¡£ £¨2£©GetTickCount Ô´Âë¼û¸½¼þ
void CDetectODDlg::OnGetTickCount() { // TODO: Add your control notification handler code here
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com DWORD dTime1; DWORD dTime2; dTime1=GetTickCount(); GetCurrentProcessId(); GetCurrentProcessId(); GetCurrentProcessId(); GetCurrentProcessId(); dTime2=GetTickCount(); if(dTime2-dTime1>100) { AfxMessageBox(\·¢ÏÖOD\ } else{ AfxMessageBox(\ûÓÐOD\ }
}
5. StartupInfo½á¹¹
ÔÀí:Windows²Ù×÷ϵͳÖеÄexplorer.exe´´½¨½ø³ÌµÄʱºò»á°ÑSTARTUPINFO½á¹¹ÖеÄÖµÉèΪ0,¶ø·Çexplorer.exe´´½¨½ø³ÌµÄʱºò»áºöÂÔÕâ¸ö½á¹¹ÖеÄÖµ£¬Ò²¾ÍÊǽṹÖеÄÖµ²»Îª0£¬ËùÒÔ¿ÉÒÔÀûÓÃÕâ¸öÀ´ÅжÏODÊÇ·ñÔÚµ÷ÊÔ³ÌÐò.
******************************************************************************* ½á¹¹Ìå
typedef struct _STARTUPINFO {
DWORD cb; 0000 PSTR lpReserved; 0004 PSTR lpDesktop; 0008 PSTR lpTitle; 000D DWORD dwX; 0010 DWORD dwY; 0014 DWORD dwXSize; 0018 DWORD dwYSize; 001D DWORD dwXCountChars; 0020 DWORD dwYCountChars; 0024 DWORD dwFillAttribute; 0028 DWORD dwFlags; 002D WORD wShowWindow; 0030 WORD cbReserved2; 0034 PBYTE lpReserved2; 0038 HANDLE hStdInput; 003D HANDLE hStdOutput; 0040 HANDLE hStdError; 0044
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com } STARTUPINFO, *LPSTARTUPINFO; void CDetectODDlg::OnGetStartupInfo() { // TODO: Add your control notification handler code here STARTUPINFO info; GetStartupInfo(&info); if(info.dwX!=0 || info.dwY!=0 || info.dwXCountChars!=0 || info.dwYCountChars!=0 || info.dwFillAttribute!=0 || info.dwXSize!=0 || info.dwYSize!=0) { AfxMessageBox(\·¢ÏÖOD\ } else{ AfxMessageBox(\ûÓÐOD\ } }
6. BeingDebugged
kernel32!IsDebuggerPresent() API¼ì²â½ø³Ì»·¾³¿é(PEB)ÖеÄBeingDebugged±êÖ¾¼ì²éÕâ¸ö±êÖ¾ÒÔÈ·¶¨½ø³ÌÊÇ·ñÕýÔÚ±»Óû§Ä£Ê½µÄµ÷ÊÔÆ÷µ÷ÊÔ¡£
ÿ¸ö½ø³Ì¶¼ÓÐPEB½á¹¹£¬Ò»°ãͨ¹ýTEB¼ä½ÓµÃµ½PEBµØÖ·
Fs:[0]Ö¸Ïòµ±Ç°Ï̵߳ÄTEB½á¹¹£¬Æ«ÒÆÎª0´¦ÊÇÏß³ÌÐÅÏ¢¿é½á¹¹TIB
TIBÆ«ÒÆ18H´¦ÊÇself×ֶΣ¬ÊÇTIBµÄ·´ÉíÖ¸Õ룬ָÏòTIB£¨Ò²ÊÇPEB£©Ê×µØÖ· TEBÆ«ÒÆ30H´¦ÊÇÖ¸ÏòPEB½á¹¹µÄÖ¸Õë
PEBÆ«ÒÆ2H´¦£¬¾ÍÊÇBeingDebugged×ֶΣ¬UcharÀàÐÍ
£¨1£© µ÷ÓÃIsDebuggerPresentº¯Êý£¬¼ä½Ó¶ÁBeingDebugged×Ö¶Î £¨2£© ÀûÓõØÖ·Ö±½Ó¶ÁBeingDebugged×Ö¶Î ¶Ô²ß£º
£¨1£© Êý¾Ý´°¿ÚÖÐCtrl+G fs:[30] ²é¿´PEBÊý¾Ý,½«PEB.BeingDebugged±êÖ¾ÖÃ0 £¨2£© OllyscriptÃüÁî\¿ÉÒÔ²¹¶¡Õâ¸ö±êÖ¾ void CDetectODDlg::OnIsdebuggerpresent() { // TODO: Add your control notification handler code here if(IsDebuggerPresent()) { MessageBox(\·¢ÏÖOD\ } else { MessageBox(\ûÓÐOD\ } }
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com 7. PEB.NtGlobalFlag , Heap.HeapFlags, Heap.ForceFlags
£¨1£©Í¨³£³ÌÐòûÓб»µ÷ÊÔʱ£¬PEBÁíÒ»¸ö³ÉÔ±NtGlobalFlag£¨Æ«ÒÆ0x68£©ÖµÎª0£¬Èç¹û½ø³Ì±»µ÷ÊÔͨ³£ÖµÎª0x70£¨´ú±íÏÂÊö±êÖ¾±»ÉèÖã©£º FLG_HEAP_ENABLE_TAIL_CHECK(0X10) FLG_HEAP_ENABLE_FREE_CHECK(0X20) FLG_HEAP_VALIDATE_PARAMETERS(0X40)
ÕâЩ±êÖ¾ÊÇÔÚntdll!LdrpInitializeExecutionOptions()ÀïÉèÖõġ£Çë×¢ÒâPEB.NtGlobalFlagµÄĬÈÏÖµ¿ÉÒÔͨ¹ýgflags.exe¹¤¾ß»òÕßÔÚ×¢²á±íÒÔÏÂλÖô´½¨ÌõÄ¿À´Ð޸ģº
HKLM\\Software\\Microsoft\\Windows Nt\\CurrentVersion\\Image File Execution Options
assume fs:nothing
mov eax,fs:[30h] mov eax,[eax+68h] and eax,70h
£¨2£©ÓÉÓÚNtGlobalFlag±êÖ¾µÄÉèÖ㬶ÑÒ²»á´ò¿ª¼¸¸ö±êÖ¾£¬Õâ¸ö±ä»¯¿ÉÒÔÔÚntdll!RtlCreateHeap()Àï¹Û²âµ½¡£Õý³£Çé¿öÏÂϵͳΪ½ø³Ì´´½¨µÚÒ»¸ö¶Ñʱ»á½«FlagsºÍForceFlags·Ö±ðÉèΪ2£¨HEAP_GROWABLE)ºÍ0 ¡£µ±½ø³Ì±»µ÷ÊÔʱ£¬ÕâÁ½¸ö±ê־ͨ³£±»ÉèΪ50000062£¨È¡¾öÓÚNtGlobalFlag£©ºÍ0x40000060£¨µÈÓÚFlags AND 0x6001007D£©¡£
assume fs:nothing
mov ebx,fs:[30h] ;ebxÖ¸ÏòPEB mov eax,[ebx+18h] ;PEB.ProcessHeap
cmp dword ptr [eax+0ch],2 ;PEB.ProcessHeap.Flags jne debugger_found cmp dword ptr [eax+10h],0 ;PEB.ProcessHeap.ForceFlags jne debugger_found
ÕâЩ±ê־λ¶¼ÊÇÒòΪBeingDebuggedÒýÆðµÄ¡£ÏµÍ³´´½¨½ø³ÌµÄʱºòÉèÖÃBeingDebugged=TRUE£¬ºóÀ´NtGlobalFlag¸ù¾ÝÕâ¸ö±ê¼ÇÉèÖÃFLG_VALIDATE_PARAMETERSµÈ±ê¼Ç¡£ÔÚΪ½ø³Ì´´½¨¶Ñʱ£¬ÓÖÓÉÓÚNtGlobalFlagµÄ×÷Ó㬶ѵÄFlags±»ÉèÖÃÁËһЩ±ê¼Ç£¬Õâ¸öFlagsËæ¼´±»Ìî³äµ½ProcessHeapµÄFlagsºÍForceFlagsÖУ¬Í¬Ê±¶ÑÖб»Ìî³äÁ˺ܶàBAADF00DÖ®ÀàµÄ¶«Î÷£¨HeapMagic£¬Ò²¿ÉÓÃÀ´¼ì²âµ÷ÊÔ£©¡£ Ò»´ÎÐÔ½â¾öÕâЩ״̬¼û¼ÓÃܽâÃÜP413
//********************************************** typedef ULONG NTSTATUS; typedef ULONG PPEB; typedef ULONG KAFFINITY; typedef ULONG KPRIORITY;
typedef struct _PROCESS_BASIC_INFORMATION { // Information Class 0 NTSTATUS ExitStatus; PPEB PebBaseAddress; KAFFINITY AffinityMask; KPRIORITY BasePriority; ULONG UniqueProcessId;
ULONG InheritedFromUniqueProcessId;
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com } PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;
typedef enum _PROCESSINFOCLASS { ProcessBasicInformation, // 0 Y N ProcessQuotaLimits, // 1 Y Y ProcessIoCounters, // 2 Y N ProcessVmCounters, // 3 Y N ProcessTimes, // 4 Y N ProcessBasePriority, // 5 N Y ProcessRaisePriority, // 6 N Y ProcessDebugPort, // 7 Y Y ProcessExceptionPort, // 8 N Y ProcessAccessToken, // 9 N Y ProcessLdtInformation, // 10 Y Y ProcessLdtSize, // 11 N Y
ProcessDefaultHardErrorMode, // 12 Y Y ProcessIoPortHandlers, // 13 N Y ProcessPooledUsageAndLimits, // 14 Y N ProcessWorkingSetWatch, // 15 Y Y ProcessUserModeIOPL, // 16 N Y
ProcessEnableAlignmentFaultFixup, // 17 N Y ProcessPriorityClass, // 18 N Y ProcessWx86Information, // 19 Y N ProcessHandleCount, // 20 Y N ProcessAffinityMask, // 21 N Y ProcessPriorityBoost, // 22 Y Y ProcessDeviceMap,// 23 Y Y ProcessSessionInformation, // 24 Y Y ProcessForegroundInformation, // 25 N Y ProcessWow64Information // 26 Y N } PROCESSINFOCLASS;
typedef NTSTATUS (_stdcall *ZwQueryInformationProcess)( HANDLE ProcessHandle,
PROCESSINFOCLASS ProcessInformationClass, PVOID ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnLength ); //¶¨Ò庯ÊýÖ¸Õë
void CDetectODDlg::OnPebflags() {
// TODO: Add your control notification handler code here
//¶¨Ò庯ÊýÖ¸Õë±äÁ¿
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com
ZwQueryInformationProcess MyZwQueryInformationProcess;
HANDLE hProcess = NULL;
PROCESS_BASIC_INFORMATION pbi = {0};
ULONG peb = 0; ULONG cnt = 0;
ULONG PebBase = 0; ULONG AddrBase; BOOL bFoundOD=FALSE; WORD flag; DWORD dwFlag; DWORD bytesrw;
DWORD ProcessId=GetCurrentProcessId();
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, ProcessId);
if (hProcess != NULL) {
MyZwQueryInformationProcess=(ZwQueryInformationProcess)GetProcAddress(LoadLibrary(\wQueryInformationProcess\ //º¯ÊýÖ¸Õë±äÁ¿µ÷ÓÃ
if (MyZwQueryInformationProcess( {
AddrBase=PebBase; if
(ReadProcessMemory(hProcess,(LPCVOID)(PebBase+0x68),&flag,2,&bytesrw)
&&
ProcessBasicInformation, &pbi,
sizeof(PROCESS_BASIC_INFORMATION), &cnt) == 0)
hProcess,
//º¯ÊýÖ¸Õë±äÁ¿¸³Öµ
PebBase = (ULONG)pbi.PebBaseAddress; //»ñÈ¡PEBµØÖ·
bytesrw==2) //¶ÁÄÚ´æµØÖ·
{ //PEB.NtGlobalFlag } if { } if
(ReadProcessMemory(hProcess,(LPCVOID)(AddrBase+0x0c),&flag,2,&bytesrw)
&&
AddrBase=dwFlag;
(ReadProcessMemory(hProcess,(LPCVOID)(PebBase+0x18),&dwFlag,4,&bytesrw)
&&
if(0x70==flag){ }
bFoundOD=TRUE;
bytesrw==4)
bytesrw==2)
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com
{//PEB.ProcessHeap.Flags } if
(ReadProcessMemory(hProcess,(LPCVOID)(AddrBase+0x10),&flag,2,&bytesrw)
&&
if(2!=flag){ }
bFoundOD=TRUE;
bytesrw==2)
{//PEB.ProcessHeap.ForceFlags }
if(bFoundOD==FALSE) { } else { }
AfxMessageBox(\·¢ÏÖOD\AfxMessageBox(\ûÓÐOD\if(0!=flag){ }
bFoundOD=TRUE;
}
CloseHandle(hProcess); } }
8. DebugPort: CheckRemoteDebuggerPresent()/NtQueryInformationProcess()
Kernel32!CheckRemoteDebuggerPresent()ÊÇÓÃÓÚÈ·¶¨ÊÇ·ñÓе÷ÊÔÆ÷±»¸½¼Óµ½½ø³Ì¡£ BOOL CheckRemoteDebuggerPresent( HANDLE hProcess,
PBOOL pbDebuggerPresent )
Kernel32!CheckRemoteDebuggerPresent()½ÓÊÜ2¸ö²ÎÊý£¬µÚ1¸ö²ÎÊýÊǽø³Ì¾ä±ú£¬µÚ2¸ö²ÎÊýÊÇÒ»¸öÖ¸Ïòboolean±äÁ¿µÄÖ¸Õ룬Èç¹û½ø³Ì±»µ÷ÊÔ£¬¸Ã±äÁ¿½«°üº¬TRUE·µ»ØÖµ¡£ Õâ¸öAPIÄÚ²¿µ÷ÓÃÁËntdll!NtQueryInformationProcess()£¬ÓÉËüÍê³É¼ì²â¹¤×÷¡£
typedef BOOL (WINAPI *CHECK_REMOTE_DEBUGGER_PRESENT)(HANDLE, PBOOL); //¶¨Ò庯ÊýÖ¸Õë
void CDetectODDlg::OnCheckremotedebuggerpresent() {
// TODO: Add your control notification handler code here HANDLE hProcess;
HINSTANCE hModule;
BOOL bDebuggerPresent = FALSE;
CHECK_REMOTE_DEBUGGER_PRESENT CheckRemoteDebuggerPresent; //½¨Á¢º¯ÊýÖ¸Õë±äÁ¿ дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com hModule = GetModuleHandleA(\ //µØÖ·Òª´ÓÄ£¿éÖж¯Ì¬»ñµÃ CheckRemoteDebuggerPresent =
(CHECK_REMOTE_DEBUGGER_PRESENT)GetProcAddress(hModule, \ //»ñÈ¡µØÖ· hProcess = GetCurrentProcess();
CheckRemoteDebuggerPresent(hProcess,&bDebuggerPresent); //µ÷ÓÃ }
if(bDebuggerPresent==TRUE) { } else { }
AfxMessageBox(\ûÓÐOD\AfxMessageBox(\·¢ÏÖOD\
ntdll!NtQueryInformationProcess()ÓÐ5¸ö²ÎÊý¡£
ΪÁ˼ì²âµ÷ÊÔÆ÷µÄ´æÔÚ£¬ÐèÒª½«ProcessInformationclass²ÎÊýÉèΪProcessDebugPort(7)¡£ NtQueryInformationProcess()¼ìË÷Äں˽ṹEPROCESS5µÄDebugPort³ÉÔ±£¬Õâ¸ö³ÉÔ±ÊÇϵͳÓÃÀ´Óëµ÷ÊÔÆ÷ͨÐŵĶ˿ھä±ú¡£·Ç0µÄDebugPort³ÉÔ±Òâζ׎ø³ÌÕýÔÚ±»Óû§Ä£Ê½µÄµ÷ÊÔÆ÷µ÷ÊÔ¡£Èç¹ûÊÇÕâÑùµÄ»°£¬ProcessInformation ½«±»ÖÃΪ0xFFFFFFFF £¬·ñÔòProcessInformation ½«±»ÖÃΪ0¡£
ZwQueryInformationProcess( IN HANDLE ProcessHandle,
IN PROCESSINFOCLASS ProcessInformationClass, OUT PVOID ProcessInformation,
IN ULONG ProcessInformationLength, OUT PULONG ReturnLength OPTIONAL );
//********************************************************
typedef NTSTATUS (_stdcall *ZW_QUERY_INFORMATION_PROCESS)( HANDLE ProcessHandle,
PROCESSINFOCLASS ProcessInformationClass, //¸Ã²ÎÊýÒ²ÐèÒªÉÏÃæÉùÃ÷µÄÊý¾Ý½á¹¹ PVOID ProcessInformation,
ULONG ProcessInformationLength, PULONG ReturnLength ); //¶¨Ò庯ÊýÖ¸Õë
void CDetectODDlg::OnZwqueryinfomationprocess() { // TODO: Add your control notification handler code here HANDLE hProcess; HINSTANCE hModule; DWORD dwResult;
ZW_QUERY_INFORMATION_PROCESS MyFunc;
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com hModule = GetModuleHandle(\
MyFunc=(ZW_QUERY_INFORMATION_PROCESS)GetProcAddress(hModule,\mationProcess\
hProcess = GetCurrentProcess(); MyFunc( hProcess, ProcessDebugPort, &dwResult, 4, NULL); if(dwResult!=0) { AfxMessageBox(\·¢ÏÖOD\ } else { AfxMessageBox(\ûÓÐOD\ } }
9. SetUnhandledExceptionFilter/ Debugger Interrupts
µ÷ÊÔÆ÷Öв½¹ýINT3ºÍINT1Ö¸ÁîµÄʱºò£¬ÓÉÓÚµ÷ÊÔÆ÷ͨ³£»á´¦ÀíÕâЩµ÷ÊÔÖжϣ¬ËùÒÔÉèÖõÄÒì³£´¦ÀíÀý³ÌĬÈÏÇé¿öϲ»»á±»µ÷Óã¬Debugger Interrupts¾ÍÀûÓÃÁËÕâ¸öÊÂʵ¡£ÕâÑùÎÒÃÇ¿ÉÒÔÔÚÒì³£´¦ÀíÀý³ÌÖÐÉèÖñêÖ¾£¬Í¨¹ýINTÖ¸ÁîºóÈç¹ûÕâЩ±ê־ûÓб»ÉèÖÃÔòÒâζ׎ø³ÌÕýÔÚ±»µ÷ÊÔ¡£ÁíÍ⣬kernel32!DebugBreak()ÄÚ²¿Êǵ÷ÓÃÁËINT3À´ÊµÏֵģ¬ÓÐЩ¿ÇÒ²»áʹÓÃÕâ¸öAPI¡£×¢Òâ²âÊÔʱ£¬ÔÚÒì³£´¦ÀíÀïÈ¡ÏûÑ¡ÖÐINT3 breaks ºÍ Singal-step break °²È«µØÖ·µÄ»ñÈ¡Êǹؼü
//******************************************************** static DWORD lpOldHandler;
typedef LPTOP_LEVEL_EXCEPTION_FILTER (_stdcall *pSetUnhandledExceptionFilter)( LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter );
pSetUnhandledExceptionFilter lpSetUnhandledExceptionFilter;
LONG WINAPI TopUnhandledExceptionFilter( struct _EXCEPTION_POINTERS *ExceptionInfo ) { _asm pushad AfxMessageBox(\»Øµ÷º¯Êý\ lpSetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER )lpOldHandler);
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com ExceptionInfo->ContextRecord->Eip=NewEip;//×ªÒÆµ½°²È«Î»Öà _asm popad return EXCEPTION_CONTINUE_EXECUTION; }
void CDetectODDlg::OnSetUnhandledExceptionFilter() { bool isDebugged=0; // TODO: Add your control notification handler code here lpSetUnhandledExceptionFilter = (pSetUnhandledExceptionFilter)GetProcAddress(LoadLibrary((\ \ lpOldHandler=(DWORD)lpSetUnhandledExceptionFilter(TopUnhandledExceptionFilter); _asm{ //»ñÈ¡Õâ¸ö°²È«µØÖ· call me //·½Ê½Ò»£¬ÐèÒªNewEip¼ÓÉÏÒ»¸öÆ«ÒÆÖµ me: pop NewEip //·½Ê½Ò»½áÊø mov NewEip,offset safe //·½Ê½¶þ£¬¸ü¼òµ¥ int 3 //´¥·¢Òì³£ } AfxMessageBox(\¼ì²âµ½OD\ isDebugged=1; _asm{ safe: } if(1==isDebugged){ }else{ AfxMessageBox(\ûÓÐOD\ } }
//********************************************************
ÓÉÓÚµ÷ÊÔÖж϶øµ¼ÖÂÖ´ÐÐֹͣʱ£¬ÔÚOllyDbgÖÐʶ±ð³öÒì³£´¦ÀíÀý³Ì£¨Í¨¹ýÊÓͼ->SEHÁ´£©²¢Ï¶ϵ㣬ȻºóShift+F9½«µ÷ÊÔÖжÏ/Òì³£´«µÝ¸øÒì³£´¦ÀíÀý³Ì£¬×îÖÕÒì³£´¦ÀíÀý³ÌÖеĶϵã»á¶ÏÏÂÀ´£¬Õâʱ¾Í¿ÉÒÔ¸ú×ÙÁË¡£
ÁíÒ»¸ö·½·¨ÊÇÔÊÐíµ÷ÊÔÖжÏ×Ô¶¯µØ´«µÝ¸øÒì³£´¦ÀíÀý³Ì¡£ÔÚOllyDbgÖпÉÒÔͨ¹ý Ñ¡Ïî-> µ÷ÊÔÑ¡Ïî -> Òì³£ -> ºöÂÔÏÂÁÐÒì³£ Ñ¡ÏÖй³Ñ¡\ÖжÏ\ºÍ\µ¥²½ÖжÏ\¸´Ñ¡¿òÀ´Íê³ÉÉèÖá£
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com 10. Trap Flagµ¥²½±êÖ¾Òì³£
TF=1µÄʱºò£¬»á´¥·¢µ¥²½Òì³£¡£¸Ã·½·¨ÊôÓÚÒì³£´¦Àí£¬²»¹ý±È½ÏÌØÊ⣺δÐ޸ĵÄODÎÞÂÛÊÇF9»¹ÊÇF8¶¼²»ÄÜ´¦ÀíÒì³££¬Óвå¼þµÄODÔÚF9ʱÄÜÕýÈ·´¦Àí£¬F8ʱ²»ÄÜÕýÈ·´¦Àí¡£ void CDetectODDlg::OnTrapFlag() { try{ _asm{ pushfd //´¥·¢µ¥²½Òì³£ or dword ptr [esp],100h ;TF=1 popfd } AfxMessageBox(\¼ì²âµ½OD\ }catch(...){ AfxMessageBox(\ûÓÐOD\ } }
11. SeDebugPrivilege ½ø³ÌȨÏÞ
ĬÈÏÇé¿öϽø³ÌûÓÐSeDebugPrivilegeȨÏÞ£¬µ÷ÊÔʱ£¬»á´Óµ÷ÊÔÆ÷¼Ì³ÐÕâ¸öȨÏÞ£¬¿ÉÒÔͨ¹ý´ò¿ªCSRSS.EXE½ø³Ì¼ä½ÓµØÊ¹ÓÃSeDebugPrivilegeÈ·¶¨½ø³ÌÊÇ·ñ±»µ÷ÊÔ¡£×¢ÒâĬÈÏÇé¿öÏÂÕâһȨÏÞ½ö½öÊÚÓèÁËAdministrators×éµÄ³ÉÔ±¡£¿ÉÒÔʹÓÃntdll!CsrGetProcessId() API»ñÈ¡CSRSS.EXEµÄPID£¬Ò²¿ÉÒÔͨ¹ýö¾Ù½ø³ÌÀ´µÃµ½CSRSS.EXEµÄPID¡£ ʵÀý²âÊÔÖУ¬ODÔØÈëºó£¬µÚÒ»´Î²»ÄÜÕýÈ·¼ì²â£¬µÚ¶þ´Î¿ÉÒÔ£¬²»ÖªÎªºÎ¡£ void CDetectODDlg::OnSeDebugPrivilege() { // TODO: Add your control notification handler code here HANDLE hProcessSnap; HANDLE hProcess; PROCESSENTRY32 tp32; //½á¹¹Ìå CString str=\ hProcessSnap=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL); if(INVALID_HANDLE_VALUE!=hProcessSnap) { Process32First(hProcessSnap,&tp32); do{ if(0==lstrcmpi(str,tp32.szExeFile)) { hProcess=OpenProcess(PROCESS_QUERY_INFORMATION,NULL,tp32.th32ProcessID); if(NULL!=hProcess) {
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com }
AfxMessageBox(\·¢ÏÖOD\ } else { AfxMessageBox(\ûÓÐOD\ } CloseHandle(hProcess); } }while(Process32Next(hProcessSnap,&tp32)); }
CloseHandle(hProcessSnap);
12. DebugObject: NtQueryObject()
³ýÁËʶ±ð½ø³ÌÊÇ·ñ±»µ÷ÊÔÖ®Í⣬ÆäËûµÄµ÷ÊÔÆ÷¼ì²â¼¼ÊõÇ£Éæµ½¼ì²éϵͳµ±ÖÐÊÇ·ñÓе÷ÊÔÆ÷ÕýÔÚÔËÐС£ÄæÏòÂÛ̳ÖÐÌÖÂÛµÄÒ»¸öÓÐȤµÄ·½·¨¾ÍÊǼì²éDebugObjectÀàÐÍÄں˶ÔÏóµÄÊýÁ¿¡£ÕâÖÖ·½·¨Ö®ËùÒÔÓÐЧÊÇÒòΪÿµ±Ò»¸öÓ¦ÓóÌÐò±»µ÷ÊÔµÄʱºò£¬½«»áΪµ÷ÊÔ¶Ô»°ÔÚÄÚºËÖд´½¨Ò»¸öDebugObjectÀàÐ͵ĶÔÏó¡£
DebugObjectµÄÊýÁ¿¿ÉÒÔͨ¹ýntdll!NtQueryObject()¼ìË÷ËùÓжÔÏóÀàÐ͵ÄÐÅÏ¢¶ø»ñµÃ¡£NtQueryObject½ÓÊÜ5¸ö²ÎÊý£¬ÎªÁ˲éѯËùÓеĶÔÏóÀàÐÍ£¬ObjectHandle²ÎÊý±»ÉèΪNULL£¬ObjectInformationClass²ÎÊýÉèΪObjectAllTypeInformation(3)£º NTSTATUS NTAPI NtQueryObject( IN HANDLE ObjectHandle,
IN OBJECT_INFORMATION_CLASS ObjectInformationClass, OUT PVOID ObjectInformation, IN ULONG Length, OUT PULONG ResultLength )
Õâ¸öAPI·µ»ØÒ»¸öOBJECT_ALL_INFORMATION½á¹¹£¬ÆäÖÐNumberOfObjectsTypes³ÉԱΪËùÓеĶÔÏóÀàÐÍÔÚObjectTypeInformationÊý×éÖеļÆÊý£º typedef struct _OBJECT_ALL_INFORMATION{ ULONG NumberOfObjectsTypes; OBJECT_TYPE_INFORMATION ObjectTypeInformation[1]; }
¼ì²âÀý³Ì½«±éÀúÓµÓÐÈçϽṹµÄObjectTypeInformationÊý×飺 typedef struct _OBJECT_TYPE_INFORMATION{ [00] UNICODE_STRING TypeName; [08] ULONG TotalNumberofHandles; [0C] ULONG TotalNumberofObjects; ...more fields... }
TypeName³ÉÔ±ÓëUNICODE×Ö·û´®\±È½Ï£¬È»ºó¼ì²éTotalNumberofObjects »ò TotalNumberofHandles ÊÇ·ñΪ·Ç0Öµ¡£
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com #ifndef STATUS_INFO_LENGTH_MISMATCH
#define STATUS_INFO_LENGTH_MISMATCH ((UINT32)0xC0000004L) #endif
typedef enum _POOL_TYPE { NonPagedPool, PagedPool,
NonPagedPoolMustSucceed, DontUseThisType,
NonPagedPoolCacheAligned, PagedPoolCacheAligned,
NonPagedPoolCacheAlignedMustS } POOL_TYPE;
typedef struct _UNICODE_STRING { USHORT Length;
USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING;
typedef UNICODE_STRING *PUNICODE_STRING; typedef const UNICODE_STRING *PCUNICODE_STRING;
typedef enum _OBJECT_INFORMATION_CLASS {
typedef struct _OBJECT_TYPE_INFORMATION {
UNICODE_STRING TypeName; ULONG TotalNumberOfHandles; ULONG TotalNumberOfObjects; WCHAR Unused1[8];
ULONG HighWaterNumberOfHandles; ULONG HighWaterNumberOfObjects; WCHAR Unused2[8];
ACCESS_MASK InvalidAttributes; GENERIC_MAPPING GenericMapping; ACCESS_MASK ValidAttributes; BOOLEAN SecurityRequired; ObjectBasicInformation, ObjectNameInformation, ObjectTypeInformation, ObjectDataInformation
// Result is OBJECT_BASIC_INFORMATION structure // Result is OBJECT_NAME_INFORMATION structure // Result is OBJECT_TYPE_INFORMATION structure // Result is OBJECT_ALL_INFORMATION structure
ObjectAllTypesInformation,
// Result is OBJECT_DATA_INFORMATION structure
} OBJECT_INFORMATION_CLASS, *POBJECT_INFORMATION_CLASS;
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com
typedef struct _OBJECT_ALL_INFORMATION {
typedef struct _OBJECT_ALL_TYPES_INFORMATION { ULONG NumberOfTypes;
OBJECT_TYPE_INFORMATION TypeInformation[1];
} OBJECT_ALL_TYPES_INFORMATION, *POBJECT_ALL_TYPES_INFORMATION;
typedef UINT32 (__stdcall *ZwQueryObject_t) (
void CDetectODDlg::OnNTQueryObject() {
hNtDLL = GetModuleHandle(\if(hNtDLL){
ZwQueryObject = (ZwQueryObject_t)GetProcAddress(hNtDLL, \
UINT32 iResult = ZwQueryObject(NULL, ObjectAllTypesInformation, NULL, NULL, &dwSize); if(iResult==STATUS_INFO_LENGTH_MISMATCH) {
Types
=
// TODO: Add your control notification handler code here // µ÷ÊÔÆ÷±ØÐëÕýÔÚµ÷ÊÔ²ÅÄܼì²âµ½£¬½ö´ò¿ªODÊǼì²â²»µ½µÄ HMODULE hNtDLL; DWORD dwSize; UINT i;
UCHAR KeyType=0;
OBJECT_ALL_TYPES_INFORMATION *Types; OBJECT_TYPE_INFORMATION ZwQueryObject_t ZwQueryObject;
*t;
IN HANDLE ObjectHandle,
IN OBJECT_INFORMATION_CLASS ObjectInformationClass, OUT PVOID ObjectInformation, IN ULONG Length,
OUT PULONG ResultLength );
ULONG NumberOfObjectsTypes;
OBJECT_TYPE_INFORMATION ObjectTypeInformation[1]; BOOLEAN MaintainHandleCount; USHORT MaintainTypeList; POOL_TYPE PoolType;
ULONG DefaultPagedPoolCharge; ULONG DefaultNonPagedPoolCharge;
} OBJECT_TYPE_INFORMATION, *POBJECT_TYPE_INFORMATION;
} OBJECT_ALL_INFORMATION, *POBJECT_ALL_INFORMATION;
(OBJECT_ALL_TYPES_INFORMATION*)VirtualAlloc(NULL,dwSize,MEM_COMMIT,PAGE_READWRITE)
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com ; }
}
}
AfxMessageBox(\ûÓÐOD!\VirtualFree (Types,0,MEM_RELEASE);
for (t=Types->TypeInformation,i=0;i
if ( !_wcsicmp(t->TypeName.Buffer,L\±È½ÏÁ½¸öÊÇ·ñÏàµÈ£¬Õâ¸öLºÜÌØ{ }
t=(OBJECT_TYPE_INFORMATION
*)((char
if(t->TotalNumberOfHandles > 0 || t->TotalNumberOfObjects > 0) { }
break; // Found Anyways
AfxMessageBox(\·¢ÏÖOD\
VirtualFree (Types,0,MEM_RELEASE); return;
if (Types == NULL) return;
if (iResult=ZwQueryObject(NULL,ObjectAllTypesInformation, Types, dwSize, &dwSize)) return;
Ê⣬±¾µØµÄÒâ˼
*)t->TypeName.Buffer+((t->TypeName.MaximumLength+3)&~3));
13. OllyDbg£ºGuard Pages
Õâ¸ö¼ì²éÊÇÕë¶ÔOllyDbgµÄ£¬ÒòΪËüºÍOllyDbgµÄÄÚ´æ·ÃÎÊ/дÈë¶ÏµãÌØÐÔÏà¹Ø¡£
³ýÁËÓ²¼þ¶ÏµãºÍÈí¼þ¶ÏµãÍ⣬OllyDbgÔÊÐíÉèÖÃÒ»¸öÄÚ´æ·ÃÎÊ/дÈë¶Ïµã£¬ÕâÖÖÀàÐ͵ĶϵãÊÇͨ¹ýÒ³Ãæ±£»¤À´ÊµÏֵġ£¼òµ¥µØËµ£¬Ò³Ãæ±£»¤ÌṩÁ˵±Ó¦ÓóÌÐòµÄij¿éÄÚ´æ±»·ÃÎÊʱ»ñµÃ֪ͨÕâÑùÒ»¸ö;¾¶¡£
Ò³Ãæ±£»¤ÊÇͨ¹ýPAGE_GUARDÒ³Ãæ±£»¤Ð޸ķûÀ´ÉèÖõģ¬Èç¹û·ÃÎʵÄÄÚ´æµØÖ·ÊÇÊܱ£»¤Ò³ÃæµÄÒ»²¿·Ö£¬½«»á²úÉúÒ»¸öSTATUS_GUARD_PAGE_VIOLATION(0x80000001)Òì³£¡£Èç¹û½ø³Ì±»OllyDbgµ÷ÊÔ²¢ÇÒÊܱ£»¤µÄÒ³Ãæ±»·ÃÎÊ£¬½«²»»áÅ׳öÒì³££¬·ÃÎʽ«»á±»µ±×÷ÄÚ´æ¶ÏµãÀ´´¦Àí£¬¶ø¿ÇÕýºÃÀûÓÃÁËÕâÒ»µã¡£ ʾÀý
ÏÂÃæµÄʾÀý´úÂëÖУ¬½«»á·ÖÅäÒ»¶ÎÄڴ棬²¢½«´ýÖ´ÐеĴúÂë±£´æÔÚ·ÖÅäµÄÄÚ´æÖУ¬È»ºóÆôÓÃÒ³ÃæµÄPAGE_GUARDÊôÐÔ¡£½Ó×ųõʼ»¯±êÉè·ûEAXΪ0£¬È»ºóͨ¹ýÖ´ÐÐÄÚ´æÖеĴúÂëÀ´Òý·¢STATUS_GUARD_PAGE_VIOLATIONÒì³£¡£Èç¹û´úÂëÔÚOllyDbgÖб»µ÷ÊÔ£¬ÒòΪÒì³£´¦ÀíÀý³Ì²»»á±»µ÷ÓÃËùÒÔ±êÉè·û½«²»»á¸Ä±ä¡£ ¶Ô²ß
ÓÉÓÚÒ³Ãæ±£»¤Òý·¢Ò»¸öÒì³££¬ÄæÏò·ÖÎöÈËÔ±¿ÉÒÔ¹ÊÒâÒý·¢Ò»¸öÒì³££¬ÕâÑùÒì³£´¦ÀíÀý³Ì½«»á±»µ÷Óá£ÔÚʾÀýÖУ¬ÄæÏò·ÖÎöÈËÔ±¿ÉÒÔÓÃINT3Ö¸ÁîÌæ»»µôRETNÖ¸Áһµ©INT3Ö¸Áî±»
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com Ö´ÐУ¬Shift+F9Ç¿ÖÆµ÷ÊÔÆ÷Ö´ÐÐÒì³£´¦Àí´úÂë¡£ÕâÑùµ±Òì³£´¦ÀíÀý³Ìµ÷Óúó£¬EAX½«±»ÉèΪÕýÈ·µÄÖµ£¬È»ºóRETNÖ¸Á»á±»Ö´ÐС£
Èç¹ûÒì³£´¦ÀíÀý³ÌÀï¼ì²éÒì³£ÊÇ·ñÕæµØÊÇSTATUS_GUARD_PAGE_VIOLATION£¬ÄæÏò·ÖÎöÈËÔ±¿ÉÒÔÔÚÒì³£´¦ÀíÀý³ÌÖÐ϶ϵãÈ»ºóÐ޸Ĵ«ÈëµÄExceptionRecord²ÎÊý£¬¾ßÌåÀ´Ëµ¾ÍÊÇExceptionCode£¬ ÊÖ¹¤½«ExceptionCodeÉèΪSTATUS_GUARD_PAGE_VIOLATION¼´¿É¡£ ʵÀý£º
//ÐèÒªÓõ½ÔÚUnhandledExceptionHandler ÀﶨÒåµÄһЩ½á¹¹ //******************************************************** static bool isDebugged=1;
LONG WINAPI TopUnhandledExceptionFilter2( ) { }
void CDetectODDlg::OnGuardPages() {
lpSetUnhandledExceptionFilter
=
(pSetUnhandledExceptionFilter)GetProcAddress(LoadLibrary((\ \
// ·ÖÅäÄÚ´æ
lpvBase = VirtualAlloc(NULL,dwPageSize,MEM_COMMIT,PAGE_READWRITE); if (lpvBase==NULL) AfxMessageBox(\ÄÚ´æ·ÖÅäʧ°Ü\_asm{
mov NewEip,offset safe //·½Ê½¶þ£¬¸ü¼òµ¥ mov eax,lpvBase
lpOldHandler=(DWORD)lpSetUnhandledExceptionFilter(TopUnhandledExceptionFilter2); // TODO: Add your control notification handler code here
ULONG dwOldType; DWORD dwPageSize;
LPVOID lpvBase; // »ñÈ¡ÄÚ´æµÄ»ùµØÖ· SYSTEM_INFO sSysInfo; // ϵͳÐÅÏ¢ GetSystemInfo(&sSysInfo); // »ñȡϵͳÐÅÏ¢ dwPageSize=sSysInfo.dwPageSize;
//ϵͳÄÚ´æÒ³´óС
_asm pushad
AfxMessageBox(\»Øµ÷º¯Êý\
lpSetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER )lpOldHandler); ExceptionInfo->ContextRecord->Eip=NewEip; isDebugged=0; _asm popad
return EXCEPTION_CONTINUE_EXECUTION; struct _EXCEPTION_POINTERS *ExceptionInfo
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com safe: }
} }
VirtualFree(lpvBase,dwPageSize,MEM_DECOMMIT);
pop ecx //¶Ñջƽºâ£¬µ¯³öµ÷ÓÃʱµÄѹջ
AfxMessageBox(\·¢ÏÖOD\AfxMessageBox(\ûÓÐOD\ }
if(0==::VirtualProtect(lpvBase,dwPageSize,PAGE_EXECUTE_READ | PAGE_GUARD,&dwOldType)){ } _asm{
pop ecx
call ecx //µ÷ÓÃʱѹջ AfxMessageBox(\Ö´ÐÐʧ°Ü\
push eax
mov byte ptr [eax],0C3H //дһ¸ö RETN µ½±£ÁôÄڴ棬ÒÔ±ãÏÂÃæµÄµ÷ÓÃ
if(1==isDebugged){ }else{
14. Software Breakpoint Detection
Èí¼þ¶ÏµãÊÇͨ¹ýÐÞ¸ÄÄ¿±êµØÖ·´úÂëΪ0xCC£¨INT3/Breakpoint Interrupt£©À´ÉèÖõĶϵ㡣ͨ¹ýÔÚÊܱ£»¤µÄ´úÂë¶ÎºÍ£¨»ò£©APIº¯ÊýÖÐɨÃè×Ö½Ú0xCCÀ´Ê¶±ðÈí¼þ¶Ïµã¡£ÕâÀïÒÔÆÕͨ¶ÏµãºÍº¯Êý¶Ïµã·Ö±ð¾ÙÀý¡£ £¨1£© ʵÀýÒ» ÆÕͨ¶Ïµã
×¢Ò⣺ÔÚ±»±£»¤µÄ´úÂëÇøÓòÏÂINT3¶Ïµã½øÐвâÊÔ BOOL DetectBreakpoints() { BOOL bFoundOD; bFoundOD=FALSE; __asm { jmp CodeEnd
CodeStart: mov eax,ecx ;±»±£»¤µÄ³ÌÐò¶Î nop
push eax push ecx pop ecx pop eax CodeEnd:
cld ;¼ì²â´úÂ뿪ʼ mov edi,offset CodeStart mov edx,offset CodeStart
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com mov ecx,offset CodeEnd sub ecx,edx mov al,0CCH repne scasb jnz ODNotFound mov bFoundOD,1 ODNotFound: } return bFoundOD; }
void CDetectODDlg::OnDectectBreakpoints() { // TODO: Add your control notification handler code here HANDLE hProcess; hProcess=::GetCurrentProcess(); CString str=\ÀûÓÃÎÒ¶¨Î»\ if(DetectBreakpoints()) { AfxMessageBox(\·¢ÏÖOD\ } else { AfxMessageBox(\ûÓÐOD\ } }
£¨2£© ʵÀý¶þ º¯Êý¶Ïµãbp
ÀûÓÃGetProcAddressº¯Êý»ñÈ¡APIµÄµØÖ· ×¢Ò⣺¼ì²âʱ£¬BP MessageBoxA BOOL DetectFuncBreakpoints() { BOOL bFoundOD; bFoundOD=FALSE; DWORD dwAddr; dwAddr=(DWORD)::GetProcAddress(LoadLibrary(\ __asm {
cld ;¼ì²â´úÂ뿪ʼ mov edi,dwAddr ;ÆðʼµØÖ· mov ecx,100 ;100bytes ;¼ì²â100¸ö×Ö½Ú mov al,0CCH repne scasb jnz ODNotFound mov bFoundOD,1 ODNotFound:
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com } return bFoundOD; }
void CDetectODDlg::OnDectectFuncBreakpoints() { // TODO: Add your control notification handler code here CString str=\ÀûÓÃÎÒ¶¨Î»\ if(DetectFuncBreakpoints()) { AfxMessageBox(\·¢ÏÖOD\ } else { AfxMessageBox(\ûÓÐOD\ } }
15. Hardware Breakpoints Detection
Ó²¼þ¶ÏµãÊÇͨ¹ýÉèÖÃÃûΪDr0µ½Dr7µÄµ÷ÊԼĴæÆ÷À´ÊµÏֵġ£Dr0-Dr3°üº¬ÖÁ¶à4¸ö¶ÏµãµÄµØÖ·£¬Dr6ÊǸö±êÖ¾£¬ËüָʾÄĸö¶Ïµã±»´¥·¢ÁË£¬Dr7°üº¬ÁË¿ØÖÆ4¸öÓ²¼þ¶ÏµãÖîÈçÆôÓÃ/½ûÓûòÕßÖжÏÓÚ¶Á/дµÄ±êÖ¾¡£
ÓÉÓÚµ÷ÊԼĴæÆ÷ÎÞ·¨ÔÚRing3Ï·ÃÎÊ£¬Ó²¼þ¶ÏµãµÄ¼ì²âÐèÒªÖ´ÐÐһС¶Î´úÂë¡£¿ÉÒÔÀûÓú¬Óе÷ÊԼĴæÆ÷ÖµµÄCONTEXT½á¹¹£¬¸Ã½á¹¹¿ÉÒÔͨ¹ý´«µÝ¸øÒì³£´¦ÀíÀý³ÌµÄContextRecord²ÎÊýÀ´·ÃÎÊ¡£
//******************************************************** static bool isDebuggedHBP=0;
LONG WINAPI TopUnhandledExceptionFilterHBP( struct _EXCEPTION_POINTERS *ExceptionInfo ) { _asm pushad AfxMessageBox(\»Øµ÷º¯Êý±»µ÷ÓÃ\ ExceptionInfo->ContextRecord->Eip=NewEip; if(0!=ExceptionInfo->ContextRecord->Dr0||0!=ExceptionInfo->ContextRecord->Dr1|| 0!=ExceptionInfo->ContextRecord->Dr2||0!=ExceptionInfo->ContextRecord->Dr3) isDebuggedHBP=1; //¼ì²âÓÐÎÞÓ²¼þ¶Ïµã ExceptionInfo->ContextRecord->Dr0=0; //½ûÓÃÓ²¼þ¶Ïµã£¬ÖÃ0 ExceptionInfo->ContextRecord->Dr1=0; ExceptionInfo->ContextRecord->Dr2=0; ExceptionInfo->ContextRecord->Dr3=0; ExceptionInfo->ContextRecord->Dr6=0; ExceptionInfo->ContextRecord->Dr7=0; ExceptionInfo->ContextRecord->Eip=NewEip; //×ªÒÆµ½°²È«Î»ÖÃ
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com _asm popad return EXCEPTION_CONTINUE_EXECUTION; }
void CDetectODDlg::OnHardwarebreakpoint() { // TODO: Add your control notification handler code here lpSetUnhandledExceptionFilter = (pSetUnhandledExceptionFilter)GetProcAddress(LoadLibrary((\ \ lpOldHandler=(DWORD)lpSetUnhandledExceptionFilter(TopUnhandledExceptionFilterHBP); _asm{ mov NewEip,offset safe //·½Ê½¶þ£¬¸ü¼òµ¥ int 3 mov isDebuggedHBP,1 //µ÷ÊÔʱ¿ÉÄÜÒ²²»»á´¥·¢Ò쳣ȥ¼ì²âÓ²¼þ¶Ïµã safe: } if(1==isDebuggedHBP){ AfxMessageBox(\·¢ÏÖOD\ }else{ AfxMessageBox(\ûÓÐOD\ } }
//********************************************************
16. PatchingDetection CodeChecksumCalculation²¹¶¡¼ì²â£¬´úÂë¼ìÑéºÍ
²¹¶¡¼ì²â¼¼ÊõÄÜʶ±ð¿ÇµÄ´úÂëÊÇ·ñ±»Ð޸ģ¬Ò²ÄÜʶ±ðÊÇ·ñÉèÖÃÁËÈí¼þ¶Ïµã¡£²¹¶¡¼ì²âÊÇͨ¹ý´úÂëУÑéÀ´ÊµÏֵģ¬Ð£Ñ鼯Ëã°üÀ¨´Ó¼òµ¥µ½¸´ÔÓµÄУÑéºÍ/¹þÏ£Ëã·¨¡£
ʵÀý£º¸Ä¶¯±»±£»¤´úÂëµÄ»°£¬CHECKSUMÐèÒªÐ޸ģ¬Í¨¹ýODµÈÕÒ³ö¸ÃÖµ ×¢Ò⣺ÔÚ±»±£»¤´úÂë¶ÎÏÂF2¶Ïµã»òÐÞ¸Ä×Ö½ÚÀ´²âÊÔ
/*********************************************************/ BOOL CheckSum() {
BOOL bFoundOD; bFoundOD=FALSE; DWORD CHECK_SUM=5555; //ÕýȷУÑéÖµ DWORD dwAddr; dwAddr=(DWORD)CheckSum; __asm { ;¼ì²â´úÂ뿪ʼ
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com mov esi,dwAddr mov ecx,100 xor eax,eax checksum_loop:
movzx ebx,byte ptr [esi] add eax,ebx rol eax,1 inc esi
loop checksum_loop
cmp eax,CHECK_SUM jz ODNotFound mov bFoundOD,1 ODNotFound: } return bFoundOD; }
void CDetectODDlg::OnChecksum() { // TODO: Add your control notification handler code here if(CheckSum()) { AfxMessageBox(\·¢ÏÖOD\ } else { AfxMessageBox(\ûÓÐOD\ } }
17. block input·âËø¼üÅÌ¡¢Êó±êÊäÈë
user32!BlockInput() API ×è¶Ï¼üÅ̺ÍÊó±êµÄÊäÈë¡£
µäÐ͵ij¡¾°¿ÉÄÜÊÇÄæÏò·ÖÎöÈËÔ±ÔÚGetProcAddress()ÄÚ϶ϣ¬È»ºóÔËÐÐÍѿǴúÂëÖ±µ½±»¶ÏÏ¡£µ«ÊÇÌø¹ýÒ»¶ÎÀ¬»ø´úÂëÖ®ºó¿Çµ÷ÓÃBlockInput()¡£µ±GetProcAddress()¶Ïµã¶ÏÏÂÀ´ºó£¬ÄæÏò·ÖÎöÈËÔ±»áͻȻÀ§»óµØ·¢ÏÖÎÞ·¨¿ØÖƵ÷ÊÔÆ÷ÁË£¬²»Öª¾¿¾¹·¢ÉúÁËʲô¡£ ʾÀý£ºÔ´Âë¿´¸½¼þ
BlockInput()²ÎÊýfBlockIt£¬true£¬¼üÅ̺ÍÊó±êʼþ±»×è¶Ï£»false£¬¼üÅ̺ÍÊó±êʼþ½â³ý×è¶Ï£º ; Block input push TRUE call [BlockInput]
;...Unpacking code...
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com ;Unblock input push FALSE call [BlockInput]
void CDetectODDlg::OnBlockInput() { // #include \ // TODO: Add your control notification handler code here CString str=\ÀûÓÃÎÒ¶¨Î»\ DWORD dwNoUse; DWORD dwNoUse2; ::BlockInput(TRUE); dwNoUse=2; dwNoUse2=3; dwNoUse=dwNoUse2; ::BlockInput(FALSE); } ¶Ô²ß
£¨1£©×î¼òµ¥µÄ·½·¨¾ÍÊDz¹¶¡ BlockInput()ʹËüÖ±½Ó·µ»Ø¡£ £¨2£©Í¬Ê±°´CTRL+ALT+DELETE¼üÊÖ¹¤½â³ý×è¶Ï¡£
18. EnableWindow½ûÓô°¿Ú
ÓëBlockInputÒìÇúͬ¹¤£¬Ò²ÊǽûÓô°¿ÚÈ»ºóÔÙ½â½û
ÔÚ×ÊÔ´¹ÜÀíÆ÷ÀïÖ±½ÓË«»÷ÔËÐеϰ£¬»áʹµ±Ç°µÄ×ÊÔ´¹ÜÀíÆ÷´°¿Ú±»½ûÓᣠÔÚODÀïÃæµÄ»°£¬¾Í»áʹOD´°¿Ú±»½ûÓᣠMFCÀï¶ÔODÃ²ËÆÎÞЧ void CDetectODDlg::OnEnableWindow() { // TODO: Add your control notification handler code here CString str=\ÀûÓÃÎÒ¶¨Î»\ CWnd *wnd; wnd=GetForegroundWindow(); wnd->EnableWindow(FALSE); DWORD dwNoUse; DWORD dwNoUse2; dwNoUse=2; dwNoUse2=3; dwNoUse=dwNoUse2; wnd->EnableWindow(TRUE); }t
19. ThreadHideFromDebugger
ntdll!NtSetInformationThread()ÓÃÀ´ÉèÖÃÒ»¸öÏ̵߳ÄÏà¹ØÐÅÏ¢¡£°ÑThreadInformationClass
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com ²ÎÊýÉèΪThreadHideFromDebugger(11H)¿ÉÒÔ½ûÖ¹Ï̲߳úÉúµ÷ÊÔʼþ¡£
ntdll!NtSetInformationThreadµÄ²ÎÊýÁбíÈçÏ¡£ThreadHandleͨ³£ÉèΪµ±Ç°Ï̵߳ľä±ú(0xFFFFFFFE)£º
NTSTATUS NTAPI NtSetInformationThread( IN HANDLE ThreadHandle,
IN THREAD_INFORMATION_CLASS ThreadInformaitonClass, IN PVOID ThreadInformation, IN ULONG ThreadInformationLength );
ThreadHideFromDebuggerÄÚ²¿ÉèÖÃÄں˽ṹETHREADµÄHideThreadFromDebugger³ÉÔ±¡£Ò»µ©Õâ¸ö³ÉÔ±ÉèÖÃÒÔºó£¬Ö÷ÒªÓÃÀ´Ïòµ÷ÊÔÆ÷·¢ËÍʼþµÄÄں˺¯Êý_DbgkpSendApiMessage()½«²»ÔÙ±»µ÷Óá£
invoke GetCurrentThread
invoke NtSetInformationThread,eax,11H,NULL,NULL
¶Ô²ß£º
£¨1£©ÔÚntdll!NtSetInformationThread()Àï϶ϣ¬¶ÏÏÂÀ´ºó£¬²Ù×ÝEIP·ÀÖ¹APIµ÷Óõ½´ïÄںˣ¨2£©Olly Advanced²å¼þÒ²Óв¹Õâ¸öAPIµÄÑ¡Ïî¡£²¹¹ýÖ®ºóÒ»µ©ThreadInformaitonClass²ÎÊýΪHideThreadFromDebugger£¬API½«²»ÔÙÉîÈëÄں˽ö½öÖ´ÐÐÒ»¸ö¼òµ¥µÄ·µ»Ø¡£ /*********************************************************/ typedef enum _THREADINFOCLASS { ThreadBasicInformation, // 0 Y N ThreadTimes, // 1 Y N ThreadPriority, // 2 N Y ThreadBasePriority, // 3 N Y ThreadAffinityMask, // 4 N Y
ThreadImpersonationToken, // 5 N Y ThreadDescriptorTableEntry, // 6 Y N
ThreadEnableAlignmentFaultFixup, // 7 N Y ThreadEventPair, // 8 N Y
ThreadQuerySetWin32StartAddress, // 9 Y Y ThreadZeroTlsCell, // 10 N Y
ThreadPerformanceCount, // 11 Y N ThreadAmILastThread, // 12 Y N ThreadIdealProcessor, // 13 N Y ThreadPriorityBoost, // 14 Y Y
ThreadSetTlsArrayAddress, // 15 N Y ThreadIsIoPending, // 16 Y N
ThreadHideFromDebugger // 17 N Y } THREAD_INFO_CLASS;
typedef NTSTATUS (NTAPI *ZwSetInformationThread)( IN HANDLE ThreadHandle, IN THREAD_INFO_CLASS ThreadInformaitonClass, IN PVOID ThreadInformation,
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com IN ULONG ThreadInformationLength );
void CDetectODDlg::OnZwSetInformationThread() { // TODO: Add your control notification handler code here CString str=\ÀûÓÃÎÒ¶¨Î»\ HANDLE hwnd; HMODULE hModule; hwnd=GetCurrentThread(); hModule=LoadLibrary(\ ZwSetInformationThread myFunc; myFunc=(ZwSetInformationThread)GetProcAddress(hModule,\ myFunc(hwnd,ThreadHideFromDebugger,NULL,NULL); }
/*********************************************************/
20. Disabling Breakpoints½ûÓÃÓ²¼þ¶Ïµã
;Ö´Ðйýºó£¬OD²é¿´Ó²¼þ¶Ïµã»¹´æÔÚ£¬µ«Êµ¼ÊÒѾ²»Æð×÷ÓÃÁË
;ÀûÓÃCONTEXT½á¹¹£¬¸Ã½á¹¹ÀûÓÃÒì³£´¦Àí»ñµÃ£¬Òì³£´¦ÀíÍêºó»á×Ô¶¯Ð´»Ø ¼û Hardware Breakpoints Detection
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com 21. OllyDbg:OutputDebugString() Format String Bug
OutputDebugStringº¯ÊýÓÃÓÚÏòµ÷ÊÔÆ÷·¢ËÍÒ»¸ö¸ñʽ»¯µÄ´®£¬Ollydbg»áÔÚµ×¶ËÏÔʾÏàÓ¦µÄÐÅÏ¢¡£OllyDbg´æÔÚ¸ñʽ»¯×Ö·û´®Òç³ö©¶´£¬·Ç³£ÑÏÖØ£¬ÇáÔò±ÀÀ££¬ÖØÔòÖ´ÐÐÈÎÒâ´úÂë¡£Õâ¸ö©¶´ÊÇÓÉÓÚOllydbg¶Ô´«µÝ¸økernel32!OutputDebugString()µÄ×Ö·û´®²ÎÊý¹ýÂ˲»Ñϵ¼Öµģ¬ËüÖ»¶Ô²ÎÊý½øÐÐÄǸö³¤¶È¼ì²é£¬Ö»½ÓÊÜ255¸ö×Ö½Ú£¬µ«Ã»¶Ô²ÎÊý½øÐмì²é£¬ËùÒÔµ¼Ö»º³åÇøÒç³ö¡£
ÀýÈ磺printfº¯Êý£º%d£¬µ±ËùÓвÎÊýѹջÍê±Ïºóµ÷ÓÃprintfº¯ÊýµÄʱºò£¬printf²¢²»Äܼì²â²ÎÊýµÄÕýÈ·ÐÔ£¬Ö»ÊÇ»úеµØ´ÓÕ»ÖÐȡֵ×÷Ϊ²ÎÊý£¬ÕâÑù¶ÑÕ»¾Í±»ÆÆ»µÁË£¬Õ»ÖÐÐÅϢй©¡£¡£
ʾÀý:ÏÂÃæÕâ¸ö¼òµ¥µÄʾÀý½«µ¼ÖÂOllyDbgÅ׳öÎ¥¹æ·ÃÎÊÒì³£»ò²»¿ÉÔ¤ÆÚµÄÖÕÖ¹¡£ szFormatStr db '%s%s',0
push offset szFormatStr call OutputDebugString
¶Ô²ß:²¹¶¡ kernel32!OutputDebugStringA()Èë¿Úʹֱ֮½Ó·µ»Ø void CDetectODDlg::OnOutputDebugString() { // TODO: Add your control notification handler code here ::OutputDebugString(\}
22. TLS Callbacks
ʹÓÃThread Local Storage (TLS)»Øµ÷º¯Êý¿ÉÒÔʵÏÖÔÚʵ¼ÊµÄÈë¿Úµã֮ǰִÐз´µ÷ÊԵĴúÂ룬ÕâÒ²ÊÇODÔØÈë³ÌÐò¾ÍÍ˳öµÄÔÒòËùÔÚ¡££¨Anti-OD£©
Ï̱߳¾µØ´æ´¢Æ÷¿ÉÒÔ½«Êý¾ÝÓëÖ´ÐеÄÌØ¶¨Ïß³ÌÁªÏµÆðÀ´£¬Ò»¸ö½ø³ÌÖеÄÿ¸öÏß³ÌÔÚ·ÃÎÊͬһ¸öÏֲ߳̾¿´æ´¢Ê±£¬·ÃÎʵ½µÄ¶¼ÊǶÀÁ¢µÄ°ó¶¨ÓÚ¸ÃÏ̵߳ÄÊý¾Ý¿é¡£¶¯Ì¬°ó¶¨£¨ÔËÐÐʱ£©Ïß³ÌÌØ¶¨Êý¾ÝÊÇͨ¹ý TLS API£¨TlsAlloc¡¢TlsGetValue¡¢TlsSetValue ºÍ TlsFree£©µÄ·½Ê½Ö§³ÖµÄ¡£³ýÁËÏÖÓÐµÄ API ʵÏÖ£¬Win32 ºÍ Visual C++ ±àÒëÆ÷ÏÖÔÚ»¹Ö§³Ö¾²Ì¬°ó¶¨£¨¼ÓÔØÊ±¼ä£©»ùÓÚÏ̵߳ÄÊý¾Ý¡£µ±Ê¹ÓÃ_declspec(thread)ÉùÃ÷µÄTLS±äÁ¿Ê±£¬±àÒëÆ÷°ÑËüÃÇ·ÅÈëÒ»¸ö½Ð.tlsµÄÇø¿éÀï¡£µ±Ó¦ÓóÌÐò¼ÓÔØµ½ÄÚ´æÊ±£¬ÏµÍ³Ñ°ÕÒ¿ÉÖ´ÐÐÎļþÖеÄ.tlsÇø¿é£¬²¢¶¯Ì¬µÄ·ÖÅäÒ»¸ö×ã¹»´óµÄÄÚ´æ¿é£¬ÒÔ±ã´æ·ÅTLS±äÁ¿¡£ÏµÍ³Ò²½«Ò»¸öÖ¸ÏòÒÑ·ÖÅäÄÚ´æµÄÖ¸Õë·Åµ½TLSÊý×éÀÕâ¸öÊý×éÓÉFS:[2CH]Ö¸Ïò¡£
Êý¾ÝĿ¼±íÖеÚ9Ë÷ÒýµÄIMAGE_DIRECTORY_ENTRY_TLSÌõÄ¿µÄVirtualAddressÖ¸ÏòTLSÊý¾Ý£¬Èç¹û·ÇÁ㣬ÕâÀïÊÇÒ»¸öIMAGE_TLS_DIRECTORY½á¹¹£¬ÈçÏ£º IMAGE_TLS_DIRECTORY32 STRUC
StartAddressOfRawData DWORD ? ; ÄÚ´æÆðʼµØÖ·£¬ÓÃÓÚ³õʼ»¯ÐÂÏ̵߳ÄTLS EndAddressOfRawData DWORD ? ; ÄÚ´æÖÕÖ¹µØÖ·
AddressOfIndex DWORD ? ; ÔËÐпâʹÓøÃË÷ÒýÀ´¶¨Î»Ïֲ߳̾¿Êý¾Ý AddressOfCallBacks DWORD ? ; PIMAGE_TLS_CALLBACKº¯ÊýÖ¸ÕëÊý×éµÄµØÖ· SizeOfZeroFill DWORD ? ; ÓÃ0Ìî³äTLS±äÁ¿ÇøÓòµÄ´óС Characteristics DWORD ? ; ±£Áô£¬Ä¿Ç°Îª0 IMAGE_TLS_DIRECTORY32 ENDS
AddressOfCallBacks ÊÇÏ߳̽¨Á¢ºÍÍ˳öʱµÄ»Øµ÷º¯Êý£¬°üÀ¨Ö÷Ïß³ÌºÍÆäËüÏ̡߳£µ±Ò»¸öÏ̴߳´½¨»òÏú»Ùʱ£¬ÔÚÁбíÖеÄÿһ¸öº¯Êý±»µ÷Óá£Ò»°ã³ÌÐòûÓлص÷º¯Êý£¬Õâ¸öÁбíÊǿյġ£TLSÊý¾Ý³õʼ»¯ºÍTLSдÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com »Øµ÷º¯Êýµ÷Óö¼ÔÚÈë¿Úµã֮ǰִÐУ¬Ò²¾ÍÊÇ˵TLSÊdzÌÐò×ʼÔËÐеĵط½¡£³ÌÐòÍ˳öʱ£¬TLS»Øµ÷º¯ÊýÔÙ±»Ö´ÐÐÒ»´Î¡£»Øµ÷º¯Êý£º
TLS_CALLBACK proto Dllhandle : LPVOID, Reason : DWORD, Reserved : LPVOID ²ÎÊýÈçÏÂ:
Dllhandle : Ϊģ¿éµÄ¾ä±ú Reason¿ÉÈ¡ÒÔÏÂÖµ:
DLL_PROCESS_ATTACH 1 : Æô¶¯Ò»¸öнø³Ì±»¼ÓÔØ DLL_THREAD_ATTACH 2 : Æô¶¯Ò»¸öÐÂÏ̱߳»¼ÓÔØ DLL_THREAD_DETACH 3 : ÖÕÖ¹Ò»¸öÐÂÏ̱߳»¼ÓÔØ DLL_PROCESS_DETACH 0 : ÖÕÖ¹Ò»¸öнø³Ì±»¼ÓÔØ Reserverd:ÓÃÓÚ±£Áô£¬ÉèÖÃΪ0
IMAGE_TLS_DIRECTORY½á¹¹ÖеĵØÖ·ÊÇÐéÄâµØÖ·£¬¶ø²»ÊÇRVA¡£ÕâÑù£¬Èç¹û¿ÉÖ´ÐÐÎļþ²»ÊÇ´Ó»ùµØÖ·×°È룬ÔòÕâЩµØÖ·»áͨ¹ý»ùÖ·ÖØ¶¨Î»ÐÞÕý¡£¶øÇÒIMAGE_TLS_DIRECTORY±¾Éí²»ÔÚ.TLSÇø¿éÖУ¬¶øÔÚ.rdataÀï¡£
TLS»Øµ÷¿ÉÒÔʹÓÃÖîÈçpedumpÖ®ÀàµÄPEÎļþ·ÖÎö¹¤¾ßÀ´Ê¶±ð¡£Èç¹û¿ÉÖ´ÐÐÎļþÖдæÔÚTLSÌõÄ¿£¬Êý¾ÝÌõÄ¿½«»áÏÔʾ³öÀ´¡£
Data directory EXPORT IMPORT ::: TLS ::: IAT
rva:00000000 rva:00000000 rva:00000000 rva:00000000
size:00000000 size:00000000 size:00000000 size:00000000
DELAY_IMPORT COM_DESCRPTR unused
rva:000610E0
size:00000018
rva:00000000 rva:00061000
size:00000000 size:000000E0
½Ó×ÅÏÔʾTLSÌõÄ¿µÄʵ¼ÊÄÚÈÝ¡£AddressOfCallBacks³ÉÔ±Ö¸ÏòÒ»¸öÒÔnull½áβµÄ»Øµ÷º¯ÊýÊý×é¡£ TLS directory£º StartAddressOfRawData: EndAddressOfRawData: AddressOfIndex: SizeOfZeroFill: Characteristics:
AddressOfCallBacks:
00000000 00000000
004610F8 004610FC
00000000 00000000
ÔÚÕâ¸öÀý×ÓÖУ¬RVA 0x4610fcÖ¸Ïò»Øµ÷º¯ÊýÖ¸Õ루0x490f43ºÍ0x44654e£©£º
ĬÈÏÇé¿öÏÂOllyDbgÔØÈë³ÌÐò½«»áÔÝÍ£ÔÚÈë¿Úµã£¬Ó¦¸ÃÅäÖÃÒ»ÏÂOllyDbgʹÆäÔÚTLS»Øµ÷±»µ÷ÓÃ֮ǰÖжÏÔÚʵ¼ÊµÄloader¡£
ͨ¹ý¡°Ñ¡Ïî->µ÷ÊÔÑ¡Ïî->ʼþ->µÚÒ»´ÎÖжÏÓÚ->ϵͳ¶Ïµã¡±À´ÉèÖÃÖжÏÓÚntdll.dllÄÚµÄʵ¼Êloader´úÂë¡£ÕâÑùÉèÖÃÒÔºó£¬OllyDbg½«»áÖжÏÔÚλÓÚÖ´ÐÐTLS»Øµ÷µÄntdll!LdrpRunInitializeRoutines()֮ǰµÄ
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com ntdll!_LdrpInitializeProcess()£¬Õâʱ¾Í¿ÉÒÔÔڻص÷Àý³ÌÖÐ϶ϲ¢¸ú×ÙÁË¡£ÀýÈ磬ÔÚÄÚ´æÓ³ÏñµÄ.text´úÂë¶ÎÉÏÉèÖÃÄÚ´æ·ÃÎʶϵ㣬¿ÉÒÔ¶ÏÔÚTLS»Øµ÷º¯Êý¡£
.386
.model flat,stdcall option casemap:none include windows.inc include user32.inc include kernel32.inc includelib user32.lib includelib kernel32.lib
.data?
dwTLS_Index dd ?
OPTION DOTNAME
;; ¶¨ÒåÒ»¸öTLS½Ú
.tls SEGMENT TLS_Start LABEL DWORD dd 0100h dup (\TLS_End LABEL DWORD .tls ENDS
OPTION NODOTNAME .data
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com TLS_CallBackStart dd TlsCallBack0 TLS_CallBackEnd dd 0
szTitle db \szInTls db \ÎÒÔÚTLSÀï\
szInNormal db \ÎÒÔÚÕý³£´úÂëÄÚ\
szClassName db \ ; OD ÀàÃû ;ÕâÀïÐèҪעÒâµÄÊÇ£¬±ØÐëÒª½«´Ë½á¹¹ÉùÃ÷ΪPUBLIC,ÓÃÓÚÈÃÁ¬½ÓÆ÷Á¬½Óµ½Ö¸¶¨µÄλÖ㬠;Æä´Î½á¹¹Ãû±ØÐëΪ_tls_uesdÕâÊÇ΢ÈíµÄÒ»¸ö¹æ¶¨¡£±àÒëÆ÷ÒýÈëµÄλÖÃÃû³ÆÒ²Èç´Ë¡£ PUBLIC _tls_used
_tls_used IMAGE_TLS_DIRECTORY
.code
;*************************************************************** ;; TLSµÄ»Øµ÷º¯Êý
TlsCallBack0 proc Dllhandle:LPVOID,dwReason:DWORD,lpvReserved:LPVOID mov eax,dwReason ;ÅжÏdwReason·¢ÉúµÄÌõ¼þ
cmp eax,DLL_PROCESS_ATTACH ; ÔÚ½øÐмÓÔØÊ±±»µ÷Óà jnz ExitTlsCallBack0
invoke FindWindow,addr szClassName,NULL ;ͨ¹ýÀàÃû½øÐмì²â .if eax ;ÕÒµ½
invoke SendMessage,eax,WM_CLOSE,NULL,NULL .endif
invoke MessageBox,NULL,addr szInTls,addr szTitle,MB_OK mov dword ptr[TLS_Start],0 xor eax,eax inc eax ExitTlsCallBack0: ret
TlsCallBack0 ENDP
;**************************************************************** Start:
invoke MessageBox,NULL,addr szInNormal,addr szTitle,MB_OK invoke ExitProcess, 1 end Start VC++ 6.0
VCÀïµÄTLS»Øµ÷£¬×ÜÊÇÓÐһЩÎÊÌ⣬»ù±¾ÈçÏ£º 1¡¢VC6²»Ö§³Ö¡£
2¡¢VS2005µÄDebug°æÕý³££¬Release°æ²»Õý³£¡£ 3¡¢VS2005µÄRelease°æÕý³££¬Debug°æ²»Õý³£¡£
VC6²»Ö§³ÖµÄÔÒòÊÇVC6´øµÄTLSSUP.OBJÓÐÎÊÌ⣬ËüÒѶ¨ÒåÁ˻ص÷±íµÄµÚÒ»Ï²¢ÇÒΪ0£¬0Òâζׯص÷±íµÄ½áÊø£¬Òò´ËÎÒÃǼӵĺ¯Êý¶¼²»»á±»µ÷Óá£[INDENT]¶ÔÓÚµÚ2¸öÎÊÌ⣬ÎÒûÓöµ½£¬µ¹ÊÇÓöµ½Á˵Ú3¸öÎÊÌâ¡£¶ÔÕâ¸öÎÊÌâ½øÐÐÁËÒ»ÏÂÑо¿£¬·¢ÏÖÎÊÌâËùÔÚ£ºÔÚLink¹ý³ÌÖнÚ.CRT$XLAºÍ.CRT$XLBºÏ²¢Ê±£¬Ó¦¸ÃÊǰ´×Öĸ˳ÐòÎÞ¼ä϶ºÏ²¢£¬µ«ÔÚDEBUG°æ
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com µÄÊä³öÖÐʵʲ¢·ÇÈç´Ë£¬Ë³Ðòû´í£¬µ«È´²úÉúÁ˺ܴóµÄ¼ä϶£¬¼ä϶Ìî0£¬Ï൱ÓÚÔÚÎÒÃǵĻص÷±íǰ¼Ó0Èô¸É¸ö0£¬ÓÖÊǻص÷±íÌáǰ½áÊø£¬ÕâÒ²ÐíÊÇBUG¡£Õë¶ÔµÚ¶þÖÖÇé¿ö£¬ÎÒûÓÐÓöµ½£¬²»ÖªµÀÊÇ·ñÊÇÕâ¸öÔÒò£¬Èç¹ûÊÇ£¬ÔòÎÒÏëÓ¦ÊÇLINKµÄBUG¡£
Õë¶ÔÉÏÊöÎÊÌ⣬±¾À´ÎÒÏë¿ÉÒÔʹÓÃVS2008µÄtlssup.obj£¬µ«ÊÇËüÓëVC6µÄ²»¼æÈÝ£¬¸ÄÆðÀ´±È½ÏÂé·³£¬ºóÀ´ÎÒͻȻÏëµ½£¬Ò²ÐíÎÒÃÇ¿ÉÒÔ×Ô¼º´´½¨Ò»¸ötlssup.obj£¬»ùÓÚÕâ¸ö˼·£¬Ð´ÁË×Ô¼ºµÄtlssup,Ŀǰ²âÊÔ½á¹ûÏÔʾ£¬Ëü¿ÉÒÔ¼æÈÝVC6£¬VS2005£¬VS2008¡£
£¨1£©½¨Á¢Ò»¸ö¿ØÖÆÌ¨¹¤³Ì
£¨2£©´´½¨tlssup.cÎļþ£¬´úÂëÈçÏ £¨3£©½«¸ÃÎļþ¼ÓÈ빤³Ì
£¨4£©Ó¢Îİ棺ÓÒ¼üµã»÷¸Ãtlssup.cÎļþ£¬Ñ¡ÔñSetting->C/C++->Gategory->Precomliled Headers->Not using precompiled headers¡£ÖÐÎİ棺ÓÒ¼üµã»÷¸Ãtlssup.cÎļþ->ÉèÖÃ->C/C++->Ô¤±àÒëµÄÍ·Îļþ->²»Ê¹ÓÃÔ¤²¹³¥Ò³Ã¼->È·¶¨ // tlssup.cÎļþ´úÂ룺 #include
#pragma data_seg(\int _tls_start=0;
#pragma data_seg(\int _tls_end=0;
#pragma data_seg(\int __xl_a=0;
#pragma data_seg(\int __xl_z=0;
#pragma data_seg(\
extern PIMAGE_TLS_CALLBACK my_tls_callbacktbl[]; IMAGE_TLS_DIRECTORY32
_tls_used={(DWORD)&_tls_start,(DWORD)&_tls_end,(DWORD)&_tls_index,(DWORD)my_tls_callbacktbl,0,0};
È»ºó£¬ÎÒÃÇÔÚÆäËüCPPÎļþÖж¨Òåmy_tls_callbacktblÈçϼ´¿É£º
extern \¿ÉÒÔÓжà¸ö»Øµ÷£¬µ«Ò»¶¨ÒªÔÚ×îºó¼ÓÒ»¸ö¿ÕÏ·ñÔòºÜ¿ÉÄܳö´í¡£ µ±È»ÏÂÃæÒ»ÐÐÒ²²»ÄÜÉÙ£º
#pragma comment(linker, \
// ¹¤³ÌcppÎļþ´úÂ룺
// TLS_CallBack_test.cpp : Defines the entry point for the console application. //
#include
//ÏÂÃæÕâÐиæËßÁ´½ÓÆ÷ÔÚPEÎļþÖÐÒª´´½¨TLSĿ¼ #pragma comment(linker, \
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com void NTAPI my_tls_callback1(PVOID h, DWORD reason, PVOID pv) {
//½öÔÚ½ø³Ì³õʼ»¯´´½¨Ö÷Ïß³ÌʱִÐеĴúÂë if( reason == DLL_PROCESS_ATTACH ){
MessageBox(NULL,\}
return; }
#pragma data_seg(\
extern \#pragma data_seg() int main(void) {
MessageBox(NULL,\return 0; }
MFCÀï
£¨1£©tlssup.cÎļþ ͬÑùÉèÖà £¨2£©´úÂë
#pragma comment(linker, \
/*ÕâÊÇPIMAGE_TLS_CALLBACK()º¯ÊýµÄÔÐÍ£¬ÆäÖеÚÒ»¸öºÍµÚÈý¸ö²ÎÊý±£Áô£¬µÚ¶þ¸ö²ÎÊý¾ö¶¨º¯ÊýÔÚÄÇÖÖÇé¿öÏÂ*/
void NTAPI my_tls_callback1(PVOID h, DWORD reason, PVOID pv) {
if( reason == DLL_PROCESS_ATTACH ){
MessageBox(NULL,\}
return; }
#pragma data_seg(\
extern \#pragma data_seg()
·´·´µ÷ÊÔ¼¼Êõ
±¾ÈËÍÑ¿ÇÄæÏòµÄˮƽ²»¸ß£¬ÕâÀï½ö˵һϱ¾È˵ÄÒ»µãÌå»á£º ¶ÔÓÚ³õѧÕßÀ´ËµÖ÷ÒªÊÇÀûÓÃStrongODµÈ¸÷ÖÖ²å¼þ£¬ÕâЩ²å¼þÄܹ»¶ã¹ýÉÏÃæËù˵µÄºÜ¶à¼ì²â¡£ÓÐÁËÒ»¶¨»ù´¡ÒÔºó¾Í¿ÉÒÔ¸ù¾Ý¸÷ÖÖ·´µ÷ÊÔ·½·¨µÄÈõµãѰÇó·´·´µ÷ÊÔµÄ;¾¶ÁË¡£
Ôø¾Ð´¹ýһƪ¹ØÓÚANTI-ODµÄÔÀíºÍÓ¦¶Ô·½·¨µÄÎÄÕ£¬Ò²¿ÉÒÔÓÃÓÚÔöÇ¿×Ô¼ºµÄOD£¬¸÷λ¿ÉÒÔ¿´Ò»Ï£º
OD±»AntiµÄÔÒò·ÖÎö¼°Ó¦¶ÔÖ®µÀ£º
http://www.ucooper.com/od-anti-reasons.html
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ
http://ucooper.com ¸÷ÖÖ·´µ÷ÊÔ¼¼ÊõÔÀíÓëʵÀý »ã±à°æ
http://www.ucooper.com/anti-debug-methods-asm.html
»¶ÓݰÁÙ±¾È˿ռ䣺http://ucooper.com
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦Óõȡ£
ʧÎóÖ®´¦£¬¾´ÇëÖ¸½Ì¡£
²Î¿¼ÎÄÏ×£º¡¶ÍѿǵÄÒÕÊõ¡·¡¢¡¶¼ÓÃÜÓë½âÃÜ¡·¡¢¿´Ñ©ÂÛ̳¡¢ÆäËü×ÊÁÏ
дÒ⻥ÁªÍø£¬¹Ø×¢ËÑË÷ÒýÇæ¼¼Êõ£¬ÉæÁÔËÑË÷ÒýÇæÓÅ»¯¡¢Èí¼þÆÆ½â¡¢PHPÍøÕ¾½¨Éè¡¢WordpressÓ¦ÓõÈ