VC DLL远程进程注入
2013-12-02 11:02
411 查看
void CInjectProcessDlg::OnBtnInject()
{
// TODO: Add your control notification handler code here
HWND hWnd; //保存查找的窗口句柄
DWORD dwProcessID; //保存进程ID
HANDLE hProcess; //保存打开的进程句柄
char sDllPath[MAX_PATH] = "E:\\VCWork\\进程注入\\MfcDll\\Release\\MfcDll.dll"; //注入的DLL
LPVOID pRemoteDllPath; //开辟的远程内存的地址
DWORD dwLen;
HANDLE hThread;
DWORD dwThreadRet;
//判断要注入的进程的窗口是否存在 如果存在则根据窗口句柄获取进程ID
hWnd = ::FindWindow(NULL, "进程注入测试窗口");
if (!hWnd)
{
AfxMessageBox("没有找到要注入的进程的窗口!");
return;
}
::GetWindowThreadProcessId(hWnd, &dwProcessID);
//打开进程
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
if (!hProcess)
{
dwProcessID = GetLastError();
AfxMessageBox("打开进程失败");
return;
}
//在打开的进程中开辟一块内存区域
pRemoteDllPath = VirtualAllocEx(hProcess, NULL, sizeof(sDllPath), MEM_COMMIT, PAGE_READWRITE);
//将要注入的DLL的完整路径字符串写入到刚开辟的内存中(因为要在对方进程中读取这个字符串 所以必须把字符串写入到对方进程的地址空间)
WriteProcessMemory(hProcess, pRemoteDllPath, sDllPath, sizeof(sDllPath), &dwLen);
//创建远程线程
//第三个参数说明一下 GetModuleHandle取得Kernel32模块句柄 GetProcAddress取得Kenrnel32下的LoadLibraryA函数的地址 这两个函数是本地函数
//获取的是本地载入的模块及函数的地址 而这个地址是用在远程 是因为Kernel32的模块句柄和函数地址整个系统通用 除Kernel32和User32外 其它模块不能这样做
hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA"), pRemoteDllPath, 0, NULL);
WaitForSingleObject(hThread, INFINITE);
//获取线程的返回值 因为线程函数是LoadLibraryA 所以这儿的值就是LoadLibraryA的返回值 保存以备FreeLibrary使用
GetExitCodeThread(hThread, &dwThreadRet);
CloseHandle(hThread);
//释放先前在远程进程中开辟的内存
VirtualFreeEx(hProcess, pRemoteDllPath, sizeof(sDllPath), MEM_RELEASE);
//再创建个远程线程 本次远程线程的线程函数是FreeLibrary 以释放对自定义Dll的引用
hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle("Kernel32"), "FreeLibrary"), (void*)dwThreadRet, 0, NULL);
CloseHandle(hThread);
//关闭打开的进程句柄 至此结束
CloseHandle(hProcess);
AfxMessageBox("EXE中注入线程执行结束!");
}
代码一到百度空间上排版就乱套了。
注意一点,在MFC的DLL中要载入对话框资源以显示对话框的话要把类似这样的代码
CXXXDlg dlg;
dlg.DoModal();
放到App类的InitInstance成员函数中,而不要放到构造函数中。放到构造函数中不会显示对话框,可能是构造函数还没有载入一些必要的东西的缘故吧。
转自:http://hi.baidu.com/suruiqiang/item/7bcb0e2909b5aaccddf69a1b
相关文章推荐
- 远程注入DLL实现进程隐藏以及键盘记录器
- 利用HOOK技术实现DLL远程进程注入
- DLL的远程注入技术 - [Vc++]
- vc++进程注入钩子DLL通用模块开源
- 进程注入DLL实现(APC和远程线程创建)
- 将DLL挂接到远程进程之中(远程注入)
- 将DLL挂接到远程进程之中(远程注入)
- 将DLL挂接到远程进程之中(远程注入)
- vc++进程注入钩子DLL通用模块开源
- vc++进程注入钩子DLL通用模块
- VC++ 实现dll远程注入代码示例
- 将DLL挂接到远程进程之中(远程注入)
- ring3层面函数HOOK从头来之(一)——无dll远程进程代码注入
- 外挂或病毒注入DLL到宿主进程,然后远程启动线程方式
- VC2005调试: DLL调试, 远程调试;
- 揭开病毒的奥秘 DLL的远程注入技术详解
- DLL的远程注入技术详解
- [C++] - DLL远程注入实例
- DLL的远程注入及卸载技术详解
- DLL的远程注入技术