能力值:
(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"
|
能力值:
( LV9,RANK:180 )
|
-
-
3 楼
或,如果能得到当前DLL的代码段基址,得到这个的话,写成mov eax, [base+c8A0]也应可以吧。
请问如何得到当前DLL代码段的基址呢?
谢谢!
|
能力值:
(RANK:350 )
|
-
-
4 楼
调用GetModuleHandle,传递NULL参数,则返回调用的可执行文件的基地址
|
能力值:
( 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"
|
能力值:
(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]
|
能力值:
( LV9,RANK:180 )
|
-
-
7 楼
谢谢了。
再请教一下,01BEC8B2 call 00401DFB 中的00401DFB是那里啊?
谢谢!
|
能力值:
( LV9,RANK:180 )
|
-
-
8 楼
明白了:
01BEC8B2 call 01BEC8c7 在调用时,将返回地址(01BEC8B7)入栈
01BEC8B7 .... 此为CALL返回的地址
01BEC8c7 pop ebp 将01BEC8B7送EBP,当然也可以用pop eax,将当前地直址弹入EAX
本例中的程序长度较小,因此将ax置0,得到eax的就是DLL的基址了。
再次谢谢!
|
能力值:
(RANK:350 )
|
-
-
9 楼
这里是我写错了
01BEC8B2 call 01BEC8B7
|
能力值:
( LV9,RANK:180 )
|
-
-
10 楼
谢谢,这下可解决重定位问题了。
就说原来做的一些补钉,有的说运行正常,有的说不能运行。原来,原因就在于重定位问题了。用老大的方法,彻底解决这个问题了。
太感谢了!
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
我想问下DELL 能加壳吗?
|
能力值:
( LV4,RANK:50 )
|
-
-
12 楼
要是有个自动添加重定位的就好了
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
如果减去一些不用的功能,上述方法是否有效
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
学习了!!!!还是亲自在OD里走了一遍明白了.感谢啊~~~
|
能力值:
( LV3,RANK:20 )
|
-
-
15 楼
你这种情况应该是在一个DLL里,调用另一DLL内存里数据
所以我觉得应该先用GetModuleHandle函数取得第2个DLL的基址,再加上第2个DDLL内存地址的偏移,这样定位就会好些
|
|
|