吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1634|回复: 4
收起左侧

[求助] 卸载dll遇到的崩溃问题

[复制链接]
as614001 发表于 2021-8-11 09:34
本帖最后由 as614001 于 2021-8-11 09:39 编辑

问题情况表现:
        当编辑框1内容发生变化后,弹窗关闭后(通信事件触发的),再卸载dll时候,会发生崩溃。如果不对编辑框1的内容填写,直接注入,直接卸载是没有问题的。

测试用 remotedll5.0卸载dll也是和上面问题发生的情况一样。
使用的是WM_COPYDATA通信。


dll中的
        
[C++] 纯文本查看 复制代码
LRESULT CALLBACK WndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{        //消息类型为 WM_COPYDATA 
        if (Message == WM_COPYDATA)
        {
                COPYDATASTRUCT* pCopyData = (COPYDATASTRUCT*)lParam;
                //接收通用消息结构体
                wchar_t* msg = (wchar_t*)pCopyData->lpData;//->是提取指针的成员
                switch (pCopyData->dwData)
                {
                case WM_sender1:
                        {
                                
                                //OutputDebugStringA((LPCSTR)msg);
                                //编辑框1发生改变事件后触发弹窗
                                MessageBox(NULL, msg, L"11111", 0);
                        }
                        break;
                default:
                        break;
                }
        }
        return DefWindowProc(hWnd, Message, wParam, lParam);
}


mfc中的卸载dll
[C++] 纯文本查看 复制代码
BOOL UnInjectDll() {
        //获取当前工作目录下的dll
        //由于dll自建窗口通信,这里先把它关掉。
        HWND hdlg = FindWindow(NULL, L"WeChatHook");
        if (hdlg)
        {
                DestroyWindow(hdlg);
                Sleep(200);
        }
        
        char szPath[MAX_PATH] = { 0 };
        char* buffer = NULL;
        if ((buffer = _getcwd(NULL, 0)) == NULL)
        {
                MessageBoxA(NULL, "获取当前工作目录失败", "错误", 0);
                return FALSE;
        }
        sprintf_s(szPath, "%s\\%s", buffer, DLLNAME);
        //获取微信Pid
        DWORD dwPid = ProcessNameFindPID(WECHAT_PROCESS_NAME);
        HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
        HANDLE hProcess = NULL;
        HANDLE hThread = NULL;
        MODULEENTRY32 me32 = { sizeof(MODULEENTRY32) };
        hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPid);
        //通过模块快照句柄获取第一个模块的信息
        if (!Module32First(hModuleSnap, &me32))
        {
                MessageBoxA(NULL, "获取第一个模块的信息失败", "错误", MB_OK);
                //获取失败则关闭句柄
                CloseHandle(hModuleSnap);
                return FALSE;
        }
        do
        {
                if (StrCmpW(me32.szModule, L"WeChatHook.dll") == 0)
                {

                        //SendMessage(hdlg, WM_CLOSE, 0, 0);
                        break;
                }

        } while (Module32Next(hModuleSnap, &me32));
        CloseHandle(hModuleSnap);
        hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
        LPTHREAD_START_ROUTINE  lpThreadFun = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleA("kernel32.dll"), "FreeLibrary");
        //LPTHREAD_START_ROUTINE lpThreadFun = (PTHREAD_START_ROUTINE)::GetProcAddress(::GetModuleHandle(_T("Kernel32")), "FreeLibrary");
        hThread = ::CreateRemoteThread(hProcess, NULL, 0, lpThreadFun, me32.modBaseAddr, 0, NULL);
        WaitForSingleObject(hThread, INFINITE);
        CloseHandle(hThread);
        CloseHandle(hProcess);
        return true;
}

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

wslans 发表于 2021-8-11 10:24
WndProc 里MessageBox去掉试试
 楼主| as614001 发表于 2021-8-11 10:48
wslans 发表于 2021-8-11 10:24
WndProc 里MessageBox去掉试试

去掉没问题,但是出现了问题总得琢磨一下
wslans 发表于 2021-8-11 10:50
回调中就不能执行这类操作,就像线程中去创建窗口一类的都不行

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
as614001 + 1 + 1 我很赞同!

查看全部评分

 楼主| as614001 发表于 2021-8-11 11:11
wslans 发表于 2021-8-11 10:50
回调中就不能执行这类操作,就像线程中去创建窗口一类的都不行

嗯 可否有具体的说明文档。感觉有点不理解。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 23:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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