首页
社区
课程
招聘
[求助] 重定向DLL加载的地址.
发表于: 2008-3-18 16:54 8815

[求助] 重定向DLL加载的地址.

2008-3-18 16:54
8815
调用LoadLibrary("test.dll")时,它首先会打开文件,然后会用NtMapViewOfSection把文件映射到一块内存中
此时,我Hook这个API,使其实行过程如下:
1)调用真正的NtMapViewOfSection的函数,这样它的参数BaseAddress和ViewSize会存放着
这次Map的地址和大小.
2)判断本次是否加载test.dll,是则执行以下两步操作,否则直接返回
3)接着我的Hook开始工作,利用VirtualAlloc分配一块内存地址pMyAddr,然后把BaseAddress指向的内容拷贝到我分配的地址中.
4)*BaseAddress = pMyAddr
调用LoadLibrary后,原本以为返回的module应该指向pMyAddr,可是返回的确是0
,也就是调用失败了.把最后一句)*BaseAddress = pMyAddr去掉,LoadLibrary正常执行.

请问各位大侠,windows的LoadLibrary如果要重定向返回结果,要如何做?
谢谢.

本人操作系统为XP SP2, VC 6.0

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
2
好像  一块三毛钱 DX贴过这类代码.
2008-3-19 01:28
0
雪    币: 203
活跃值: (224)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你说的是不是这个帖子:
调试 DLL 时加载到不同地址的小技巧
他跟我的目的有点不同,一块三毛钱写的是在调试的时候如何更改加载基址,但本身加载的内容不变.
我的目的可能前面没有讲的太清楚,我是想拦截loadlibrary,发现在NtMapViewOfSection拦截比较方便,当用户调用loadlibrary("test.dll"),我把它拦截住后,新开一块内存,拷贝test.dll的内容,然后再修改.最后让loadlibrary返回我新分配的那块内存地址.

这样可以实现对test.dll本身进行加密,然后加载过程中拦截,解密.
2008-3-19 09:03
0
雪    币: 2411
活跃值: (1412)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
也就是說,在你的第一步 Hook NtMapViewOfSection 時就已經不成功了吧?
檢查一下。
2008-3-19 10:22
0
雪    币: 203
活跃值: (224)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我跟了一下,发现前面都成功的.
是在NtMapViewOfSection之后,去调用test.dll里面的入口函数时,会
调用一些其它函数.如果是相对地址调用那是没有问题的,
但好像有一些绝对地址的调用.
看到有一个调用:
1100110D FF 15 BC 51 03 10    call        dword ptr [__imp__GetVersion@0 (100351bc)]
结果就crash了.

dll原本加载地址是0x10000000
我把它改了0x11000000
这种绝对地址的调用就挂了.

除了手动更改这些code bytes(好像也不太现实),有没有其它方法.
2008-3-19 12:21
0
游客
登录 | 注册 方可回帖
返回
//