那个时候,自己玩得不亦乐乎,已经开始把它当游戏玩了。 62R94
_?vh#6F
我自己写过一个反跟踪的小程序,只有几条指令,做成一个宏,可以插在任意地方。很有效,但也可能很危险。 |NbF3 fD
=aWj+ggd@
那个年代对指令和数据没有什么严格区分的,只要把DS取成CS一样的值,就可以在运行过程中修改代码。现在,则有人会利用一此漏洞,在数据中插入代码,然后利用这些代码来窃取点什么。
Gj~1eS
8$|<`:~J
这个反跟踪程序利用了CPU的指令预取(prefetch)特征,在绝大多数情况下,CPU在运行一条指令时,除非是跳转指令,下面的几条指令已经在CPU中排队了,并不需要从内存中读指令。 ,s%1#cbR
n>)'!
所以,如果正在运行的指令修改了下一条指令,在全速运行且不中断时,这个修改只改变了内存中的东东,而CPU指令流水线中的并不会改变。但是,如它在被跟踪进,这条指令修改后,下一条指令已经被上条修改,所以,运行结果就会完全不同了。 YpAJ7E|7
pT90TcI2
antitrace macro %~V+wqu
]vyu
!
pusha kHO2&"6
CLI 9(9+h]h+3
mov dx, CS C+*qU
mov DS,DX
g1je':
nextInst: Vr1Wr%
lea BX, nextinst+8 qfO=_z ES
mov [bx],DX COE,pb17
STI l1_Tr2A}7/
POPA dFd^@b
MWsjkI`
endm +>em
!~3
`m~x*)L#
我在8086-80486系统上试过,都没有问题,当然测试次数也没有像那些Benchmark程序那么多,反正只要插入这个宏,在所有有此宏的代码段,程序都不能被跟踪,因为一跟踪,在mov [bx],dx后,后面两条指令就变成随机的了(DX只是当前的DS段值,与程序加载内存位置有关)。所以,它到底可靠性多高,吃不准。不过,这东东一旦出错,后果也是完全不可预料的。 !n=?H1@
i/&?e+i