等待程序加载DLL然后暂停它

时间:2014-09-05 23:40:32

标签: windows api dll load hook

我想在程序加载时挂钩api。为此,我使用createprocess并设置了适当的标志,以便创建进程被挂起。我放钩,然后我恢复它。但是当我尝试挂钩一个不是来自ntdll.DLL的api时,我得到一个ERROR_INVALID_ADDRESS(487)。如果我等到程序开始挂钩,我就可以顺利完成。

这导致我相信该进程在启动时不加载每个DLL(即使它们是静态链接的),并且在iat上对应于api的内存区域之前有一些初始化要完成想挂钩,有效并准备好被访问。

我在这儿吗?如果是这样,我该怎么做才能知道何时放置钩子?

谢谢!

PD:我正在研究未来论文的概念证明。这纯粹是出于教育目的。

PD2:我迷上了入口点并且效果很好但现在我有另一个难题:我需要一种标准化的方式来了解加载过程的入口点。

1 个答案:

答案 0 :(得分:2)

搞定了!!

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;
}

可能会有一些调整,但这是它的基本要点。