首页
社区
课程
招聘
[求助]CreateRemoteThread卸载DLL在DEBUG下可以,但Release下失败
发表于: 2009-9-4 11:17 6031

[求助]CreateRemoteThread卸载DLL在DEBUG下可以,但Release下失败

2009-9-4 11:17
6031
CreateRemoteThread卸载DLL在DEBUG下可以,但Release下失败,且无任何提示(我设置的失败应该有msg),怎么弄?
基本思路是打开目标进程,修改内存,写入代码,启动远程线程,虽然网上有更好的我我主要想弄清问题所在,请高手指导。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
struct MyData
{
    HMODULE inmodule; // 传入的模块地址
    DWORD dwFreeLibrary; // FreeLibrary的地址
};
//远程卸载函数
DWORD __stdcall RMTFunc(MyData *pData)
{
    typedef int(__stdcall*MFreeLibrary)(HMODULE);
    MFreeLibrary Mfremod = (MFreeLibrary)pData->dwFreeLibrary;
    Mfremod(pData->inmodule);
    return 0;
}
bool Killmod(LPCTSTR inCurprocId,LPCTSTR Modadre,bool ShowMsg)
{
 
    //远程注入CurprocId指定的进程,卸载Modadre地址处的DLL
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,_wtoi(inCurprocId));
    // ========= 代码结构 =============================
    MyData data;
    ZeroMemory(&data, sizeof (MyData));
    data.inmodule=(HMODULE)_wtol( Modadre);
    HINSTANCE hUser = LoadLibrary(L"kernel32.dll");
    if (! hUser)
    {
        if(ShowMsg) MessageBox(NULL,L"在载入kernel32模块时失败,请确认该DLL是\n否存在,卸载不能继续。",L"卸载失败",MB_ICONSTOP|MB_OK);
        return false;
    }
    data.dwFreeLibrary = (DWORD)GetProcAddress(hUser,(LPCSTR)"FreeLibrary");
    FreeLibrary(hUser);
    if (! data.dwFreeLibrary)
    {
        if(ShowMsg) MessageBox(NULL,L"获取系统卸载函数失败,请确认kernel32是否\n正常,卸载不能继续",L"卸载失败",MB_ICONSTOP|MB_OK);
        return false;
    }
    // ======= 分配空间备远程注入====================
    void *pRemoteThread=VirtualAllocEx(hProcess,0,1024*4, MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
    if (!pRemoteThread)
    {
        if(ShowMsg) MessageBox(NULL,L"目标进程内存修改失败,可能你没有此权限或\n安全软件不允许你这样做,卸载不能继续。",L"卸载失败",MB_ICONSTOP|MB_OK);
        return false;
    }
    if (!WriteProcessMemory(hProcess,pRemoteThread,&RMTFunc,1024*4,0))
    {
        if(ShowMsg) MessageBox(NULL,L"目标进程内存写入失败,可能你没有此权限或\n安全软件不允许你这样做,卸载不能继续。",L"卸载失败",MB_ICONSTOP|MB_OK);
        return false;
    }
    MyData *pData = (MyData*)VirtualAllocEx(hProcess,0,sizeof (MyData), MEM_COMMIT,PAGE_READWRITE);
    if (!pData)
    {
        if(ShowMsg) MessageBox(NULL,L"目标进程内存写入失败,可能你没有此权限或\n安全软件不允许你这样做,卸载不能继续。",L"卸载失败",MB_ICONSTOP|MB_OK);
        return false;
    }
    if (! WriteProcessMemory(hProcess, pData, &data, sizeof (MyData), 0))
    {
        if(ShowMsg) MessageBox(NULL,L"目标进程内存写入失败,可能你没有此权限或安\n全软件不允许你这样做,卸载不能继续。",L"卸载失败",MB_ICONSTOP|MB_OK);
        return false;
    }
    // =========== 启动远程线程==================
    HANDLE hThread =CreateRemoteThread(hProcess, 0,0, (LPTHREAD_START_ROUTINE)pRemoteThread,pData, 0, 0);
    if (! hThread)
    {
        if(ShowMsg) MessageBox(NULL,L"远程线程启动失败,可能你没有此权限或安\n全软件不允许你这样做,卸载不能继续。",L"卸载失败",MB_ICONSTOP|MB_OK);
        return false;
    }
    WaitForSingleObject(hThread,INFINITE);
    CloseHandle(hThread);
    VirtualFreeEx(hProcess, pRemoteThread, 1024*3, MEM_RELEASE);
    VirtualFreeEx(hProcess, pData, sizeof (MyData), MEM_RELEASE);
    CloseHandle(hProcess);
    return true;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费
支持
分享
最新回复 (4)
雪    币: 522
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
好复杂.
2009-9-4 11:35
0
雪    币: 251
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
没错误也不一定表示卸载成功
执行一次只能把 Dll 的引用计数减1,果Dll原来的引用计数大于1就不会被卸载
具体什么问题还是要Debug一下
实现的确太复杂了,同样的功能,只要把FreeLibrary作为线程入口,把HMOUDLE作为参数 建个远线程就够了
2009-9-4 12:06
0
雪    币: 137
活跃值: (12)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
还是谢谢,在Debug下是完全成功,所以不知道怎么调试。万一不行换个方式算了
2009-9-4 12:50
0
雪    币: 170
活跃值: (50)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
在编译的时候去掉增量链接。
2009-9-4 23:37
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册