qq_35069129 2021-04-01 07:16 采纳率: 0%
浏览 153

vs2019卸载dll导致被加载程序崩溃

下面是.dll里面的内容
DWORD WINAPI ShowMainDlg(LPVOID pParam)
{
    ::MessageBoxA(NULL,"模块加载成功","11",0);
    AssisMainDlg dlg;
    dlg.DoModal();
    return 0;
}

BOOL CAssistModelApp::InitInstance()
{
    CWinApp::InitInstance();
    ::CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ShowMainDlg, NULL, NULL,NULL);
    return TRUE;
}

int CAssistModelApp::ExitInstance()
{
    ::MessageBox(NULL, TEXT("模块卸载成功"), TEXT("22"), 0);
    return CWinApp::ExitInstance();
}

下面是加载程序,bo为false时,如果.dll里面没有AssisMainDlg dlg; dlg.DoModal();可以正常卸载dll,如果加上了这个界面,卸载时显示卸载成功,但是会导致被加载程序崩溃

void CInjectTestDlg::InjectAssist(DWORD pid,CString dllPath,bool bo)
{
    HANDLE hprocess = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
    LPVOID lpBaseAddress = VirtualAllocEx(hprocess, NULL, strlen(dllPath)+1, MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(hprocess, lpBaseAddress, dllPath, strlen(dllPath) + 1, NULL);
    HMODULE hmodue = GetModuleHandle("Kernel32.dll");
    if (bo)
    {
        LPTHREAD_START_ROUTINE lpStartAddress = (LPTHREAD_START_ROUTINE)GetProcAddress(hmodue, "LoadLibraryA");
        HANDLE hThread = CreateRemoteThread(hprocess, NULL, 0, lpStartAddress, lpBaseAddress, NULL, 0);
        WaitForSingleObject(hprocess, 2000);
        CloseHandle(hprocess);
        CloseHandle(hThread);
    }
    else
    {
        LPTHREAD_START_ROUTINE lpStartAddress = (LPTHREAD_START_ROUTINE)GetProcAddress(hmodue, "GetModuleHandleA");
        HANDLE hThread = CreateRemoteThread(hprocess, NULL, 0, lpStartAddress, lpBaseAddress, NULL, 0);
        WaitForSingleObject(hThread, INFINITE);
        DWORD dwRet = 0;
        GetExitCodeThread(hThread, &dwRet);
        //CloseHandle(hprocess);
        //CloseHandle(hThread);
        lpStartAddress = (LPTHREAD_START_ROUTINE)GetProcAddress(hmodue, "FreeLibraryAndExitThread");
        hThread = CreateRemoteThread(hprocess, NULL, 0, lpStartAddress, (LPVOID)dwRet, NULL, 0);
        WaitForSingleObject(hprocess, 2000);
        CloseHandle(hprocess);
        CloseHandle(hThread);
    }
}

  • 写回答

2条回答 默认 最新

  • CSDN专家-cpp_learner 2021-04-01 08:01
    关注

    据我所知,程序的运行本就以来dll,现在你把dll卸载了,崩溃应该是自然而然的事吧?

    我猜测,应该是你的dll里面有某些方法,或者是变量是主程序所依赖的,卸载后主程序没有找到相应函数或者变量,导致崩溃。

    评论

报告相同问题?

悬赏问题

  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型
  • ¥15 求学软件的前人们指明方向🥺
  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题