Chinaunix首页 | 论坛 | 博客
  • 博客访问: 152926
  • 博文数量: 40
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-11 09:11
文章分类

全部博文(40)

文章存档

2020年(1)

2017年(36)

2014年(3)

我的朋友

分类: WINDOWS

2017-03-17 19:00:50

JMP指令和call指令大同小异

    我们写正常程序的时候根本不用关心变量(常量)的位置,因为源程序在编译的时候,变量(常量)在内存中的位置都计算好了。程序装入内存时,系统不会为它重定位。编程时需要用到变量(常量)的时候直接用变量(常量)名访问,编译后就通过偏移(指针)地址访问。这与JMP或者CALL指令的段内转移不同,因为段内转移的指令在编译的时候使用位移计算。虽然代码在内存中的实际地址无法确定,但是在程序中所有代码之间相互的偏移量是固定不变的。因此,无论病毒程序被插入到宿主程序哪里,段内转移都会正确执行。

     实现方法如下:



     执行call GetActualAddr后,栈顶的值即指令pop  ebp的地址,注意栈中的地址是程序在内存中的实际地址。执行pop ebp之后,ebp中的值就成了这个实际地址。标号GetActualAddr是一个常量,即由编译器计算好的地址常量,我们暂且称其为原地址。两者的差就是我们要得到的最终值,即所有原地址和实际地址的“位移”。我们在程序中,所有使用到这类常量的时候,都应该加上这个“位移”值。 

阅读(1801) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~