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