该结构中最有趣的是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;
- }
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|