|
刚看完 【实用C++】零基础入门教程 (5) C/C++ Windows 程序设计 (8) 这两门课程。
就想写个东西练练手。就写了个远线程注入/卸载 DLL工具。当我写到卸载的时候。参照网上资料,写出来后,卸载DLL 导致目标程序崩溃。
百度了一下,也没找到解决办法。所以发帖请教。 我这代码到底哪里出错了。 我也网上下载了别人的注入器,卸载时也是崩溃。 但是我使用PCH工具卸载,同进程同DLL 的时候。就不会崩溃。
代码里的变量,传参,经过测试,都是正确的。网上查资料说什么结束线程之类的。应该怎么弄,请教大神解答。
HANDLE 进程句柄 = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 全局变量_进程PID);
if (!进程句柄)
{
日志编辑框加入文本(_T("进程句柄获取失败:0\r\n"));
return;
}
int 名称长度 = (_tcslen(全局变量_DLL路径) + 1) * sizeof(TCHAR);
void* 内存首地址 = (CHAR*)VirtualAllocEx(进程句柄, NULL, 名称长度, MEM_COMMIT, PAGE_READWRITE);//申请内存
if (!内存首地址 || !WriteProcessMemory(进程句柄, 内存首地址, 全局变量_DLL路径, 名称长度, NULL))
{
日志编辑框加入文本(_T("申请内存地址失败:0\r\n"));
return;
}
else
{
CString 转换;
转换.Format(_T("%X"), 内存首地址);//int 转 大写 十六进制 Cstring 输出字符转换图片里资料
日志编辑框加入文本(_T("成功→ 申请十六进制内存地址:") + 转换 + _T("\r\n"));
}
//PTHREAD_START_ROUTINE 函数地址 = (PTHREAD_START_ROUTINE)GetModuleHandleA;
PTHREAD_START_ROUTINE 函数地址 = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(_T("Kernel32")), "GetModuleHandleA");
HANDLE 线程句柄 = CreateRemoteThread(进程句柄, 0, 0, 函数地址, 内存首地址, 0, NULL);//创建远程线程
WaitForSingleObject(线程句柄, INFINITE);//等待线程结束
// 获得GetModuleHandle的返回值
DWORD 线程返回值;
GetExitCodeThread(线程句柄, &线程返回值);
CloseHandle(线程句柄);
函数地址 = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(_T("Kernel32")), "FreeLibrary");
线程句柄 = CreateRemoteThread(进程句柄, 0, 0, 函数地址, (LPVOID)线程返回值, 0,NULL);//创建远程线程
if (!线程句柄)
{
日志编辑框加入文本(_T("创建线程失败:0\r\n"));
return;
}
else
{
CString 转换;
转换.Format(_T("%d"), 线程句柄);//int 转 Cstring
日志编辑框加入文本(_T("成功→ 创建线程句柄:") + 转换 + _T("\r\n"));
}
日志编辑框加入文本(_T("→ 等待远程线程终止... ←\r\n"));
WaitForSingleObject(线程句柄, INFINITE);//等待线程结束
VirtualFreeEx(进程句柄, 内存首地址, 名称长度, MEM_COMMIT);
日志编辑框加入文本(_T("→ 成功将DLL从进程中卸载 ←\r\n"));
日志编辑框加入文本(_T("→→→→→→→→→→→→→→→→→ 本次卸载结束 ←←←←←←←←←←←←←←←←\r\n"));
CloseHandle(线程句柄);//关闭线程句柄
CloseHandle(进程句柄);//关闭线程句柄 |
上一篇: 大佬们!为啥 生成解决方案的键突然变灰了!下一篇: 结构体数组的指针
|