初探计算机病毒(4)--重定位

   上一篇解决了病毒程序调用API的问题,那么这是不是就万事大吉了呢?不,还有个问题需要解决,就是重定位。
    病毒作为一段代码附加到正常的程序中的,其位置可能是随机的。比如病毒编译完成后,其运行首地址为0x04000000,但是附加到正常的程序中加载到内存中其首地址可能就变成0x08000000,那么很多直接访问内存的指令就会发生错误。比如加载到0x04000000时,指令mov eax, [0x04000100]如果运行正确的话,那么加载到0x08000000这样的指令是会产生错误。因为病毒程序的代码和数据是作为一个整体附加到正常的exe文件当中的,加载的位置变了,程序所要访问的数据的位置也就变了,所以之前那种用固定值访问内存的方法就不可靠了。但是有有一样是一直都不变了,那就是代码和数据相对位置。来看这样的MASM代码:
    call @F
    @@:
    pop ebx
    sub ebx, @B
翻译成机器代码是:
005E5E3A >  E8 00000000     CALL 005E5E3F
005E5E3F    5B              POP EBX
005E5E40    81EB 8B144000   SUB EBX,0040148B
CALL指令后面是相对值,指明要运行CALL XXXX之后偏移多少字节地址处的指令。CALL  指令运行后它的下一条语句的地址就被推入栈中。POP EBX,EBX里存储既为此条指令的真正地址。 下一条指令SUB EBX,0040148B,0040148B是程序编译时确定的地址。这样一减就得到运行地址和编译地址的差值。那上面的mov eax, [0x04000100] 改造成 mov eax, [EBX + 0x04000100] 就可以准确无误的执行了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值