举个简单的例子:
代码清单29.1: 花指令
add esi, eax ; garbage
add eax, ebx
mov edx, eax ; garbage
shl edx, 4 ; garbage
mul ecx
xor esi, ecx ; garbage
如果开发人员肯定ESI寄存器始终为0:
mov esi, 1
dec esi
... ; some code not touching ESI
cmp esi, 0
;fakeluggage
real_code:
逆向工程需要一段时间才能够执行到real_code。这也被称为opaque predicate。 另一个例子(同上,假设可以肯定ESI寄存器始终为0):
instruction 1
instruction 2
instruction 3
可以被替换为:
dummy_data1 db 100h dup (0)
message1 db ’hello world’,0
dummy_data2 db 200h dup (0)
...
mov eax, offset dummy_data1 ; PE or ELF reloc here
add eax, 100h
push eax
call dump_string
...
mov eax, offset dummy_data2 ; PE or ELF reloc here
add eax, 200h
push eax
call dump_string
...
IDA仅会显示dummy_data1和dummy_data2的引用,但无法引导到文本字符串,全局变量甚至是函数的访问方式都可能使用这种方法以达到混淆代码的目地。