call jmp 与机器码

来源:互联网 发布:linux 查看物理内存 编辑:程序博客网 时间:2024/05/16 08:53

原文地址::http://sangguowei2002.blog.163.com/blog/static/3271332920132835138203/



相关文章

1、call指令对应的机器码好象不对----http://bbs.csdn.net/topics/190109474

2、如何根据机器码来获得相应的汇编指令。主要是CALL指令不会----http://zhidao.baidu.com/link?url=Iz46PDPnEITummTEwo2GtUrK6AeAjlidJ7HtCPJ6NYZJbbllRwNg2iBAcNwF2TYju5SyD4gD-m7uyV9fK7qbK_

3、进程插入后如何对目标进程 的代码hook到自己的dll函数?----http://bbs.csdn.net/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位的段选择子在后.



call指令对应的机器码好象不对

0 0
原创粉丝点击