那个时候,自己玩得不亦乐乎,已经开始把它当游戏玩了。 by
{~gu
,FTF@h-Cs
我自己写过一个反跟踪的小程序,只有几条指令,做成一个宏,可以插在任意地方。很有效,但也可能很危险。 O/Fzw^
Na=q(OKN
那个年代对指令和数据没有什么严格区分的,只要把DS取成CS一样的值,就可以在运行过程中修改代码。现在,则有人会利用一此漏洞,在数据中插入代码,然后利用这些代码来窃取点什么。 4l|Am3vzX
m*'#`v Ibb
这个反跟踪程序利用了CPU的指令预取(prefetch)特征,在绝大多数情况下,CPU在运行一条指令时,除非是跳转指令,下面的几条指令已经在CPU中排队了,并不需要从内存中读指令。 yoH6g?!O
'D1@+FFU0
所以,如果正在运行的指令修改了下一条指令,在全速运行且不中断时,这个修改只改变了内存中的东东,而CPU指令流水线中的并不会改变。但是,如它在被跟踪进,这条指令修改后,下一条指令已经被上条修改,所以,运行结果就会完全不同了。 D526X0
{E9Y)Z9
antitrace macro dCHU* 7DS
u*M*WpY
pusha u!Z&c7kPI
CLI u^ T2
mov dx, CS h41v}5
!-
mov DS,DX u$0>K,f
nextInst: 0<Y)yNsV
lea BX, nextinst+8 cIgF]My*D@
mov [bx],DX w4OVfTlN
STI ' o5,P/6
POPA yY1&hop
g$<@!
endm |$D^LY
6} 9A0
我在8086-80486系统上试过,都没有问题,当然测试次数也没有像那些Benchmark程序那么多,反正只要插入这个宏,在所有有此宏的代码段,程序都不能被跟踪,因为一跟踪,在mov [bx],dx后,后面两条指令就变成随机的了(DX只是当前的DS段值,与程序加载内存位置有关)。所以,它到底可靠性多高,吃不准。不过,这东东一旦出错,后果也是完全不可预料的。 3y@'p(}Az
S4 Rv6{r: