一段花指令

您可以任意转载这篇文章,但请在转载时注明原始链接和作者,谢谢。

今天用OllyDbg为某个软件脱壳的时候,发现了一小段令人费解的机器码。这段机器码经IDA解释后如下:

pusha ; 60
call near ptr loc_10116007+3 ; E8 03 00 00 00
loc_10116007:
jmp near ptr 556E64F7h ; E9 EB 04 5D 45
db 55h
db 0C3h
db 0E8h

是的,这就是传说中的花指令了。我于是将其重新排列并解析,如下:

pushad ; 60
call near ptr proc1 ; E8 03 00 00 00
db 0E9h
jmp short line2 ; EB 04
proc1:
pop ebp ; 5D
inc ebp ; 45
push ebp ; 55
retn ; C3
line2:
; other code....

这段代码的第二行进行了一个近调用至proc1,proc1中的三行代码则将堆栈的栈顶(亦即ESP指向的位置)值加1,于是之后ret的返回地址便越过了e9的这一个字节并执行后面的近跳转,这个近跳转则会越过proc1的四个字节,最后执行line2处的真正代码。相比之下,静态分析的IDA却不会智能跳过这个字节,于是这个字节便被解释成为了跳转指令jmp。这样一来后面代码的解析也就被打乱了,加密者的目的也就达到了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值