首页
社区
课程
招聘
[原创]重映射User32.dll调用MessageBox对话框
发表于: 2011-9-22 16:45 14386

[原创]重映射User32.dll调用MessageBox对话框

2011-9-22 16:45
14386

#include <windows.h>

DWORD ReGetProcAddress(HMODULE hModule, HMODULE hOldModule, LPCSTR lpProcName)
{
        DWORD MyApiAddr;
        DWORD ApiOffset;
        DWORD ReApiAddr;

       
        MyApiAddr = (DWORD)GetProcAddress(hOldModule, lpProcName);
        ApiOffset = MyApiAddr - (DWORD)hOldModule;
        ReApiAddr = (DWORD)hModule + ApiOffset;

        return (ReApiAddr);
}

HMODULE RemapLibrary(LPCSTR lpModuleName)
{
        HMODULE hMod;
        DWORD ImageSize;
        BYTE* Virtual;
        PIMAGE_DOS_HEADER DosHeader;
        PIMAGE_NT_HEADERS NtHeader;

        hMod = GetModuleHandleA(lpModuleName);
        if(!hMod)
        {
                return (0);
        }

        DosHeader = (PIMAGE_DOS_HEADER)hMod;
        NtHeader = (PIMAGE_NT_HEADERS)((DWORD)DosHeader + (DWORD)DosHeader->e_lfanew);
        ImageSize = (DWORD)NtHeader->OptionalHeader.SizeOfImage;
       
        Virtual = (BYTE*)VirtualAlloc(NULL, ImageSize, MEM_COMMIT, PAGE_READWRITE);
        if(!Virtual)
        {
                return (0);
        }

        VirtualLock(Virtual, ImageSize);

        memcpy(Virtual, (PBYTE)hMod, ImageSize);

        return ((HMODULE)Virtual);
}

typedef DWORD (WINAPI *MSGBOX)(HWND,LPSTR,LPSTR,UINT);

void main()
{
        HMODULE hOldMod, hNewMod;
        MSGBOX MyMessageBox;

        printf("开始动态加载User32.dll\n");

        hOldMod = LoadLibrary("user32.dll");

        printf("User32.dll加载成功!\n");

        printf("开始重新映射User32.dll\n");

        hNewMod = RemapLibrary("user32.dll");

        printf("User32.dll重新映射成功!\n按任意键继续...\n");

        getchar();

        printf("开始释放原User32.dll\n");

        FreeLibrary(hOldMod);

        printf("User32.dll释放成功!\n按任意键继续...\n");

        getchar();

        MyMessageBox = (MSGBOX)ReGetProcAddress(hNewMod, hOldMod, "MessageBoxA");
       
        MyMessageBox(NULL, "ReMapLibrary OK!", "Test", 0);

        printf("调用MessageBoxA成功!");

}:


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 6
支持
分享
最新回复 (23)
雪    币: 8753
活跃值: (5215)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
楼主,弱弱的问下,遇到重定位,还能这么处理吗?
2011-9-22 17:38
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
3
晕,这不和我那个基本一样吗?
2011-9-22 18:09
0
雪    币: 427
活跃值: (488)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
乾坤大挪移法。呵~
2011-9-22 18:43
0
雪    币: 5303
活跃值: (3694)
能力值: ( LV13,RANK:283 )
在线值:
发帖
回帖
粉丝
5
标记一下,多谢分享
2011-9-22 20:40
0
雪    币: 113
活跃值: (100)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
能不能给些use case啊,什么情况下需要这样?
2011-9-22 21:12
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
一个古老的经典方法
2011-9-22 21:35
0
雪    币: 768
活跃值: (530)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
8
mark,~
2011-9-22 21:39
0
雪    币: 89
活跃值: (53)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
他把整个 user32 都映射过来了。。

这个怎么会有防止断点的情况发生呢?不解。求高手解释。
在        MyMessageBox(NULL, "ReMapLibrary OK!", "Test", 0); 里面产生int 3断点
2011-9-22 22:08
0
雪    币: 304
活跃值: (507)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
模块链表中不会有user32.dll。调试器找不到导出函数。
2011-9-22 23:41
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
木马免杀不错…
2011-9-23 08:09
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
现在看来,LoadLibrary才是万能的断点啊。
2011-9-23 09:09
0
雪    币: 219
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
函数跟流程都那样好不。。。。
2011-9-23 09:30
0
雪    币: 219
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
你知道一个程序一开始要调用多少个动态链接库不,,,
2011-9-23 09:32
0
雪    币: 224
活跃值: (157)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
谢谢楼主分享!
2011-9-23 10:58
0
雪    币: 207
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
因为直接BP 下断..找不到MyMessageBox的地址``可以防止在OD中对MessageBox函数下段..就这样```
2011-9-23 12:25
0
雪    币: 278
活跃值: (709)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
17
直接复制原来地址处的二进制代码,直接全段内存搜索,搜索完毕后此处下断点,好多壳都这样做了
2011-9-23 13:39
0
雪    币: 474
活跃值: (96)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
做个标记,这个不错
2011-9-23 13:54
0
雪    币: 435
活跃值: (1277)
能力值: ( LV13,RANK:388 )
在线值:
发帖
回帖
粉丝
19
alloc页属性应该是PAGE_EXECUTE_READWRITE吧
2011-9-26 11:57
0
雪    币: 244
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
程序中的FreeLibrary(hOldMod)这句并没有真正的释放掉dll,稍微改动,你的程序马上挂掉:
while (FreeLibrary(hOldMod)) {}

还是重定位问题,你只重定位了入口点而已,dll中的其他地方呢?
2011-9-26 16:38
0
雪    币: 122
活跃值: (72)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
21
谢谢楼主分享。
2012-7-23 00:17
0
雪    币: 1149
活跃值: (888)
能力值: ( LV13,RANK:260 )
在线值:
发帖
回帖
粉丝
22
哎哟, 你把xx.dll 改个名字 直接Loader 哟.....写代码干嘛 呵呵
2012-7-23 01:01
0
雪    币: 20
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
重定位问题根本没解决,另外:

FreeLibrary(hOldMod);  这一句释放了user32
接着往下走到
MyMessageBox = (MSGBOX)ReGetProcAddress(hNewMod, hOldMod, "MessageBoxA");
里面调用了
MyApiAddr = (DWORD)GetProcAddress(hOldModule, lpProcName);
如果hOldModule被释放的话,这里GetProcAddress一定是返回0的,事实上user32.dll根本没被释放
2012-7-23 17:48
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
24
不给力,导入、导出、表定位表都没修复~
2012-7-23 19:18
0
游客
登录 | 注册 方可回帖
返回
//