¸÷ÖÖ·´µ÷ÊÔ¼¼ÊõÔ­ÀíÓëʵÀýVC°æ - ͼÎÄ ÏÂÔØ±¾ÎÄ

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;iNumberOfTypes;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 #include int _tls_index=0;

#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 #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Ó¦ÓõÈ