根据逆向相关资料;下面有2段ASM代码;
1;
start_:
xor eax, eax
test eax, eax
jz label1
jnz label1
db 0E8h ;垃圾指令
label1:
xor eax, 3
add eax, 4
xor eax, 5
ret
2;
start_:
xor eax, eax
test eax, eax
jz label1
jnz label0 ;指向无效的跳转指令
label0:
db 0E8h
label1:
xor eax, 3
add eax, 4
xor eax, 5
ret
end start_
代码1添加了垃圾指令;
代码2添加了更垃圾一些,一个指向无效地址的跳转指令;
会迷惑反汇编器;导致反汇编出错;
在反汇编的过程中,存在几个关键问题;代码与数据的区分,汇编指令长度,多种多样的间接跳转实现形式;
反汇编算法必须恰当处理,保证反汇编结果的正确性;
主要的两类反汇编算法是:线性扫描Linear Sweep,递归行进Recursive traversal;
下面先来鼓捣一下;把这两段代码构建为exe文件;再用反汇编器打开;看有没有干扰的效果;
本机是win10;安装有masm32;
如果masm32环境变量没搞的话;先set path=g:\masm32\bin;%path%;
先把代码直接存为asm,然后ml;
出现两个错误:
1.asm(1) : error A2034: must be in segment block
1.asm(2) : error A2085: instruction or register not accepted in current CPU mode
那就还是要加以下几句在头部:
.386
.model flat,stdcall
option casemap:none
.code
因为代码看上去像是DOS汇编;执行如下;
ml /c 1.asm
link 1.obj
提示错误:
1.obj : warning LNK4033: converting object format from OMF to COFF
LINK : fatal error LNK1561: entry point must be defined
试验几次后;还是要如下图;才能构建出exe;
ml要带 /c /coff;link要带 /subsystem:windows;
然后1.exe,2.exe构建出来了;
根据逆向资料;1.exe会被W32DASM错误识别;
W32DASM在win10下使用;要先搞一下兼容性;
打开1.exe,看一下,果然反汇编错误;迷惑到了;
1.exe会被ollydbg正确识别;如下;加的 db 0E8h ;垃圾指令 这条,被识别;
根据逆向相关资料;代码2会迷惑到ollydbg;打开看一下;
但是没有迷惑;正确识别了;应该是工具进步了;上面用的是ollydbg 2.x;
然后用ollydbg 1.x打开2.exe;识别错了;如下;
把这个花指令放到VC++嵌入汇编里面运行看看;
不能运行;嵌入汇编只能运行汇编代码块;不能带db和标号;
这两个exe不要运行它;只是用它看一下花的效果;
注意1.exe和2.exe被ollydbg反汇编后,只有00401006地址处略有差别;