Q
$ u: f" x0 g- X
% Y# X% @" ]9 w: K0 {/ _有2个问题,
* l- E3 ]$ e( O' [+ m# g& {1.用od调试的时候,我发现jmp指令的机器码(Hex 数据)不唯一,比如说 5 H9 a7 L4 Y8 C1 i, U" i) c# l( U
jmp 00485ada 对应的机器码每次都不一样, : A a7 V8 U9 Y* o4 Q1 w8 L2 W, o
004A2FCE ^ E9 072BFEFF jmp 00485ADA $ U8 |1 d% E( o" j% O" E2 x3 j
004A2FD3 ^ E9 022BFEFF jmp 00485ADA " w8 j) s0 Q4 H E
004A2FD8 ^ E9 FD2AFEFF jmp 00485ADA + E& Q' K; O: j
004A2FDD ^ E9 F82AFEFF jmp 00485ADA
, l$ L [: b3 f5 z3 }3 a004A2FE2 ^ E9 F32AFEFF jmp 00485ADA
5 L$ j4 k5 [% T; V( B; L( i004A2FE7 ^ E9 EE2AFEFF jmp 00485ADA
2 c3 D6 [. A! H. c; K% g6 }我从数据窗口中输入相同的机器码所对应的 jmp指令跳转的地址就不是原来的地址了,请问如何解决?
$ G' n. a& n! ]9 |- M; r! q7 I2,如果我用vb向内存写这条指令应该怎样写?
8 s6 J) R$ V3 T1 q0 [& N J比如我要向内存地址444AE2中写入机器码E9 EE2AFEFF,下面的问号部分应该怎么写?谢谢`` ( [; q" `" D A9 ]# n& U
WriteProcessMemory(phandle, ByVal &H444AE2, ????, 4, 0&) 0 V$ T% M4 O+ w5 G" u
* F1 u6 Z/ i; l/ ]$ y4 ?
A
& U8 ~' S- j( u$ S; ~* ?2 ]8 m7 ^直接的jmp分3种 5 B* t- H5 K! c% B2 N2 G4 X* K" |3 B
Short Jump(短跳转)机器码 EB rel8 ' J! c: `; {: E* J/ K/ C
只能跳转到256字节的范围内 * E N. b8 f" k3 F7 H
Near Jump(近跳转)机器码 E9 rel16/32
' t4 l3 h- o1 K) M) j. ~" m9 s可跳至同一个段的范围内的地址
* \3 |- p8 t3 D+ [Far Jump(远跳转)机器码EA ptr 16:16/32
$ ], ]6 D! k9 ~' V- e( N& X可跳至任意地址,使用48位/32位全指针 - V- I5 h v( D
& [, ^' `# a- b1 ~6 i a
要注意的是,短跳转和近跳转指令中包含的操作数都是相对于(E)IP的偏移,而远跳转指令中包含的是目标的绝对地址,所以短/近跳转会出现跳至同一目标的指令机器码不同,不仅会不同,而且应该不同。而远跳转中包含的是绝对地址,因此转移到同一地址的指令机器码相同
9 i; y& t, s% s---------------------------------------------------------------
% [9 j6 B) T2 C* O& V2 t下面的指令是这样计算偏移的. ; z( `. x0 p' I& o$ L2 i
004A2FCE ^ E9 072BFEFF jmp 00485ADA
( R. `, e0 U5 V! B0 O4 ?% ]& Z1 [ f3 n ======== ; k+ k! a1 }/ ]. [1 Y
485ADA-4A2FCE= FFFE2B0C 这里只是指向当前指令的IP处,实际计算跳转地址要去
6 G7 }- ^% x e3 X6 Z) F# h: x掉当前指令的长度,当前的跳转指令需要5个字节,FFFE2B0C-5=FFFE2B07
" A' x8 G- Y \, _, x# l- U" [. E5 k, `; m8 ~, Y2 y9 Y
注意颠倒顺序,高位在后,就是了. + l, @1 \* w- r- {" p& t/ ?
以下同.
. b1 A2 ]& M2 d# H7 P7 m4 _. u: B! k$ U: _ G; t( y8 J4 ^% H
004A2FD3 ^ E9 022BFEFF jmp 00485ADA
& |2 c1 T: G8 ^9 Y! _5 G W. T----------------------------------------------------------------
8 T' N/ H7 G' m# e q8 U有一个叫opcoder的程序,可以计算跳转对应的机器码
" F4 Q. T5 i5 d- [) w( ~---------------------------------------------------------------- ; o3 ^, E% ^0 T
补充一句,因为(E)IP总是指向下一条指令,所以相对偏移 = 目标 - (E)IP |