【原创】手脱花指令及IDA脚本编写
作者论坛账号:flatcc
综合许多篇帖子而成,大多参考以末尾参考文章形式给出,适用于初学者,感谢大家提出意见。可结合末尾源码参考学习。感觉有用的话感谢大佬们点个赞。
简介
作用
欺骗反汇编器,让反汇编器无法正确反汇编出汇编代码,具体来说是破坏了反编译的分析,使得栈指针在反编译引擎中出现异常
从而加大静态分析的难度,使得逆向分析人员难以识别代码的真正意图
原理
由于反编译器的工作原理一般是线性扫描算法或递归下降反汇编算法。
线性扫描反汇编算法从程序的入口点开始反汇编,然后对整个代码进行扫描,反汇编扫描其过程中所遇到的每条指令。那么线性扫描算法的缺点也就显而易见了,由于其不定常的指令格式,在反汇编扫描过程中无法区分数据与代码,从而导致将代码段中嵌入的数据误解释为指令的操作码,以致最后得到错误的反汇编结果。
递归下降算法,递归下降算法通过程序的控制流来确定反汇编的下一条指令,遇到非控制转移指令时顺序进行反汇编,而遇到控制转移指令时则从转移地址处开始进行反汇编。该算法的缺点在于难于准确确定间接转移的目的地址。
PATCH方法
先在IDA中开启字节码的显示,我这里设置显示的字节码是8。

以下图中的花指令为例,我们鼠标光标点到0x004560FF,然后按快捷键D
,在下方为指令的地址0x00456100地址处,按快捷键C
将其转换为指令。然后将0x004560FF处的0xE8
Patch为0x90
,也就是打补丁为nop指令。

然后保持副本即可。
实现案例
简单花指令-多层JMP嵌套
如下是单层的JMP形式:

甚至如下的多层嵌套:

如下图,因为IDA使用的是递归下降算法进行反汇编,所以这种花指令可以被IDA轻松识别。

互补条件代替JMP跳转
类似如下形式,无论如何都会跳转到LABEL1处:

在如下代码中,先对eax进行xor之后,再进行test比较,zf标志位肯定为1,就肯定执行jz LABEL2;
,也就是说中间0xC7永远不会执行。要记得:先压栈保存eax的值,最后再把eax的值pop出来。

如下图,我们可以看到,IDA虽然识别栈帧错误,但是正确的程序流还是比较清晰的。

再如下,我们将中间填充代码改为0x21
,混淆效果明显了一些,结果如下。

那么我们再来一个加强版,代码如下:


call&ret构造花指令
如下案例,代码中的esp存储的就是函数返回地址,对[esp]+8,就是函数的返回地址+8,正好盖过代码中的函数指令和垃圾数据。

如下图所示,是上述花指令代码的效果,这里最好自己动态跟以下。

call 指令的直观理解:push 函数返回地址; jmp 立即数
ret 指令的直观理解:pop eip; add esp,4
利用函数返回确定值
有些函数返回值是确定的,比如我们自己写的函数,返回值可以是任意非零整数,就可以自己构造永恒跳转。
还有些API函数也是如此,比如在Win下HMODULE LoadLibraryA(LPCSTR lpLibFileName);
函数,如果
我们故意传入一个不存在的模块名称,那么他就会返回一个确定的值NULL
,此时就可以通过这个函数来构造永恒跳转。如下例子:

混淆效果如下:

call和ret的组合
如下代码:



也就是说思路有很多种,按照自己喜欢的方式组合,只要不影响其他正常代码的运行就可以,如下也是比较好的两种思路
call嵌套的其他思路1

call嵌套的其他思路2

花指令原理另类利用
当我们理解了花指令的原理后,我们可以在将花指令中的垃圾数据替换为一些特定的特征码,可以对应的$“定位功能”$,尤其在SMC自解码这个反调试技术中可以运用。例如:

将这串特征码hElLowoRlD嵌入到代码中,那我们只需要在当前进程中搜索hElLowoRlD字符串,就可以定位到当前代码位置,然后对下面的代码进行SMC自解密。
小结
构造永恒跳转,添加垃圾数据
综合题目案例
IDC脚本去花
我们以题目[MSLRH].exe
为例子,分析一段花指令,使用IDA中的快捷键D
和C
来手动过花指令。手动分析清楚其流程后,我们可以写一个脚本,来批量匹配花指令的模式NOP
掉影响静态分析的代码。

写好的IDC脚本如下:

使用IDAPython去花

附带源码见论坛原文。
参考
反汇编基础:https://tinytracer.com/archives/反汇编基础/
自动获取驱动程序IO控制码初级版:https://bbs.pediy.com/thread-153965.htm
花指令总结:https://www.anquanke.com/post/id/236490
反编译系列教程(上):http://drops.xmd5.com/static/drops/papers-13686.html
_emit伪指令:https://docs.microsoft.com/zh-cn/cpp/assembler/inline/emit-pseudoinstruction?view=msvc-160
IDAPython官方文档:https://hex-rays.com/products/ida/support/idapython_docs/
IDAPython脚本示例:https://www.cnblogs.com/shenshuoyaoyouguang/p/13841078.html
IDAPython动态调试开发技巧:https://www.bbsmax.com/A/x9J27Lgg56/
论坛原帖地址:https://www.52pojie.cn/thread-1512089-1-1.html