windows - 等待程序加载 DLL,然后挂起它

标签 windows api dll load hook

我想在程序加载后立即 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/

相关文章:

javascript - 窗口中的 HTML

用于 Windows 的 Objective-C

php - Laravel API token 不匹配异常

java - JUnit 和 Powermock : Native Library already loaded in another classloader

windows - hMailServer 只在第一次回复

C++ 如何检测 Windows 10

python - pytumblr 导入错误 : No module named pytumblr

api - Youtube Data API 通过 channel ID 获取订阅者列表

.net - `Exporting a function from a DLL` 是什么意思?

c++ - DLL +导出类+模板成员func =无法解析的外部符号。有机会解决吗?