龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 1144|回复: 0

NtQueryInformationProcess相关AntiDebug及Od反AntiDebug

[复制链接]

28

主题

3

回帖

38

积分

编程入门

Rank: 1

龙马币
73

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函数:
100231lc2s22ho30a96lc9.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. }
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表