首页
社区
课程
招聘
[求助]修改DLL后重定位问题
发表于: 2007-5-6 16:46 8326

[求助]修改DLL后重定位问题

2007-5-6 16:46
8326
我要修改DLL程序,为它增加功能。但在修改后,却发现增加的CALL,MOV [1000250],eax等,这些地址都是绝对引用,在主程序中打开时就发生变化。无法使用了。

01BEC8B2    A1 A0C80010     mov     eax, [1000C8A0]  应该是[01BEc8a0]
01BEC8B7    83F8 00         cmp     eax, 0
01BEC8BA    75 23           jnz     short 01BEC8DF
01BEC8BC    68 90C80010     push    1000C890
01BEC8C1    FF15 FCD00010   call    [1000D0FC]    应该是[01BED0FC] ; safemon.1000ABA0

这个问题该如何解决呢?
谢谢!

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

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 44229
活跃值: (19965)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
方法1.修改重定位表,增加对一些数据的重定位
方法2.用相对寻址方法来定位数据
01BEC8B2 call 00401DFB
01BEC8B7 pop ebp //ebp中就是1BEC8B7地址

形式可多样,如:
00401DF6 > E8 08000000 call 00401E03
00401DFB . 61 ascii "a"
00401DFC . 62 63 64 65 00 ascii "bcde",0
00401E01 0000 add byte ptr [eax], al
00401E03 5D pop ebp //执行完,ebp指向字符串"abcd"
2007-5-6 17:12
0
雪    币: 239
活跃值: (77)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
3
或,如果能得到当前DLL的代码段基址,得到这个的话,写成mov     eax, [base+c8A0]也应可以吧。
请问如何得到当前DLL代码段的基址呢?
谢谢!
2007-5-6 17:23
0
雪    币: 44229
活跃值: (19965)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
4
调用GetModuleHandle,传递NULL参数,则返回调用的可执行文件的基地址
2007-5-6 17:26
0
雪    币: 239
活跃值: (77)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
5
谢谢老大,
但还是不太明白,因为我自己不能加上call GetModuleHandle,因为这样调用的话,这一句也需要重定位啊。

还有如L00401DF6 > E8 08000000 call 00401E03    这个也需要重定位吧。
00401DFB . 61 ascii "a"
00401DFC . 62 63 64 65 00 ascii "bcde",0
00401E01 0000 add byte ptr [eax], al
00401E03 5D pop ebp //执行完,ebp指向字符串"abcd"
2007-5-6 17:35
0
雪    币: 44229
活跃值: (19965)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
6
这个401DF6 E8 08000000 call 00401E03不需要重定位。

你就按这个方法来:
01BEC8B2 call 01BEC8B7
01BEC8B7 pop ebp //ebp中就是1BEC8B7地址

1BEC8B7与01BEc8a0差值是0x17

mov eax, [01BEc8a0]用下面几句来表示:

01BEC8B2 call 01BEC8B7
01BEC8B7 pop ebp
01BEC8B8 mov eax,[ebp-17]
2007-5-6 17:38
0
雪    币: 239
活跃值: (77)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
7
谢谢了。
再请教一下,01BEC8B2 call 00401DFB 中的00401DFB是那里啊?
谢谢!
2007-5-6 17:43
0
雪    币: 239
活跃值: (77)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
8
明白了:
01BEC8B2 call 01BEC8c7 在调用时,将返回地址(01BEC8B7)入栈
01BEC8B7 ....          此为CALL返回的地址
01BEC8c7 pop ebp       将01BEC8B7送EBP,当然也可以用pop eax,将当前地直址弹入EAX
本例中的程序长度较小,因此将ax置0,得到eax的就是DLL的基址了。

再次谢谢!
2007-5-6 18:15
0
雪    币: 44229
活跃值: (19965)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
9
这里是我写错了
01BEC8B2 call  01BEC8B7
2007-5-6 18:18
0
雪    币: 239
活跃值: (77)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
10
谢谢,这下可解决重定位问题了。
就说原来做的一些补钉,有的说运行正常,有的说不能运行。原来,原因就在于重定位问题了。用老大的方法,彻底解决这个问题了。
太感谢了!
2007-5-7 01:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我想问下DELL 能加壳吗?
2007-5-7 08:55
0
雪    币: 260
活跃值: (81)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
要是有个自动添加重定位的就好了
2007-5-8 12:40
0
雪    币: 209
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
如果减去一些不用的功能,上述方法是否有效
2007-5-8 14:29
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学习了!!!!还是亲自在OD里走了一遍明白了.感谢啊~~~
2007-5-9 18:01
0
雪    币: 207
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
15
你这种情况应该是在一个DLL里,调用另一DLL内存里数据
所以我觉得应该先用GetModuleHandle函数取得第2个DLL的基址,再加上第2个DDLL内存地址的偏移,这样定位就会好些
2007-5-10 00:28
0
游客
登录 | 注册 方可回帖
返回
//