上一篇解决了病毒程序调用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] 就可以准确无误的执行了。
初探计算机病毒(4)--重定位
最新推荐文章于 2023-12-17 22:20:53 发布