首页
社区
课程
招聘
关于OD调试Jmp指令的问题,请前辈解释一下!
发表于: 2006-8-20 02:40 7646

关于OD调试Jmp指令的问题,请前辈解释一下!

2006-8-20 02:40
7646
有2个问题,
1.用od调试的时候,我发现jmp指令的机器码(Hex 数据)不唯一,比如说
jmp 00485ada 对应的机器码每次都不一样,
004A2FCE    ^ E9 072BFEFF   jmp     00485ADA
004A2FD3    ^ E9 022BFEFF   jmp     00485ADA
004A2FD8    ^ E9 FD2AFEFF   jmp     00485ADA
004A2FDD    ^ E9 F82AFEFF   jmp     00485ADA
004A2FE2    ^ E9 F32AFEFF   jmp     00485ADA
004A2FE7    ^ E9 EE2AFEFF   jmp     00485ADA
我从数据窗口中输入相同的机器码所对应的 jmp指令跳转的地址就不是原来的地址了,请问如何解决?
2,如果我用vb向内存写这条指令应该怎样写?
比如我要向内存地址444AE2中写入机器码E9 EE2AFEFF,下面的问号部分应该怎么写?谢谢``
WriteProcessMemory(phandle, ByVal &H444AE2, ????, 4, 0&)

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
直接的jmp分3种
Short Jump(短跳转)机器码 EB rel8
只能跳转到256字节的范围内
Near Jump(近跳转)机器码 E9 rel16/32
可跳至同一个段的范围内的地址
Far Jump(远跳转)机器码EA ptr 16:16/32
可跳至任意地址,使用48位/32位全指针

要注意的是,短跳转和近跳转指令中包含的操作数都是相对于(E)IP的偏移,而远跳转指令中包含的是目标的绝对地址,所以短/近跳转会出现跳至同一目标的指令机器码不同,不仅会不同,而且应该不同。而远跳转中包含的是绝对地址,因此转移到同一地址的指令机器码相同
2006-8-20 03:18
0
雪    币: 414
活跃值: (531)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
最初由 aliswings 发布
有2个问题,
1.用od调试的时候,我发现jmp指令的机器码(Hex 数据)不唯一,比如说
jmp 00485ada 对应的机器码每次都不一样,
004A2FCE ^ E9 072BFEFF jmp 00485ADA
004A2FD3 ^ E9 022BFEFF jmp 00485ADA
........


下面的指令是这样计算偏移的.
004A2FCE    ^ E9 072BFEFF   jmp     00485ADA
                 ========
485ADA-4A2FCE=  FFFE2B0C  这里只是指向当前指令的IP处,实际计算跳转地址要去
掉当前指令的长度,当前的跳转指令需要5个字节,FFFE2B0C-5=FFFE2B07

注意颠倒顺序,高位在后,就是了.
以下同.

004A2FD3    ^ E9 022BFEFF   jmp     00485ADA
2006-8-20 18:09
0
雪    币: 179
活跃值: (131)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
4
有一个叫opcoder的程序,可以计算跳转对应的机器码
2006-8-20 18:12
0
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
5
最初由 nig 发布
下面的指令是这样计算偏移的.
004A2FCE ^ E9 072BFEFF jmp 00485ADA
========
485ADA-4A2FCE= FFFE2B0C 这里只是指向当前指令的IP处,实际计算跳转地址要去
掉当前指令的长度,当前的跳转指令需要5个字节,FFFE2B0C-5=FFFE2B07
........


补充一句,因为(E)IP总是指向下一条指令,所以相对偏移 = 目标 - (E)IP
2006-8-20 19:51
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢,我研究一下!
2006-8-20 22:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
谢谢,我懂了!
如果我用vb向内存注入指令应该怎样写?
比如我要向内存地址444AE2中写入机器码E9 EE2AFEFF,下面的问号部分应该怎么写?谢谢``
WriteProcessMemory(phandle, ByVal &H444AE2, ????, 4, 0&)
2006-8-20 22:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
终于搞懂了,按字节写就可以了!
2006-8-21 14:35
0
游客
登录 | 注册 方可回帖
返回
//