首页
社区
课程
招聘
关于 DLL DIY 过程中绝对地址与相对地址的问题!?
发表于: 2011-4-10 11:10 3814

关于 DLL DIY 过程中绝对地址与相对地址的问题!?

2011-4-10 11:10
3814
最近在学习 DLL DIY,发现一个问题,不知如何解决,请各位帅哥美女帮忙看看!

我的需求是:
在 DLL 文件中,手动添加一小段代码,代码会调用一个exe中的子程序,该子程序地址为“40002000”。

我的DIY步骤描述:
1. 使用OD打开一个DLL文件,OD会自动调用LOADDLL,并且将需要分析的DLL文件载入地址10000000;

2. 在DLL中,我找了一片空白区域,使用OD写了一小段汇编代码(CodeA),然后保存到原文件;

3. 假设CodeA的地址为10002000,我在10002100的地方“dd 40002000”,然后在CodeA中“Call [10002100]”。

4. 保存所有修改到文件。

问题:这个被我 DIY 过的 DLL 文件如果被载入其他地址,就无法正常工作了,比如在地址20000000载入,正常是10000000。

我分析后得知,当DLL的载入地址是20000000的时候,Call 指令后面的地址依旧是 [10002100],而此时这个地址指向的一个未知的值,因此调用不成功。

我想这主要是一个相对地址和绝对地址如果控制的问题!

请问各位有什么好办法么?

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

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 859
活跃值: (314)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
2
push        eax
mov        eax,hinstDLL
add        eax,2100h
call        dword ptr [eax]
pop        eax
2011-4-10 12:38
0
雪    币: 294
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢楼上的,但是我上哪里去找 hinstDLL 呢?

我不是直接用汇编写代码,然后编译连接,而是OD里DIY现有代码,这个是有不同的!
2011-4-10 16:25
0
雪    币: 859
活跃值: (314)
能力值: ( LV11,RANK:180 )
在线值:
发帖
回帖
粉丝
4
int DllMain(HINSTANCE hinstDll, DWORD dwReason,LPVOID lpResvered)

{
}
Dll 入口函数的第一个参数不就是吗

得看你的dll是怎么处理的~~
比如开头是~~
push ebp
mov ebp,esp
-----
那么 hinstDll == [ebp + 8 ]

那上面的那句就是
mov eax,dword ptr [ebp+8]  
咯~~

要是你根本没机会在入口执行~~
那么也可以这样:
CodeA:

OD-->二进制-->编辑 改为 E8 00 00 00 00  即 call 下一条指令
总体就是这样;
db E8 00 00 00 00
pop  eax
sub eax, XXX
add eax,10002100h
call dword ptr [eax]

;XXX是指CodeA 第一句指令即 db .... 的地址(以10000000为基址时)
2011-4-10 16:44
0
雪    币: 294
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢楼上,我似乎已经明白了...
2011-4-10 18:09
0
游客
登录 | 注册 方可回帖
返回
//