我想在程序加载后立即 Hook api。为此,我使用 createprocess 并设置了适当的标志,以便进程创建为挂起。我放置钩子(Hook),然后恢复它。但是,当我尝试 Hook 不是来自 ntdll.DLL 的 api 时,我收到 ERROR_INVALID_ADDRESS (487)。如果我等到程序开始放置钩子(Hook),我就可以毫不费力地完成它。
这让我相信进程在启动时不会加载每个 DLL(即使它们是静态链接的),并且在 IAT 上与 api 对应的内存区域之前需要完成一些初始化想要 Hook ,有效并准备好访问。
我在吗?如果是这样,我该怎么做才能知道何时放置 Hook ?
谢谢!
PD:我正在为我 future 的论文进行概念验证。这纯粹是为了教育目的。
PD2:我挂接了入口点并且效果很好,但现在我遇到了另一个难题:我需要一种标准化的方法来了解加载进程的入口点。
最佳答案
明白了!!
int main()
{
STARTUPINFO sInfo;
PROCESS_INFORMATION pInfo;
ZeroMemory(&sInfo, sizeof(STARTUPINFO));
ZeroMemory(&pInfo, sizeof(PROCESS_INFORMATION));
CreateProcess("c:\\windows\\notepad.exe", nullptr, nullptr, nullptr, false, CREATE_SUSPENDED, nullptr, nullptr, &sInfo, &pInfo);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, pInfo.dwProcessId);
PROCESS_BASIC_INFORMATION pbaseInfo;
ZeroMemory(&pbaseInfo, sizeof(PROCESS_BASIC_INFORMATION));
DWORD dwRet = 0;
ZwQueryInformationProcess = (DWORD (__stdcall *)(HANDLE, PROCESSINFOCLASS, PVOID, ULONG, PULONG))GetProcAddress(GetModuleHandleA("ntdll"),"ZwQueryInformationProcess");
ZwQueryInformationProcess(hProcess, 0, &pbaseInfo, sizeof(PROCESS_BASIC_INFORMATION), &dwRet);
SIZE_T imageBase = 0;
SIZE_T dwret1;
ReadProcessMemory(hProcess, (BYTE*) pbaseInfo.PebBaseAddress + 8, &imageBase, 4, &dwret1);
BYTE *buffer = new BYTE[sizeof(IMAGE_DOS_HEADER) + sizeof(IMAGE_NT_HEADERS32)];
ZeroMemory(buffer, sizeof(IMAGE_DOS_HEADER) + sizeof(IMAGE_NT_HEADERS32));
DWORD dwRead = 0;
ReadProcessMemory(hProcess, (void*) imageBase, buffer, sizeof(IMAGE_DOS_HEADER) + sizeof(IMAGE_NT_HEADERS32), &dwRead);
PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER) buffer;
PIMAGE_NT_HEADERS32 ntHeader = (PIMAGE_NT_HEADERS32) (buffer + dosHeader->e_lfanew);
cout << (hex) << ntHeader->OptionalHeader.AddressOfEntryPoint + imageBase << endl;
TerminateProcess(hProcess, 0);
return 0;
}
可能需要进行一些调整,但这就是基本要点。
关于windows - 等待程序加载 DLL,然后挂起它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25695373/