上QQ阅读APP看书,第一时间看更新
2.6 逆指令流技术实现加锁
所谓逆指令流加密技术其实就是把汇编程序的机器码由高地址向低地址排列,运行时从高地址向低地址顺序执行,从而人为地使指针递减。由于汇编指令的长度可为1~6个字节,因此,要实现逆运行,就需要知道当前执行指令的长度,只有这样,才能确定下一条指令的起始位置。
在对指令长度进行确定时,由于其最长条指令为6个字节,因此就可以将其逆运行部分当前执行指令起始位置的6个字节移到起始位置之后,再从起始位置开始顺向执行一条指令,并且在执行完之后,由CS:IP自动指向下一条指令的起始地址,然后根据前后指令的差,就可以知道该条指令的长度了,也就可以据此推算出逆行程序中下一条指令的实际位置,这样一条一条就能将指令“逆运行”起来了。
因此,要实现逆运行就必须进入单步执行状态,这就需要满足如下两个条件。
① 设置单步中断INT1。
② 将标志寄存器的单准许位TF置为1(因为TF=1时,每执行完一条指令,CPU就自动产生一个INT1)。
当上述两个条件满足之后,再自设一个新的INT1来代替DOS中设定的INT1,并且在逆运行程序中出现的软中断必须使其能够顺序执行,完成后再回到逆运行状态,因此,就需要在新的INT1中完成4个条件。
① 每次需要将指令代码前的6个字节移到指令代码之后。
② 当遇到为00的指令代码时,则表示逆运行结束,恢复为正常状态。
③ 当遇到为CDH的指令代码时,则表示为一条INT指令,要将其改为顺序运行方式,在执行完中断之后,再恢复成逆运行方式。
④ 将逆运行程序中的第一条指令地址作为某一变量(如AD)的初始值(最好将逆运行程序的第一条指令定为单字节指令,如CLI等),通过INT1的返回地址算出指令长度,然后由AD的内容减去此长度,则为AD中下一条指令的起始地址,从而就实现了指针的递减。