#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
STARTUPINFO si = {0};
si.cb = sizeof(STARTUPINFO);
PROCESS_INFORMATION pi;
TCHAR cmdline[] = TEXT("C:\\Program Files\\Internet Explorer\\iexplore.exe");
//以挂起形式创建进程
BOOL status = CreateProcess(NULL, cmdline, NULL, NULL, FASLE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
if (status)
{
//获取创建进程的主线程 context
CONTEXT context = {0};
context.ContextFlags = CONTEXT_FULL;
GetThreadContext(pi.hThread, &context);
//获取程序入口点( ImageBase + OEP )
cout << "Entry Point(OA):" << hex << context.Eax << endl;
//从 PEB 中获取 ImageBase
CHAR* baseAddress = (CHAR*)(context.Ebx + 8);
CHAR buffer[8] = { 0 };
ReadProcessMemory(pi.hProcess, baseAddress, buffer, 4, NULL);
cout << "ImageBase:" << hex << buffer << endl;
//恢复进程(主线程)
ResumeThread(pi.hThread);
//关闭句柄
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
return 0;
}
如上,是以挂起的形式创建的进程,但就是获取不到相应的挂起主线程的 CONTEXT 结构数据,看了好多博客都是可以这样获取的呀,难道是我最近太衰了吗,连编译器都要与我为难一番,(′д` )…彡…彡
测试环境:WIN10 + VS2019
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.