| 该结构中最有趣的是InheritedFromUniqueProcessId字段。在这里,我们需要获取父进程的名称并将其与流行调试器的名称进行比较,以下是这种反调试检查的列表: std::wstring GetProcessNameById(DWORD pid) {     HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);     if (hProcessSnap == INVALID_HANDLE_VALUE)     {         return 0;     }     PROCESSENTRY32 pe32;     pe32.dwSize = sizeof(PROCESSENTRY32);     std::wstring processName = L"";     if (!Process32First(hProcessSnap, &pe32))     {         CloseHandle(hProcessSnap);         return processName;     }     do     {         if (pe32.th32ProcessID == pid)         {             processName = pe32.szExeFile;             break;         }     } while (Process32Next(hProcessSnap, &pe32));          CloseHandle(hProcessSnap);     return processName; } status = NtQueryInformationProcess(     GetCurrentProcess(),     ProcessBasicInformation,     &processBasicInformation,     sizeof(PROCESS_BASIC_INFORMATION),     NULL); std::wstring parentProcessName = GetProcessNameById((DWORD)processBasicInformation.InheritedFromUniqueProcessId); if (L"devenv.exe" == parentProcessName) {     std::cout << "Stop debugging program!" << std::endl;     exit(-1); } 
 如何避开NtQueryInformationProcess检查 避开是非常简单的, NtQueryInformationProcess函数返回的值应该更改为那些不指示调试器存在的值: 1.将ProcessDebugObjectHandle设置为0 2.将ProcessDebugFlags设置为1 3.对于ProcessBasicInformation,将InheritedFromUniqueProcessId值更改为另一个进程ID,例如, Explorer.exe的 断点 断点,调试器的功能之一,可以让程序中断在需要的地方,从而方便其分析。两种类型的断点: 1.软件断点 2.硬件断点 在没有断点的情况下很难进行逆向工程,所以目前流行的反逆向工程策略都是基于检测断点,然后提供一系列相应的反调试方法。 软件断点 在IA-32架构中,有一个特定的指令 – int 3h,带有0xCC操作码,用于调用调试句柄。当CPU执行该指令时,会产生中断并将控制传输到调试器。为了达到控制的目的,调试器必须将int 3h指令注入到代码中。要检测断点,我们可以计算函数的校验和。 DWORD CalcFuncCrc(PUCHAR funcBegin, PUCHAR funcEnd) {     DWORD crc = 0;     for (; funcBegin < funcEnd; ++funcBegin)     {         crc += *funcBegin;     }     return crc; } #pragma auto_inline(off) VOID DebuggeeFunction() {     int calc = 0;     calc += 2;     calc <<= 8;     calc -= 3; } VOID DebuggeeFunctionEnd() { }; #pragma auto_inline(on) DWORD g_origCrc = 0x2bd0; int main() {     DWORD crc = CalcFuncCrc((PUCHAR)DebuggeeFunction, (PUCHAR)DebuggeeFunctionEnd);     if (g_origCrc != crc)     {         std::cout << "Stop debugging program!" << std::endl;         exit(-1);     }     return 0; } 
 (编辑:广西网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |