title: 汇编达人视频学习5
date: 2021年8月4日 10点10分
tags: 汇编达人
categories: 汇编达人
反调试之Fake(伪装、欺骗)F8
1、单步步入(F7) 单步步过(F8)
(1)单步步入与单步步过的区别
在执行普通的指令的时候,F7与F8其实差不多,但是在执行CALL指令的时候,有很大的差别。
在执行CALL指令的时候,先把CALL指令后面的那个地址,存入EIP中,然后把CALL指令的下一行指令的地址送入堆栈中,然后ESP的值减4.
如果我们在CALL指令后面的那个地址处,继续写指令,当F8的时候,它会把你的这好几条指令,当做一条指令,一下就执行完了,但是F7不一样,F7会去一步一步的执行。
(2)调试器实现原理:
断点:0xCC
单步步入:设置EFLAGS的TF位
单步步过:在下一行设置断点
(3)断点:
**快捷键F2:**断点的作用就是程序执行到断点的时候,会停下来。
(4)断点的本质
其实是指令INT 3
当CPU执行的时候,见到INT 3 的时候就会停下来,停在调试器里。
当我们设置断点的时候,那么这一行汇编对应的机器码的第一个字节将被改写为 CC ,尽管调试器不会显示,但是实际上已经进行了更改,调试器在执行到这里检测到了 0xCC 之后就会断下。(0xCC是int 3 的机器码。)
2、通过一个小技巧,反调试
从图上我们可以看到,CALL指令,先将后面的地址,00AD1396放入EIP中,然后将00AD1360这个地址放入堆栈中,然后ESP减4.
然后执行CALL地址后面的指令的时候,有一个RET指令,RET指令所做的事情就是,将当前栈顶的值放入EIP,同时ESP加4,也就是执行RET之后,程序会跳转到00AD1360处再执行,这是一般程序员的思想。
接下来,我们利用这个思想来让别人调试程序的时候,跟丢。
我们通过上面知道了,当遇到CALL指令按F8的时候,会把下一行指令的地址压入堆栈中,我们直接在CALL指令后面的那个地址处修改ESP的值,mov dword ptr ds:【00AD13AC】,然后再加一个RET指令,这样当别人再按F8的时候,我们的ESP的值,会跳转到其他地方去,而回不去CALL指令的下一行地址,这样就会让别人调试的时候跟丢。但是这个对F7来说是没用的。
当我们想迷惑破解人员的时候,可以写大量的没有意义的调用。一个CALL,跟进去之后,可能有一万行代码,而且还是无用的代码,以此来消耗破解人员的耐心。这是目前一个简单知识实现的反调试欺骗F8。还有很多很多的反调试方法。