as614001 发表于 2021-8-11 09:34

卸载dll遇到的崩溃问题

本帖最后由 as614001 于 2021-8-11 09:39 编辑

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

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


dll中的
      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
BOOL UnInjectDll() {
      //获取当前工作目录下的dll
      //由于dll自建窗口通信,这里先把它关掉。
      HWND hdlg = FindWindow(NULL, L"WeChatHook");
      if (hdlg)
      {
                DestroyWindow(hdlg);
                Sleep(200);
      }
      
      char szPath = { 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_ROUTINElpThreadFun = (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

回调中就不能执行这类操作,就像线程中去创建窗口一类的都不行

as614001 发表于 2021-8-11 11:11

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

嗯 可否有具体的说明文档。感觉有点不理解。
页: [1]
查看完整版本: 卸载dll遇到的崩溃问题