首页
社区
课程
招聘
[求助]od里面改代码时怎么才能用相对地址?
2007-10-24 18:37 9412

[求助]od里面改代码时怎么才能用相对地址?

2007-10-24 18:37
9412
是这样的, 我在改一个dll, 里面想引用一个字符串
12345678     "aaaa"

我想把这个字符串的地址赋给一个变量, 然后后面再用它. 例如:
mov eax, 12345678

但我发现程序每次调用这个dll时候的基址不一定每次都一样的, 例如有时是12000000, 有时又是13000000, 所以这时候eax里面的地址就已经不对了. 怎样改才能实现相对地址的概念, 即不管dll的基址是什么这个字符串的地址都能正确呢?

另外我发现如果我改的是一个代码的地址, 例如
jmp 12345678
我把它改成
jmp 12346666
这个jmp倒是不管基址是什么它都会自动变的, 好像是自动实现了相对地址的功能

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

收藏
免费 0
打赏
分享
最新回复 (16)
雪    币: 3758
活跃值: (3217)
能力值: ( LV15,RANK:500 )
在线值:
发帖
回帖
粉丝
曾半仙 12 2007-10-24 19:04
2
0
JMP和CALL有绝对和相对的, 近距跳转不需要重定位.
OD选中show NEAR jump modifers即可看到.
可以使用自定义代码pop出当前的位置, 然后减去代码和字串之间的偏移,
不过还要注意的是如果你修改的代码中间有包含重定位的被修改成普通代码, PE Loader会把你的代码当作地址给QJ了.
因此编辑重定位表也是好主意, 目前我是用程序倒出后, 文本编辑器来修改/减少定位项, 然后删掉原来的重定位表, 用relox重新生成. 主要是懒, 月末我放一份直接编辑重定位表的程序源码去sourceforge先, 希望感兴趣的兄弟帮助完善.
雪    币: 200
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jules 2007-10-24 19:16
3
0
我靠, 没想到这么复杂, 这回死了...
我看了一下, 我的那个jmp没有near modifier啊, 为什么也能重定位?
雪    币: 3758
活跃值: (3217)
能力值: ( LV15,RANK:500 )
在线值:
发帖
回帖
粉丝
曾半仙 12 2007-10-24 20:04
4
0
你的JMP不是near那就不是"你"的jmp而是"dll"原来的jmp, 包含绝对地址的都在重定位表里面有重定位项
雪    币: 1667
活跃值: (286)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
menting 14 2007-10-24 21:11
5
0
//简单的给你解答:
12345678     "aaaa"

12345678为地址的话!

要不我给你个简单点的方法吧,拿WINHEX直接把“aaaa”写入程序保存,这样你就知道了物理相对地址,然后再吧它转换成相对虚拟地址,也就是要计算了,或者直接拿OD看一下就知道了,然后你再调用,也就是再每次调用的时候都是相对虚拟地址+基址。这样就没什么错误了!

比如:
00120000   "aaaa"   //相对物理地址

程序运行后假设你在,00520000处找到了,并且假定基址是00400000那么相对虚拟地址就是00120000,当然这个地址和相对物理地址是不一样的,我这里是举的例子。然后你就知道相对虚拟地址了,以后加载的时候,先获取基址再加上这个相对虚拟地址就可以了。
雪    币: 1946
活跃值: (238)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
Bughoho 8 2007-10-24 21:33
6
0
我等你,半仙大人
雪    币: 200
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jules 2007-10-24 22:17
7
0
我那个jmp是自己改的啊, 原来那里的代码都跟jmp不沾边, 我把整个一块代码nope掉了, 然后自己在里面写的代码
雪    币: 200
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jules 2007-10-24 22:20
8
0
不明白, 啥意思?我准备在od里手工写代码啊, 还能怎么改?
雪    币: 212
活跃值: (71)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jxx_gt 2007-10-25 01:02
9
0
改法就象下面这样:
10000000:        push eax
10000001:        call 10000006
10000006:        pop eax
10000007:        and eax,0ff000000 (将eax的后六位清零)
                 这时eax里就是重定位后的基址了,剩下的就好办了
                 .......(自己的代码)
                 pop eax (对应于10000000处的push eax命令)

这是对于基址是10000000及1c000000等的求重定位基址的方法,如是其他基址,也只要相应修改and
命令或者还加个加法就行了
雪    币: 256
活跃值: (478)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wyqzm 1 2007-10-25 01:20
10
0
pop用过,感觉有点麻烦

我这样处理:

100123: call 100150
100124  add(或sub) eax,(十六进制值)
...
100150 mov eax,[esp]
100151 retn

呵呵,100150这个地址可以重复使用.也就是可以多次call 100150
雪    币: 200
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jules 2007-10-25 12:40
11
0
多谢各位的提示, 晚点我试试
雪    币: 112
活跃值: (16)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
壹只老虎 7 2007-10-25 12:48
12
0
call/pop/sub!
雪    币: 200
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jules 2007-10-25 23:13
13
0
用这一招搞定了。再问个问题,jmp和call后面的地址系统会自动重定位?

[QUOTE=wyqzm;374477]pop用过,感觉有点麻烦

我这样处理:

100123: call 100150
100124  add(或sub) eax,(十六进制值)
...
100150 mov eax,[esp]
100151 retn

呵呵,100150这个地址可以重复使用.也就是可以多次c...[/QUOTE]
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
Isaiah 10 2007-10-25 23:20
14
0
call pop是取当前的地址。 不是自动重定位。
直接编辑重定位表就可以了。LordPe可以
雪    币: 200
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jules 2007-10-26 15:53
15
0
我的问题是例如上面的代码里的这行:
call 100150
这里的100150怎么处理的. 我编辑的时候肯定是写绝对值100150, 但载入的时候这个地址可能变成101150. 这是pe载入时自动处理的吗?
雪    币: 200
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jules 2007-10-26 15:54
16
0
我的问题是例如上面的代码里的这行:
call 100150
这里的100150怎么处理的. 我编辑的时候肯定是写绝对值100150, 但载入的时候这个地址可能变成101150. 这是pe载入时自动处理的吗?
雪    币: 200
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jules 2007-10-29 09:53
17
0
请大虾们指点一下啊, 或者告知哪里能查到相关知识, 不胜感谢
游客
登录 | 注册 方可回帖
返回