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

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