卸载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;
}
WndProc 里MessageBox去掉试试 wslans 发表于 2021-8-11 10:24
WndProc 里MessageBox去掉试试
去掉没问题,但是出现了问题总得琢磨一下 回调中就不能执行这类操作,就像线程中去创建窗口一类的都不行 wslans 发表于 2021-8-11 10:50
回调中就不能执行这类操作,就像线程中去创建窗口一类的都不行
嗯 可否有具体的说明文档。感觉有点不理解。
页:
[1]