欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创][开源]PEB相关AntiDebug及Od反AntiDebug

[原创][开源]PEB相关AntiDebug及Od反AntiDebug

推荐下上篇帖子
巧妙利用SEH异常链AntiDebug及Od反AntiDebug:
http://bbs.pediy.com/showthread.php?p=1403799#post1403799
准备了四篇帖子把

  • PEB相关...
  • NTQ相关...
  • 窗口相关...
  • 其它...

  • AntiDebug 及Od反AntiDebug简单的说说(举几个例子)。按照习惯我会在每篇开头放上一篇链接方便大家。然后我几乎每篇帖子风格几近相同 所以 看的多了 慢慢的会越来越轻松   怎么暴力干掉的方法大家自己去想吧 关键点红色高亮了 后面我就不说了
    工具:VS2012 OD
    BegingDebugged 标记位可以使用FS寄存器访问到 也可以使用API函数IsDebuggerPresent()检查
    如果值为1 则证明本进程处于被调试状态 
    
    bool PEB_BegingDebugged()
    
    {
    
      bool BegingDebugged=false;
    
      __asm{
    
        mov eax,DWORD ptr fs:[0x30];  //获取PEB地址
    
        mov al,BYTE ptr ds:[eax+0x02];  //获取PEB.begind.....
    
        mov BegingDebugged,al;
    
      }
    
      return BegingDebugged;
    
    }
    
    

    正常运行状态:

    被调试状态:

    OD反AntiDebug:
    拖入OD

    • 找MAIN函数:

    • 找关键跳[红色高亮]:

    
    CPU Disasm
    
    地址        十六进制数据            指令                                       注释
    
    00361440    55              PUSH EBP                                 ; INT BegingDebugged.wmain(void)
    
    00361441    8BEC            MOV EBP,ESP
    
    00361443    81EC C0000000   SUB ESP,0C0
    
    00361449    53              PUSH EBX
    
    0036144A    56              PUSH ESI
    
    0036144B    57              PUSH EDI
    
    0036144C    8DBD 40FFFFFF   LEA EDI,[EBP-0C0]
    
    00361452    B9 30000000     MOV ECX,30
    
    00361457    B8 CCCCCCCC     MOV EAX,CCCCCCCC
    
    0036145C    F3:AB           REP STOS DWORD PTR ES:[EDI]
    
    0036145E    E8 60FCFFFF     CALL 003610C3
    
    00361463    0FB6C0          MOVZX EAX,AL
    
    [B][COLOR="DarkRed"]00361466    85C0            TEST EAX,EAX
    
    00361468    74 1F           JE SHORT 00361489
    
    0036146A    8BF4            MOV ESI,ESP
    
    0036146C    6A 00           PUSH 0
    
    0036146E    68 58583600     PUSH OFFSET 00365858                     ; UNICODE "提示"
    
    00361473    68 60583600     PUSH OFFSET 00365860                     ; UNICODE "被调试"
    
    00361478    6A 00           PUSH 0
    
    0036147A    FF15 40933600   CALL DWORD PTR DS:[<&USER32.MessageBoxW>
    
    00361480    3BF4            CMP ESI,ESP
    
    00361482    E8 BEFCFFFF     CALL 00361145
    
    00361487    EB 1D           JMP SHORT 003614A6
    
    00361489    8BF4            MOV ESI,ESP
    
    0036148B    6A 00           PUSH 0
    
    0036148D    68 58583600     PUSH OFFSET 00365858                     ; UNICODE "提示"
    
    00361492    68 6C583600     PUSH OFFSET 0036586C                     ; UNICODE "正常运行"
    
    00361497    6A 00           PUSH 0
    
    00361499    FF15 40933600   CALL DWORD PTR DS:[<&USER32.MessageBoxW>
    
    0036149F    3BF4            CMP ESI,ESP
    
    003614A1    E8 9FFCFFFF     CALL 00361145
    
    003614A6    33C0            XOR EAX,EAX[/COLOR][/B]
    
    003614A8    5F              POP EDI
    
    003614A9    5E              POP ESI
    
    003614AA    5B              POP EBX
    
    003614AB    81C4 C0000000   ADD ESP,0C0
    
    003614B1    3BEC            CMP EBP,ESP
    
    003614B3    E8 8DFCFFFF     CALL 00361145
    
    003614B8    8BE5            MOV ESP,EBP
    
    003614BA    5D              POP EBP
    
    003614BB    C3              RETN
    
    

    ProcessHeap的Flags与ForceFlags在正常状况下应为2与0,处于调试状态时会发生改变 此方法在NT 5.X版本以上无效(我WIN10 无法测试)
    
    bool PEB_ProcessHeap()
    
    {
    
      int Flags=0;
    
      int ForceFlags=0;
    
      __asm
    
      {
    
        PUSHAD;        //PUSHAD指令压入32位寄存器
    
        MOV EAX,DWORD PTR FS:[0X30];    //获取PEB地址
    
        MOV EAX,DWORD PTR DS:[EAX+0X18];  //获取PEB.ProcessHeap
    
        MOV EBX,DWORD PTR DS:[EAX+0X0C];  //获取PEB.pro...p.Flags
    
        MOV ECX,DWORD PTR DS:[EAX+0X10];  //获取PEB.Pro...p.Forc...
    
        MOV Flags,EBX;
    
        MOV ForceFlags,ECX;
    
        POPAD;
    
      }
    
      return (Flags==2&&ForceFlags==0)?false:true;
    
    }
    
    

    正常运行状态:
    /
    被调试状态:
    /
    OD反AntiDebug:
    /

    • 找MAIN函数:

    • 找关键跳[红色高亮]:

    /
    NtGlobalFlag在当前进程处于调试状态时的值为0X70 我们可以通过此值判断是否被调试
    
    bool PEB_NtGlobalFlag()
    
    {
    
      int NtGlobalFlag=0;
    
      __asm
    
      {
    
        MOV EAX,DWORD PTR FS:[0X30];
    
        MOV EAX,DWORD PTR DS:[EAX+0X68];
    
        MOV NtGlobalFlag,EAX;
    
      }
    
      return NtGlobalFlag==0X70?true:false;
    
    }
    
    

    正常运行状态:

    被调试状态:

    OD反AntiDebug:
    /

    • 找MAIN函数:

    • 找关键跳[红色高亮]:
    • 
      CPU Disasm
      
      地址        十六进制数据            指令                                       注释
      
      011F1470    55              PUSH EBP                                 ; UNICODE "4"
      
      011F1471    8BEC            MOV EBP,ESP
      
      011F1473    81EC C0000000   SUB ESP,0C0
      
      011F1479    53              PUSH EBX
      
      011F147A    56              PUSH ESI
      
      011F147B    57              PUSH EDI
      
      011F147C    8DBD 40FFFFFF   LEA EDI,[EBP-0C0]
      
      011F1482    B9 30000000     MOV ECX,30
      
      011F1487    B8 CCCCCCCC     MOV EAX,CCCCCCCC
      
      011F148C    F3:AB           REP STOS DWORD PTR ES:[EDI]
      
      011F148E    E8 DAFCFFFF     CALL 011F116D
      
      011F1493    0FB6C0          MOVZX EAX,AL
      
      [COLOR="DarkRed"][B]011F1496    85C0            TEST EAX,EAX
      
      011F1498    74 1F           JE SHORT 011F14B9
      
      011F149A    8BF4            MOV ESI,ESP
      
      011F149C    6A 00           PUSH 0
      
      011F149E    68 58581F01     PUSH OFFSET 011F5858                     ; UNICODE "提示"
      
      011F14A3    68 60581F01     PUSH OFFSET 011F5860                     ; UNICODE "被调试"
      
      011F14A8    6A 00           PUSH 0
      
      011F14AA    FF15 40931F01   CALL DWORD PTR DS:[<&USER32.MessageBoxW>
      
      011F14B0    3BF4            CMP ESI,ESP
      
      011F14B2    E8 89FCFFFF     CALL 011F1140
      
      011F14B7    EB 1D           JMP SHORT 011F14D6
      
      011F14B9    8BF4            MOV ESI,ESP
      
      011F14BB    6A 00           PUSH 0
      
      011F14BD    68 58581F01     PUSH OFFSET 011F5858                     ; UNICODE "提示"
      
      011F14C2    68 6C581F01     PUSH OFFSET 011F586C                     ; UNICODE "正常运行"
      
      011F14C7    6A 00           PUSH 0
      
      011F14C9    FF15 40931F01   CALL DWORD PTR DS:[<&USER32.MessageBoxW>
      
      011F14CF    3BF4            CMP ESI,ESP
      
      011F14D1    E8 6AFCFFFF     CALL 011F1140
      
      011F14D6    33C0            XOR EAX,EAX[/B][/COLOR]
      
      011F14D8    5F              POP EDI
      
      011F14D9    5E              POP ESI
      
      011F14DA    5B              POP EBX
      
      011F14DB    81C4 C0000000   ADD ESP,0C0
      
      011F14E1    3BEC            CMP EBP,ESP
      
      011F14E3    E8 58FCFFFF     CALL 011F1140
      
      011F14E8    8BE5            MOV ESP,EBP
      
      011F14EA    5D              POP EBP
      
      011F14EB    C3              RETN
      
      

      完。
      -----------------
      源码:
      源码.rar

      上传的附件 1.png
      2.png
      3.png
      4.png
      5.png
      6.png
      源码.rar

    注意:上传附件及图片大小不得大于30M。

    ⚠️ 版权声明:
    本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
    未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

    0 0 0 举报
    复制成功