明白了!
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;
}
可能会做一些调整,但这是它的基本问题。
你必须编写一个调试器才能使用DLL加载通知。这是[比听起来容易](http://msdn.microsoft.com/en-us/library/windows/desktop/ms679288%28v=vs.85%29.aspx)。 – 2014-09-05 23:52:38
我宁可不使用调试。我不希望进程知道它正在被调试。有另一种方法吗? – Alex 2014-09-06 00:11:50
这非常荒谬。 – 2014-09-06 00:19:45