下面的汇编代码为什么是一种反调试工具?
l1:
call l3
l2:
;some code
l3:
mov al, 0c3h
mov edi, offset l3
or ecx, -1
rep stosb
我知道 C3h 是 RETN
,而且我知道 stobs
会根据 edi
中的偏移量将 al
中的值写成操作码,并重复执行 ecx
次,因为有 rep
前缀。
我还知道如果在英特尔架构上预提取了 stobs
和 stosw
,它们将会运行其原始格式。
如果我们以调试模式运行程序,则预提取就不相关了,并且将运行 l2 标签(因为它是单步骤)。否则,如果没有调试器,它将在 l1 和 l3 之间来回切换,对吗?