VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 871|回复: 4

远程卸载DLL 导致目标程序崩溃问题。

[复制链接]
75_avatar_middle
最佳答案
0 
在线会员 发表于 2021-9-2 22:59:38 | 显示全部楼层 |阅读模式
刚看完 【实用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(进程句柄);//关闭线程句柄




上一篇:大佬们!为啥 生成解决方案的键突然变灰了!
下一篇:结构体数组的指针
04_avatar_middle
最佳答案
22 
online_vip 发表于 2021-9-3 18:39:08 | 显示全部楼层
远程注入的DLL基址必须是目标进程中的基址,而不是本进程中的基址,然后才能调用Freelibray,
75_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-9-6 13:56:58 | 显示全部楼层
xiao14116 发表于 2021-9-3 18:39
远程注入的DLL基址必须是目标进程中的基址,而不是本进程中的基址,然后才能调用Freelibray,

DLL 基址是没错的。我取得也是目标基址。
31_avatar_middle
最佳答案
62 
在线会员 发表于 2021-9-6 18:39:38 | 显示全部楼层
视频 https://streamja.com/050gj
文件 https://lanzoui.com/iRV67tol4jc
拿去玩玩,只有文件,文件还是在虚拟机里翻到的,没有源码,不知道放哪了!
75_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2021-9-10 18:05:30 | 显示全部楼层
cpp2019 发表于 2021-9-6 18:39
视频 https://streamja.com/050gj
文件 https://lanzoui.com/iRV67tol4jc
拿去玩玩,只有文件,文件还是 ...

文件没用。我基本功能都已经写完了。就是卸载的时候崩溃。没解决。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-9-28 12:02

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表