原文地址::http://sangguowei2002.blog.163.com/blog/static/3271332920132835138203/
相关文章
1、call指令对应的机器码好象不对----http://bbs.youkuaiyun.com/topics/190109474
2、如何根据机器码来获得相应的汇编指令。主要是CALL指令不会----http://zhidao.baidu.com/link?url=Iz46PDPnEITummTEwo2GtUrK6AeAjlidJ7HtCPJ6NYZJbbllRwNg2iBAcNwF2TYju5SyD4gD-m7uyV9fK7qbK_
3、进程插入后如何对目标进程 的代码hook到自己的dll函数?----http://bbs.youkuaiyun.com/topics/190081822
;示例一 CALL立即数 CALL后面跟一个32位立即数
;===================================
1 [bits 32]
2 test:
3 00000000 90 nop
4 00000001 90 nop
5 00000002 90 nop
6 00000003 E8F8FFFFFF call test
7 00000008 90 nop
8 00000009 90 nop
9 0000000A 90 nop
;===================================
CALL后面跟一个立即数,也就是32位偏移量时,机器码为 0XE8 后面的32位立即数是偏移量.
偏移量的计算: 目标偏移地址 减 CALL 指令后的下一条指令的地址 在当前的例子中,test是目标偏移地址,地址是0 CALL指令后的地址为 08 , 0-08=FFFFFFF8 注意,在内存中,低字在前,高字在后,所以是 0XE8 F8 FF FF FF
偏移量计算的公式二: 目标偏移-CALL指令的起始偏移-CALL指令的大小
;示例二 CALL [内存地址]
;=====================================
1 [bits 32]
2
3 00000000 90 nop
4 00000001 90 nop
5 00000002 90 nop
6 00000003 FF15[0B000000] call [test]
7 00000009 90 nop
8 0000000A 90 nop
9 test:
10 0000000B 90 nop
;======================================
机器码是0XFF15 后面跟的是内存地址. test的内存地址是 0B ,所以后面跟的是0B 同样是低字在前,高字在后
示例三 call far [内存地址]
;=======================================
1 [bits 32]
2
3 00000000 90 nop
4 00000001 90 nop
5 00000002 90 nop
6 00000003 FF1D[0B000000] call far [test]
7 00000009 90 nop
8 0000000A 90 nop
9 test:
10 0000000B 90 nop
;=======================================
CALL FAR 内存地址,机器码是 0XFF1D 后面内存地址的表示是相同的,但执行不同. 会同时改变CS 与 IP.
;示例四 JMP 立数数
;=======================================
1 [bits 32]
2
3 00000000 90 nop
4 00000001 90 nop
5 00000002 90 nop
6 00000003 E902000000 jmp test
7 00000008 90 nop
8 00000009 90 nop
9 test:
10 0000000A 90 nop
;=======================================
JMP 立即数,机器码是 E9 ,后面跟一个偏移量. 偏移量计算与上面CALL相同. test 地址是 0A,JMP指令后下一条指令地址是 08 ,0A-08=2
;JMP 内存地址
;=======================================
1 [bits 32]
2
3 00000000 90 nop
4 00000001 90 nop
5 00000002 90 nop
6 00000003 FF25[0B000000] jmp [test]
7 00000009 90 nop
8 0000000A 90 nop
9 test:
10 0000000B 90 nop
;=======================================
JMP 内存地址,机器码是 0XFF25 后面跟的是内存地址. 注意,是从后面的内存地址取出目标数值来改变EIP.
;JMP FAR 内存地址
;========================================
1 [bits 32]
2
3 00000000 90 nop
4 00000001 90 nop
5 00000002 90 nop
6 00000003 FF2D[0B000000] jmp far [test]
7 00000009 90 nop
8 0000000A 90 nop
9 test:
10 0000000B 90 nop
;========================================
JMP FAR 机器地址是 0XFF2D 后面同样是内存地址.
;============================================================
直接远跳转与直接远调用
;============================================================
1 [bits 32]
2 00000000 EA007C00000800 jmp 0x8:0x7c00
3 00000007 9A007C00000800 call 0x8:0x7c00
JMP直接远跳,机器码是0XEA 32位的偏移在前,16位的段选择子在后.
CALL直接远跳,机器码是0X9A 32位的偏移在前,16位的段选择子在后.