代码混淆(smc和flower)
代码混淆(smc和花指令)
自修改代码(Self-Modifying Code, SMC)
SMC,即Self Modifying Code,动态代码加密技术,指通过修改代码或数据,阻止别人直接静态分析,然后在动态运行程序时对代码进行解密,达到程序正常运行的效果。
SMC的实现方式有很多种,可以通过修改PE文件的Section Header、使用API Hook实现代码加密和解密、使用VMProtect等第三方加密工具等。
这里我们把函数的代码提取出来然后进行加密解密.
- 有点lazy,懒得总结了,一般可以把被加密的那一段代码解密或者动态调试就能找到我们想要的,之前学过的不是很想看了,当一下lazydog jump掉吧
花指令
- 简介
利用花指令可以增大代码的阅读难度,并且使得工具无法轻易的反编译,也极大增加了静态分析的难度
原理
反编译器这种并没有想象中的智慧,他们都是利用的线性反编译.从机器码挨个读取内容,这就会导致有时候我们插入一些不被使用的垃圾代码比如这个代码被跳转的时候,他仍然会错误的编译他导致后续无法成功解析出来,当然常用的ida其实是 利用的递归下降,遇到call这种跳转的时候就会直接到call的分支进行分析
当然遇到递归下降这种形式我们可以利用一些条件判断的跳转来绕过或者是一些其他方法我们
简单的花指令
这里就不讲那种能直接跳过的形式了
- 多层判断但是一定会发生
实例
asm这里jz和jnz跳转条件分别为zf=1和zf=0,则一定会跳转.1
2
3
4
5
6
7asm
{
Jz Label
Jnz Label
Db thunkcode;垃圾数据
Label:
}
示例

1 | |
稍微复杂一点
1 | |
我改了一下默认使用 intel语法局部,and then
这里先跳转到1这个位置,然后 再给栈顶存储的 rip-15 然后再跳过0xf3然后就能得到我们想要的值.
这里就直接跳转到我们期待的位置了.ok
插入一些废话组合
示例
1 | |
0xFF ,0xC0是inc eax
0x48 是dec eax
刚好eax 加一 减一就直接恢复了,不过直接这样写显然没什么用,我们首先插入一个0xEB
就能得到
这里是从0xEB 后跳到0xff重新开始运行就相当于nop掉0xEB 但是呢 因为0xeb本身存在ida还是会错误的读取.
1 | |
值得注意的是. 如果你后面跟着的正常代码有可能还是会和0x48搅在一起导致出错,这样的花指令就按情况而定了.
题目
要睡觉了懒得写出来了,太简单了也没啥好写的就做了geek 的only_flower和 newstar2024的 flower. smc的话就是ez_smc
总结
动态调试+smc+花指令,还是太慢了,花的时间比较少…….有点摆子
对于花指令来说的话可能就是得学会看汇编不然还是比较吃力,还有就是哪里红了点哪里.
不过只是看到红了全nop掉还是挺没意思的. 暂时遇到的强度都不高,或许是我缺乏对自己的挑战性哈哈哈,反正不会的就问一能工智人……,最困难的可能就是看十一样的cpp反汇编,观感太差了.
画饼环节:
- 学习脱壳相关的吧
- ida工具使用,反正暂时不会写idapython,应该要看一看
- 学习vm