首页
论坛
课程
招聘
[调试逆向] [原创]重映射User32.dll调用MessageBox对话框
2011-9-22 16:45 12450

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

2011-9-22 16:45
12450
#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成功!");

}:

[注意] 招人!base上海,课程运营、市场多个坑位等你投递!

收藏
点赞0
打赏
分享
最新回复 (23)
雪    币: 3236
活跃值: 活跃值 (833)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
sunsjw 活跃值 1 2011-9-22 17:38
2
0
楼主,弱弱的问下,遇到重定位,还能这么处理吗?
雪    币: 49
活跃值: 活跃值 (16)
能力值: ( LV15,RANK:520 )
在线值:
发帖
回帖
粉丝
邓韬 活跃值 9 2011-9-22 18:09
3
0
晕,这不和我那个基本一样吗?
雪    币: 427
活跃值: 活跃值 (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
cshcmq 活跃值 2011-9-22 18:43
4
0
乾坤大挪移法。呵~
雪    币: 3687
活跃值: 活跃值 (393)
能力值: ( LV13,RANK:278 )
在线值:
发帖
回帖
粉丝
littlewisp 活跃值 2 2011-9-22 20:40
5
0
标记一下,多谢分享
雪    币: 78
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
ronging 活跃值 2011-9-22 21:12
6
0
能不能给些use case啊,什么情况下需要这样?
雪    币: 182
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
justlovemm 活跃值 2011-9-22 21:35
7
0
一个古老的经典方法
雪    币: 672
活跃值: 活跃值 (100)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
FishSeeWater 活跃值 11 2011-9-22 21:39
8
0
mark,~
雪    币: 91
活跃值: 活跃值 (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
swlilike 活跃值 2011-9-22 22:08
9
0
他把整个 user32 都映射过来了。。

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

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

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