用鲜为人知的指令替换常见的 x86 指令

逆向工程 混淆 x86
2021-06-26 04:05:18

是否有任何类型的软件或研究或论文讨论将频繁的 x86 指令替换为不太常见且因此攻击者难以理解的指令(浮点/SSE/虚拟化/未记录),同时仍保持功能?

例如,我想替换这个

    PUSH EBP
    MOV EBP,ESP
    ...
    PUSH DWORD [0x0BEE]
    PUSH 3
    CALL <check>
    TEST EAX,EAX
    JE <0xabcd>
    PUSH <text1>
    PUSH [EBP+5]
    CALL <MessageBox>
0xabcd:
    PUSH <text2>
    PUSH [EBP+5]
    CALL <MessageBox>

有了这个

    AESKEYGENASSIST
    VFMSUBADDPD
    MOVLPS
    PMADDUBSW
    RET
    FLDL2T
    CMPXCHG8B
    AESKEYGENASSIST
    VFMSUBADDPD
    MOVLPS
    CMPXCHG8B
    STOSW
    VMLAUNCH
    etc etc

同时仍然执行相同的操作。

2个回答

这些改变代码(并在语义上仍然保持等价)的技术被称为多态代码

能够实现代码突变的软件通常称为多态引擎它是恶意软件设计中一种相当广泛使用的技术,用于逃避防病毒软件的模式匹配检测。

掌握这些关键词(并感谢谷歌),您将能够找到大量关于该主题的文献。但是,这里有一些提示:

您还可能会发现多态引擎已准备好启动。只是寻找它。

我不认为代码射为还是一个回答这个问题。

问题是通过使用不太常见或未记录的汇编指令来混淆算法实现。当打开大量优化时,这实际上可以由一些编译器完成。例如,英特尔 C 编译器GCCPGI 等编译器在匹配某些内部模式(缩减矩阵乘法等)以及目标架构支持矢量化时可以自动矢量化循环其他优化可能会导致极其棘手的汇编代码,但仍然可以逆转,因为编译器不执行显式混淆,因为编译器所做的大部分工作是模式匹配。当然,如果您将高级模式与低级模式相关联,那么您就不会混淆,并且您的代码很容易被反转。因此,您正在寻找的技术只能通过使用编译器内在函数和替代结构编写高级代码或在程序集级别手动执行。

如果您真的对混淆技术感兴趣,我建议您阅读 Jan CAPPAERT 的博士论文:https ://www.cosic.esat.kuleuven.be/publications/thesis-199.pdf ,它涵盖了一些不仅用于恶意软件的不错的技术但在工业软件上也是如此。书目相当丰富。您还可以查看 Sean Taylor 在 Defcon 上关于如何让编译器进行混淆的演讲:https : //www.defcon.org/images/defcon-17/dc-17-presentations/defcon-17-sean_taylor- binary_obfuscation.pdf

关于多态性,它是一种很好的混淆技术,尽管现在很少在恶意软件中使用它,原因有很多。其中之一是恶意软件作者很少(如果没有)再用汇编编写代码,并且大多数使用框架和引擎。你必须记住,编写混淆的汇编代码是一门艺术……现在它被用来强化逆向工程过程,以谋取利益,而不是为了挑战。

我一直在研究一个GCC插件,它添加了一个优化传递,在应用程序集级别的另一个混淆传递之前,它对代码的 IR - 内部表示 (GIMPLE) - 执行代码混淆。这种方法的有趣之处在于,您在编译时拥有程序的 CFG(控制流图),您可以应用许多混淆算法和技术将其分解为其他等效的 CFG,然后评估哪些套件最好并使用它贯穿剩余的编译阶段。

希望我的帖子有帮助。