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