Q - s {$ g2 U" g y: H" j# B
+ n/ {* {$ u; s有2个问题,
) Y- p( R ~, ^1.用od调试的时候,我发现jmp指令的机器码(Hex 数据)不唯一,比如说
6 v7 i p+ H3 h8 e" ?. P$ G. |& Zjmp 00485ada 对应的机器码每次都不一样,
; l$ W6 [7 T, a5 y' M$ n004A2FCE ^ E9 072BFEFF jmp 00485ADA 8 N$ z6 x O; H7 v
004A2FD3 ^ E9 022BFEFF jmp 00485ADA
8 Q2 e7 E9 H5 |3 s& A: S1 c* M004A2FD8 ^ E9 FD2AFEFF jmp 00485ADA
9 ^$ I: \- r6 b X! R$ v004A2FDD ^ E9 F82AFEFF jmp 00485ADA
) a, d# |( v7 Z! E+ [ g4 Z6 Y1 i004A2FE2 ^ E9 F32AFEFF jmp 00485ADA $ f1 I5 ~: `" G& c! B9 Y- f/ r- o
004A2FE7 ^ E9 EE2AFEFF jmp 00485ADA ) K; Q8 l" a F, E9 ^6 A* y
我从数据窗口中输入相同的机器码所对应的 jmp指令跳转的地址就不是原来的地址了,请问如何解决?
* @* s/ b% M- Q6 R2,如果我用vb向内存写这条指令应该怎样写?
4 J) U' D" Q, ]5 r比如我要向内存地址444AE2中写入机器码E9 EE2AFEFF,下面的问号部分应该怎么写?谢谢``
" H X& _" f% U ^1 m' {WriteProcessMemory(phandle, ByVal &H444AE2, ????, 4, 0&)
" ]; a" w& r) Q) }" \2 w/ T5 Y1 e; Q( s U/ F
A
. _6 w3 I8 Y& g# u直接的jmp分3种 6 p; Q& i( v% q! w! l1 M0 W, a
Short Jump(短跳转)机器码 EB rel8
x) r4 {9 E K7 t% F只能跳转到256字节的范围内
Z3 Q" F1 Y& s2 y+ fNear Jump(近跳转)机器码 E9 rel16/32 ) k8 P& L0 a" J8 b0 \: F$ h' Z
可跳至同一个段的范围内的地址 * K j" @- Z8 O( G7 @8 g; |2 ]
Far Jump(远跳转)机器码EA ptr 16:16/32
, g6 T: r+ ~8 o- a可跳至任意地址,使用48位/32位全指针 4 _# w% S2 a2 j6 J" c* a
+ l9 \6 d9 w; q+ J9 \2 G, o1 d0 m要注意的是,短跳转和近跳转指令中包含的操作数都是相对于(E)IP的偏移,而远跳转指令中包含的是目标的绝对地址,所以短/近跳转会出现跳至同一目标的指令机器码不同,不仅会不同,而且应该不同。而远跳转中包含的是绝对地址,因此转移到同一地址的指令机器码相同
1 G# Z- N% ?9 V# B% ^4 b---------------------------------------------------------------
- k* [; R) h$ g4 \4 N* v6 K下面的指令是这样计算偏移的. : [4 c* U& X7 G" z
004A2FCE ^ E9 072BFEFF jmp 00485ADA - z. O! c4 v3 s+ c B
======== * d+ Q. C, g4 A) K+ n" x; s7 c
485ADA-4A2FCE= FFFE2B0C 这里只是指向当前指令的IP处,实际计算跳转地址要去 % E; R+ D# W2 ?: S1 R# f
掉当前指令的长度,当前的跳转指令需要5个字节,FFFE2B0C-5=FFFE2B07
`! b, o3 D. s4 U! u9 E6 w# t2 R7 }2 a
注意颠倒顺序,高位在后,就是了.
3 @6 E; I/ b) M* I- E以下同.
+ d; a3 y3 A7 a# K% c# n6 @% @9 Q4 y3 x. X1 i6 W
004A2FD3 ^ E9 022BFEFF jmp 00485ADA
3 ?- F$ c% {& p4 S2 ]---------------------------------------------------------------- 8 P1 w2 P2 n) C$ t: B4 o: p' p3 E
有一个叫opcoder的程序,可以计算跳转对应的机器码
4 e% Q% }, s9 t8 }: R5 h---------------------------------------------------------------- 0 ~7 i( P$ { \. n
补充一句,因为(E)IP总是指向下一条指令,所以相对偏移 = 目标 - (E)IP |