Q % D! P% a1 ^; H2 i7 [, ~* |; R
! p* x- {' ^2 H. ?( I3 O
有2个问题,
) D* U6 T' @! I$ `2 q9 Z3 [0 F8 m% y0 ?1.用od调试的时候,我发现jmp指令的机器码(Hex 数据)不唯一,比如说 / Z2 Y) j$ f) j3 y3 R' X
jmp 00485ada 对应的机器码每次都不一样,
0 ^9 l2 p. g2 g: A2 x004A2FCE ^ E9 072BFEFF jmp 00485ADA
' N8 E9 b7 X* ]6 u% J2 c5 S) M004A2FD3 ^ E9 022BFEFF jmp 00485ADA
9 i4 ^8 k4 E+ b' v# q" f004A2FD8 ^ E9 FD2AFEFF jmp 00485ADA " _6 A! b' N+ j" ?) v8 x
004A2FDD ^ E9 F82AFEFF jmp 00485ADA 4 B1 W! ~% A4 M, G ?6 z0 I: A1 o
004A2FE2 ^ E9 F32AFEFF jmp 00485ADA
3 b+ o3 A3 r4 J" }: w$ d5 f0 | r004A2FE7 ^ E9 EE2AFEFF jmp 00485ADA
; }0 T# e9 M( \* w D8 V我从数据窗口中输入相同的机器码所对应的 jmp指令跳转的地址就不是原来的地址了,请问如何解决? l. L! f% V4 P- x! ]6 u9 z
2,如果我用vb向内存写这条指令应该怎样写?
+ s, E! f3 Z5 u8 Q2 G1 M比如我要向内存地址444AE2中写入机器码E9 EE2AFEFF,下面的问号部分应该怎么写?谢谢`` ' N/ u6 r9 S8 R$ U) P* [
WriteProcessMemory(phandle, ByVal &H444AE2, ????, 4, 0&) 1 ?: k8 A4 T0 R5 N$ `* q) u3 Q
8 V% U6 i6 b9 Y8 n
A 2 _; W1 E* [* G [
直接的jmp分3种 , Y& y) ^2 W A1 Z$ |0 A
Short Jump(短跳转)机器码 EB rel8 ' b9 o$ H; z) }6 ~4 B
只能跳转到256字节的范围内
! t5 i* p: f: C0 N3 s' iNear Jump(近跳转)机器码 E9 rel16/32
; L* ^5 V# r9 L- A l: m9 ?* k可跳至同一个段的范围内的地址
$ t1 ? v6 w! B& K6 q0 {Far Jump(远跳转)机器码EA ptr 16:16/32
4 C- B x7 S P) c$ r可跳至任意地址,使用48位/32位全指针 , L. _" t/ V3 S
$ ], n) `# C7 |9 ?' R: t
要注意的是,短跳转和近跳转指令中包含的操作数都是相对于(E)IP的偏移,而远跳转指令中包含的是目标的绝对地址,所以短/近跳转会出现跳至同一目标的指令机器码不同,不仅会不同,而且应该不同。而远跳转中包含的是绝对地址,因此转移到同一地址的指令机器码相同
: c1 Z$ M- |- H4 W7 A--------------------------------------------------------------- 0 y$ u$ U# L$ z
下面的指令是这样计算偏移的.
& j$ W8 Q$ p! T004A2FCE ^ E9 072BFEFF jmp 00485ADA # \* n/ x# `8 r3 e
========
" D! j/ e' ^8 P) k- k9 t485ADA-4A2FCE= FFFE2B0C 这里只是指向当前指令的IP处,实际计算跳转地址要去
4 U) m, R7 x- K/ e& H( ?掉当前指令的长度,当前的跳转指令需要5个字节,FFFE2B0C-5=FFFE2B07
6 N! s5 O% w" E$ s! Z* v: |. D1 ^" m: B' C2 `. b3 N
注意颠倒顺序,高位在后,就是了.
0 Y+ n; U: ^# b# t+ G以下同. 4 ?* ^, W( i. x
; u7 C$ L- L; S* b4 |% n+ P004A2FD3 ^ E9 022BFEFF jmp 00485ADA , F: u) J5 c# @/ }3 J5 F
----------------------------------------------------------------
0 v3 w: S8 l; Y( S有一个叫opcoder的程序,可以计算跳转对应的机器码
/ U3 s5 z/ q9 O----------------------------------------------------------------
* S+ e0 o) e) m5 J; \( @- ?补充一句,因为(E)IP总是指向下一条指令,所以相对偏移 = 目标 - (E)IP |