ytn2001 发表于 2023-8-30 20:23:12

NtQueryInformationProcess相关AntiDebug及Od反AntiDebug


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

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

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

OD反AntiDebug:
拖入OD
找MAIN函数:


找关键跳[红色高亮]:
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,
00E414F2    B9 30000000   MOV ECX,30
00E414F7    B8 CCCCCCCC   MOV EAX,CCCCCCCC
00E414FC    F3:AB         REP STOS DWORD PTR ES:
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
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
bool NQIP_ProcessDebugObjectHandle()
{
HANDLE hProcessDebugObjectHandle=0;
NtQueryInformationProcess(GetCurrentProcess(),      //目标(当前)进程句柄
            (PROCESSINFOCLASS)0x1e,      //查询信息类型
            &hProcessDebugObjectHandle,      //输出查询信息
            sizeof(hProcessDebugObjectHandle),//查询类型大小
            NULL);                //实际返回大小
return hProcessDebugObjectHandle?false:true;
}


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


更新一个:

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

bool NQIP_CheckParentProcess()
{
    struct PROCESS_BASIC_INFORMATION
    {
      ULONG ExitStatus;               //进程返回码
      PPEB PebbaseAddress;            //PEB地址
      ULONG AffinityMask;             //CPU亲和性掩码
      LONG BasePriority;            //基本优先级
      ULONG UniqueProcessId;          //本进程PID
      ULONG InheritedFromUniqueProcessId;//父进程PID
    }stcProcInfo;
    NtQueryInformationProcess(GetCurrentProcess(),
                              ProcessBasicInformation,
                              &stcProcInfo,
                              sizeof(stcProcInfo),
                              NULL);
    DWORD ExplorerPID=0;
    DWORD CurrentPID=stcProcInfo.InheritedFromUniqueProcessId;
    GetWindowThreadProcessId(FindWindow(L"Progman",NULL),&ExplorerPID);
    return ExplorerPID==CurrentPID?false:true;
}
页: [1]
查看完整版本: NtQueryInformationProcess相关AntiDebug及Od反AntiDebug