Lab15-01 常用的反汇编总结
在《恶意代码分析实战》的第十五章总结了一些常见的反汇编案例,包括线性返回编译器和非线性返回编译器的对抗。这里总结了其中提到的几个原理,每个都配合着实验了说明,这篇笔记只是我在做分析时的一些总结,方便后续回来看。
相同目标跳转指令
问题
在x86汇编指令中,无条件跳转指令jmp
是跳转指令之一。在一些恶意样本中会针对的插入一些指令来完成这个无条件跳转,如下
从上面的指令看处,jz jnz
都是跳转到了call
的下一条指令,但是这里有一个问题,如果跳转指令要跳转到一个函数,不可能从函数的第二条指令开始执行,应该是从头开始执行,同时这个跳转地址也是红色的,因此这里的call
指令是一个对抗指令。
解决
解决的办法是手动patch掉这个调用指令,每个call
对应的机器码都是5个长度的指令,为了能正确时程序变得正常
-
首先用鼠标选择
call
指令 -
选中后按下
D
按下后程序会变为数据的形式,但是
0xE8
会被单独提出来,剩下的指令会单独成一个快,类似如下jz short near ptr loc_4011C5 jnz short near ptr loc_4011C5 db 0E8h loc_4011C5: db xxx db xxx
-
如上的形式后,从
loc_4011C5
开始使用C
键转为指令,如下
这里需要关注的是跳转指令跳转到每一个函数快的入口应该是从第一条指令开始执行,不是从第二条指令。
固定目标跳转
问题
固定目标的跳转是程序会永远都会执行跳转,即永远为真的情况如下
这里的xor eax,eax
会将eax
置位零,同时修改ZF=1
,导致jz
指令会永远执行,这里同样的注意到,跳转指令
jz shor near ptr loc_4011C4+1
loc_4011C4:
jmp near ptr 94A8D521h
解决
和相同目标跳转
类似,这里考虑跳转指令还是会执行到loc_4011C4
的下一个指令,这是不合理的,解决办法为
-
首先用鼠标选择
jmp
指令 -
选中后按下
D
按下后程序会变为数据的形式,但是
0xE8
会被单独提出来,剩下的指令会单独成一个快,类似如下xor eax,eax; jz loc_4011C5; db 0E9h loc_4011C5: db xxx db xx
-
如上的形式后,从
loc_4011C5
开始使用C
键转为指令,如下
这里还是会忽略掉0E9h
这个数据转为指令。
总结1
相同目标跳转指令和固定目标跳转这两个技巧都是在