Q 5 x$ P& O7 |$ p9 \3 x! v
1 y0 {5 g2 K5 |6 N* n1 z, p
有2个问题, X2 S l3 d" h! t6 ?+ X% L. y
1.用od调试的时候,我发现jmp指令的机器码(Hex 数据)不唯一,比如说
. Q4 p2 C' o* c/ C6 `jmp 00485ada 对应的机器码每次都不一样, 2 R9 [$ I9 E9 m# \3 p- O
004A2FCE ^ E9 072BFEFF jmp 00485ADA 1 X- n: j% ]' k' H# i& H
004A2FD3 ^ E9 022BFEFF jmp 00485ADA
5 u1 r3 r+ b& x$ o1 D( Q004A2FD8 ^ E9 FD2AFEFF jmp 00485ADA
) Z& R, Q2 k5 K- F+ z/ X3 D004A2FDD ^ E9 F82AFEFF jmp 00485ADA 4 n( _3 B0 |' A1 X# R$ \- `# N
004A2FE2 ^ E9 F32AFEFF jmp 00485ADA % ?+ w }$ d F- Q6 ~& j* G3 T$ F
004A2FE7 ^ E9 EE2AFEFF jmp 00485ADA
; ]: O- i( }5 v3 q9 `; u我从数据窗口中输入相同的机器码所对应的 jmp指令跳转的地址就不是原来的地址了,请问如何解决?
3 B W# N3 `2 R; W6 |- D2,如果我用vb向内存写这条指令应该怎样写?
; C& v7 _* q9 J% r2 d& Y比如我要向内存地址444AE2中写入机器码E9 EE2AFEFF,下面的问号部分应该怎么写?谢谢``
: a+ c7 X: K3 N4 m5 U. H' vWriteProcessMemory(phandle, ByVal &H444AE2, ????, 4, 0&)
6 ~ h) w2 i1 | D0 Z: d
; p' s1 w K" [4 M1 w1 HA
5 E! C" I- S1 b1 N/ o直接的jmp分3种 ' \ N8 M5 C) ^& d
Short Jump(短跳转)机器码 EB rel8
) C7 c6 N7 f' P: S/ W只能跳转到256字节的范围内 5 I6 i( B0 P9 d- O; x
Near Jump(近跳转)机器码 E9 rel16/32
! Y" ?$ i4 X% A& ]+ N可跳至同一个段的范围内的地址 M+ F+ }+ p* ]0 \1 e* X
Far Jump(远跳转)机器码EA ptr 16:16/32
& [% e7 y1 h' d9 K. U) ~0 h可跳至任意地址,使用48位/32位全指针 9 C6 F, i4 X+ V6 v9 I
: `9 M/ F- L' v8 O; J _# F% e要注意的是,短跳转和近跳转指令中包含的操作数都是相对于(E)IP的偏移,而远跳转指令中包含的是目标的绝对地址,所以短/近跳转会出现跳至同一目标的指令机器码不同,不仅会不同,而且应该不同。而远跳转中包含的是绝对地址,因此转移到同一地址的指令机器码相同
) c. [" I$ I& }9 ^---------------------------------------------------------------
/ k( I* V" [0 z+ b% a7 n下面的指令是这样计算偏移的. + J' _" X f' v3 A1 A3 V4 U( m
004A2FCE ^ E9 072BFEFF jmp 00485ADA
8 r! F! l- f! e( c2 B ======== , ^, L5 J8 X/ D0 \# Q( |
485ADA-4A2FCE= FFFE2B0C 这里只是指向当前指令的IP处,实际计算跳转地址要去 % H# R4 n% z( M% h
掉当前指令的长度,当前的跳转指令需要5个字节,FFFE2B0C-5=FFFE2B07 ) y, W6 ]' g- r) s( E, v( w. q
8 X( Y8 u: M* f2 Y8 j3 D
注意颠倒顺序,高位在后,就是了. * b5 c; u4 k5 M# d8 `, t
以下同.
2 i# w n+ B1 l4 y1 A0 V9 C
1 P7 K, h: c! Y004A2FD3 ^ E9 022BFEFF jmp 00485ADA
* v; |/ ]6 S7 G3 O) s, Y---------------------------------------------------------------- 1 q- R5 d c) }6 ]9 S# h; Q5 d
有一个叫opcoder的程序,可以计算跳转对应的机器码
* G. [/ K" G% r4 J) D6 {9 q1 `---------------------------------------------------------------- 9 H4 G: ]- A" w' q2 _: o) J
补充一句,因为(E)IP总是指向下一条指令,所以相对偏移 = 目标 - (E)IP |