冒险解谜游戏中文网 ChinaAVG

标题: 【汉化资料】关于OD调试Jmp指令的问题 [打印本页]

作者: shane007    时间: 2009-1-25 11:35
标题: 【汉化资料】关于OD调试Jmp指令的问题
Q + e! t3 V% w# j8 K
% s  M# a3 u/ L# j0 J3 g9 M* f
有2个问题, 0 I' ^# ]# E( I$ N  S
1.用od调试的时候,我发现jmp指令的机器码(Hex 数据)不唯一,比如说 ( k7 y" S5 _8 M* E) E( I4 a5 q
jmp 00485ada 对应的机器码每次都不一样,
# b! \) y- N/ Y0 m! T# X! @0 r004A2FCE ^ E9 072BFEFF jmp 00485ADA , q0 E$ Q1 A, `# H
004A2FD3 ^ E9 022BFEFF jmp 00485ADA
5 h! g& k9 h$ Z- y) i; E004A2FD8 ^ E9 FD2AFEFF jmp 00485ADA / D9 V( S6 W6 T$ G/ y  E
004A2FDD ^ E9 F82AFEFF jmp 00485ADA
) @% A% O  s" P# O' k7 z7 E7 |% P004A2FE2 ^ E9 F32AFEFF jmp 00485ADA % ~4 \7 y& {- r* t" d) J) b6 @2 d
004A2FE7 ^ E9 EE2AFEFF jmp 00485ADA 7 _7 E8 N+ B+ v# R# m/ U
我从数据窗口中输入相同的机器码所对应的 jmp指令跳转的地址就不是原来的地址了,请问如何解决?
$ _6 @& M: Y. Y, `! O' P) ^) ~2,如果我用vb向内存写这条指令应该怎样写?
$ J# N/ o1 Y+ H# N& z$ o' ]6 t比如我要向内存地址444AE2中写入机器码E9 EE2AFEFF,下面的问号部分应该怎么写?谢谢``
3 k; o' g  N: R  vWriteProcessMemory(phandle, ByVal &H444AE2, ????, 4, 0&) - ~1 G5 M8 N8 K* U" r* i

. k3 y8 ^& O2 l" ]' ^  xA 7 E5 A& d& N6 d3 S7 I- N
直接的jmp分3种 3 }1 r3 S! Y: v! g: K
Short Jump(短跳转)机器码 EB rel8 6 z1 `  m) U6 l; k/ f! j% |6 G. F
只能跳转到256字节的范围内
# W  d0 i, \* C5 M) D/ mNear Jump(近跳转)机器码 E9 rel16/32 4 H+ h2 K+ _" o6 \0 ^
可跳至同一个段的范围内的地址
6 K) H; I0 V. S5 i" d+ nFar Jump(远跳转)机器码EA ptr 16:16/32 ( Q6 s# h2 J  [/ Q
可跳至任意地址,使用48位/32位全指针 ' J. a$ v: F4 c
# x7 F  h# C) |7 r' d
要注意的是,短跳转和近跳转指令中包含的操作数都是相对于(E)IP的偏移,而远跳转指令中包含的是目标的绝对地址,所以短/近跳转会出现跳至同一目标的指令机器码不同,不仅会不同,而且应该不同。而远跳转中包含的是绝对地址,因此转移到同一地址的指令机器码相同 + n7 G( m! R& F! A4 X
---------------------------------------------------------------
$ m. P; @0 w+ W" |( O: I
下面的指令是这样计算偏移的.
. ~& c/ @; D: C- z- w& I4 l: o004A2FCE    ^ E9 072BFEFF  jmp    00485ADA
$ E2 j: |+ U; C+ w5 \                ======== 6 j( m( G; G  l7 x' L# O- g
485ADA-4A2FCE=  FFFE2B0C  这里只是指向当前指令的IP处,实际计算跳转地址要去
$ u2 p/ j7 ]0 z% Y2 P. J% s掉当前指令的长度,当前的跳转指令需要5个字节,FFFE2B0C-5=FFFE2B07 - x8 l; W5 N" a

; K; [5 n0 D$ D' s. s  z  }8 h$ L- `注意颠倒顺序,高位在后,就是了. 2 H" c. D1 z0 \% ]/ z8 ]! T
以下同. 3 f! L( H, D5 `- g7 v& \8 Y
0 q# x% _- T* r+ Y) O
004A2FD3    ^ E9 022BFEFF  jmp    00485ADA

+ m0 E' c$ [3 W) C---------------------------------------------------------------- 3 i# `6 L1 l( F/ w) ~
有一个叫opcoder的程序,可以计算跳转对应的机器码 . n) U9 M' J7 F* j8 d
---------------------------------------------------------------- / H2 |4 G' @& \$ X8 s
补充一句,因为(E)IP总是指向下一条指令,所以相对偏移 = 目标 - (E)IP




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2