反调试之FAKE F8
在调试程序时,单步执行和单步步入的区别:
在执行CALL指令时(也就是高级语言中调用函数),单步执行是通过下断点的方式实现的,将需要停止的地方修改为INT 3,其对应的十六进制为0XCC,也就是修改执行CALL指令的下一步。所以中间的过程会直接运行不会停止
而单步步入将EFL寄存器(FLAG寄存器)中的TF标志位(Trap Flag)置为1,此时CPU进入单步执行模式
例如有这样的程序

当执行CALL指令时,下一步0X40EF3A的地址会被压入栈中,修改EIP的值为0X0040EF61,并且ESP寄存器的值-4
由于是单步,程序不会停止,除非遇到0XCC,当执行到EIP所指向的0X0040EF61时,这行指令将ESP指向的堆栈内存修改为1,ESP被修改前储存的是0X0040EF3A,也就是执行CALL时的下一步地址
当执行到RET时,栈顶内存已经被修改为1,此时RET指令会将EIP修改为栈顶内存(1),然后ESP+4,并执行EIP指向的指令,最终调试过程丢失。
署名-非商业性使用本文采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ZEKALRYN'S BLOG!
评论
