看流星社区

 找回密码
 注册账号
查看: 2063|回复: 0

开源NTQ相关AntiDebug及Od反AntiDebug

[复制链接]

该用户从未签到

发表于 2018-3-1 09:57:26 | 显示全部楼层 |阅读模式
工具:VS2012 OD

NtQueryInformationProcess()是一个可以同时在R0及R3运行的函数,它的主要作用是查看进程相关的各种信息

根据想要查看信息类别不同,我们可以给其第二个参数ProcessInformationClass传的值也就不同,
根据ProcessInformationClass的类别可知,此函数可以查看60余种进程相关的信息

ProcessDebugPort可以获取目标进程的调试端口,如果目标进程未处于调试状态,此端口为0,否则为0xFFFFFFFF.
  1. bool NTAPI_processDebugPort( )
  2. {
  3.   int nDebugPort = 0;
  4.   NtQueryInformationProcess(GetCurrentProcess( ), // 目标进程句柄
  5.               ProcessDebugPort, // 查询的信息类型
  6.               &nDebugPort, // 输出查询信息
  7.               sizeof(nDebugPort), // 输出信息的变量的类型大小
  8.               NULL// 实际返回数据大小
  9.               );
  10.   return  nDebugPort == 0xffffffff ? 1 : 0;
  11. }
复制代码


OD反AntiDebug:
拖入OD
找MAIN函数:
607869_x3oclza55iu7c1h.png

找关键跳[红色高亮]:
CPU Disasm
地址        十六进制数据            指令                                       注释
00E414E0    55              PUSH EBP                                 ; UNICODE "匎G"
00E414E1    8BEC            MOV EBP,ESP
00E414E3    81EC C0000000   SUB ESP,0C0
00E414E9    53              PUSH EBX
00E414EA    56              PUSH ESI
00E414EB    57              PUSH EDI
00E414EC    8DBD 40FFFFFF   LEA EDI,[EBP-0C0]
00E414F2    B9 30000000     MOV ECX,30
00E414F7    B8 CCCCCCCC     MOV EAX,CCCCCCCC
00E414FC    F3:AB           REP STOS DWORD PTR ES:[EDI]
00E414FE    E8 4DFBFFFF     CALL 00E41050
00E41503    0FB6C0          MOVZX EAX,AL
00E41506    85C0            TEST EAX,EAX
00E41508    74 1F           JE SHORT 00E41529
00E4150A    8BF4            MOV ESI,ESP
00E4150C    6A 00           PUSH 0
00E4150E    68 5858E400     PUSH OFFSET 00E45858                     ; UNICODE "提示"
00E41513    68 6058E400     PUSH OFFSET 00E45860                     ; UNICODE "被调试"
00E41518    6A 00           PUSH 0
00E4151A    FF15 8C93E400   CALL DWORD PTR DS:[<&USER32.MessageBoxW>
00E41520    3BF4            CMP ESI,ESP
00E41522    E8 28FCFFFF     CALL 00E4114F
00E41527    EB 1D           JMP SHORT 00E41546
00E41529    8BF4            MOV ESI,ESP
00E4152B    6A 00           PUSH 0
00E4152D    68 5858E400     PUSH OFFSET 00E45858                     ; UNICODE "提示"
00E41532    68 6C58E400     PUSH OFFSET 00E4586C                     ; UNICODE "正常运行"
00E41537    6A 00           PUSH 0
00E41539    FF15 8C93E400   CALL DWORD PTR DS:[<&USER32.MessageBoxW>
00E4153F    3BF4            CMP ESI,ESP
00E41541    E8 09FCFFFF     CALL 00E4114F
00E41546    33C0            XOR EAX,EAX[/B][/COLOR]
00E41548    5F              POP EDI
00E41549    5E              POP ESI
00E4154A    5B              POP EBX
00E4154B    81C4 C0000000   ADD ESP,0C0
00E41551    3BEC            CMP EBP,ESP
00E41553    E8 F7FBFFFF     CALL 00E4114F
00E41558    8BE5            MOV ESP,EBP
00E4155A    5D              POP EBP
00E4155B    C3              RETN


ProcessDebugObjectHandle可以获取目标进程的调试对象的句柄,如果未处于调试状态则获取的值为NULL
  1. bool NQIP_ProcessDebugObjectHandle()
  2. {
  3.   HANDLE hProcessDebugObjectHandle=0;
  4.   NtQueryInformationProcess(GetCurrentProcess(),        //目标(当前)进程句柄
  5.               (PROCESSINFOCLASS)0x1e,        //查询信息类型
  6.               &hProcessDebugObjectHandle,      //输出查询信息
  7.               sizeof(hProcessDebugObjectHandle),  //查询类型大小
  8.               NULL);                //实际返回大小
  9.   return hProcessDebugObjectHandle?false:true;
  10. }
复制代码



ProcessDebugFlag可以获取目标进程的调试标记 如果处于调试状态其值为0 否为1
  1. bool NQIP_ProcessDebugFlag()
  2. {
  3.   BOOL bProcessDebugFlag=0;
  4.   NtQueryInformationProcess(GetCurrentProcess(),    //目标(当前)进程句柄
  5.               (PROCESSINFOCLASS)0x1f,    //查询信息类型
  6.               &bProcessDebugFlag,      //输出查询信息
  7.               sizeof(bProcessDebugFlag),  //查询类型大小
  8.               NULL);            //实际返回大小
  9.   return bProcessDebugFlag?false:true;
  10. }
复制代码



更新一个:

ProcessBasicInformation 可以获取指定进程的父进程PID 我们可以将其与ExPlorer.exe的PID进行对比
如果不匹配则证明此进程不是双击运行的

  1. bool NQIP_CheckParentProcess()
  2. {
  3.     struct PROCESS_BASIC_INFORMATION
  4.     {
  5.         ULONG ExitStatus;               //进程返回码
  6.         PPEB PebbaseAddress;            //PEB地址
  7.         ULONG AffinityMask;             //CPU亲和性掩码
  8.         LONG BasePriority;              //基本优先级
  9.         ULONG UniqueProcessId;          //本进程PID
  10.         ULONG InheritedFromUniqueProcessId;//父进程PID
  11.     }stcProcInfo;
  12.     NtQueryInformationProcess(GetCurrentProcess(),
  13.                                 ProcessBasicInformation,
  14.                                 &stcProcInfo,
  15.                                 sizeof(stcProcInfo),
  16.                                 NULL);
  17.     DWORD ExplorerPID=0;
  18.     DWORD CurrentPID=stcProcInfo.InheritedFromUniqueProcessId;
  19.     GetWindowThreadProcessId(FindWindow(L"Progman",NULL),&ExplorerPID);
  20.     return ExplorerPID==CurrentPID?false:true;
  21. }
复制代码

点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-26 23:43

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表