首页
社区
课程
招聘
[求助]OD里给DLL打补丁,问题1已解决,请回复问题2
发表于: 2008-12-3 19:27 5477

[求助]OD里给DLL打补丁,问题1已解决,请回复问题2

2008-12-3 19:27
5477
10001190   .  8B41 1C       mov     eax, dword ptr ds:[ecx+1C]
10001193   .  6A 00         push    0                                         ; /Enable = FALSE
10001195   .  50            push    eax                                       ; |hWnd
............................................
10001223   CALL DWORD PTR DS:[100044444]

现在要把 PUSH 0这句改成 JUM 目标地址

问题1(已解决):假如目标地址是10001223,我能直接写成

jum 10001223吗?在DLL里会不会碰到地址不对问题

问题2:
   假如我要在DLL里调用API(API的RVA已经找到了,假设是00004444吧),我是写成 CALL DWORD PTR DS:[10004444],还是(在DLL里的其它地方也有调用此API,假如是CALL DWORD PTR DS:[10005555]
) CALL DWORD PTR DS:[10005555]

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

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不明~~
2008-12-3 19:47
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
jmp XXXXXXXX 可以。因为这里的用的是相对的偏移,不受dll加载基址的影响
call dword ptr [XXXXXXXX] 不可以。如果这里X直接填写数字的话,并且下次dll加载到不同的地址,就要出错了。如果处理了重定位表,或者这里的X是自己重定位算出来,那就另当别论了。
2008-12-3 19:53
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=icersg;544926]jmp XXXXXXXX 可以。因为这里的用的是相对的偏移,不受dll加载基址的影响
call dword ptr [XXXXXXXX] 不可以。如果这里X直接填写数字的话,并且下次dll加载到不同的地址,就要出错了。如果处理了重定位表,或者这里的X是自己重定位算出来,那就另当别论了。[/QUOTE]

但事实上jmp XXXXXXXX 的地址是绝对地址呀?

重定位表如何计算?
2008-12-3 20:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
版主今天怎么没来啊。。。。
2008-12-3 20:37
0
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
[QUOTE=lixiaodog;544933]但事实上jmp XXXXXXXX 的地址是绝对地址呀?

重定位表如何计算?[/QUOTE]

在OD里面随便找一个jmp对照一下机器码和反汇编代码,你就会发现那个反汇编地址是经过OD翻译过的地址。

重定位表看PE文档,写的很清楚。
2008-12-3 21:37
0
雪    币: 723
活跃值: (81)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
7
你这个 push 0 只有两个字节,要想改为 jmp 只能在 -128 ~ +127 之间,在你的例子里不行
2008-12-3 22:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我只是打个比方

那几条语句是随便找的

假如这些条件都允许的话,怎么弄

因为我找全0处是0006D76E

我要在这个地方加入我的代码,我jmp的时候,写成jmp 0006D76E?

还是jmp 1006D76E?
2008-12-3 22:19
0
雪    币: 723
活跃值: (81)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
9
直接写要jmp 的地方,od会帮你生成相应的代码
2008-12-3 22:26
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
谢谢你,这个问题明白了。

那关于调用API的问题你怎么看?
2008-12-3 22:44
0
雪    币: 723
活跃值: (81)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
11
call 属于自己的地址
2008-12-3 23:06
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
12
使用标签功能。

问题1:在你目标地址处,按分号(;)键,加一个标签,比如jmp_here,然后在patch点汇编“jmp jmp_here”即可,可以减少错误。当然直接写“jmp 地址”也是一样的,就是需要把地址记下来而已。

    因为是一个模块内部的地址,所以相对地址是不变的,汇编器会自动计算。

问题2:如果你挨到了要调用的API在导入表的位置,比如在12345678,直接写成call [12345678]即可,同样校对地址由汇编器计算完成。但你找到的地址12345678必须在相应的文件中存在映射,不能是加载时或运行时分配的内存。
2008-12-3 23:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
谢谢版主,但我如何确定它是不是有这个映射存在?
2008-12-4 13:56
0
游客
登录 | 注册 方可回帖
返回
//