首页 > 编程知识 正文

全部清除(逆向分析基础 --- 花指令实现及清除)

时间:2023-05-03 08:30:07 阅读:123565 作者:3901

一、基本概念花指令:目的是干扰ida和od等软件对程序的静态分析。 防止这些软件成功反汇编原始代码。

常用的两种反汇编算法:

1 .线性扫描算法:逐行反汇编(无法区分数据和内容) ) ) ) ) ) ) ) )。

2 .递归进行算法:按代码的可行顺序进行反汇编。

简单的花指令0xe8是跳转指令,可以干扰线性扫描算法,但递归扫描算法可以正常分析。

两个跳跃一个指向无效数据,另一个指向常规数据以干扰递归扫描算法。

二、花指令实现此处的实验基础代码参考安全客人面前的师傅代码进行

//源代码# include stdio.h # include windows.hint main (int argc,char* argv[] () inta=messagebox ) null,' Hello int b、c、d、e; //这是花指令部分__asm{_emit0xe8} //花指令结束b=1; c=2; d=3; e=4; 返回0; } 1.简单的jmp这是最简单的花命令。 OD还是可以被骗的。 但是,ida采用递归扫描的方法,因此可以正常识别

_ _ ASM { jmp label1dbjunkcodelabel 1: }

2 .多层跳本质上和简单的跳一样,但是增加了几个层跳。 很明显不能干涉ida

开始://花命令开始jmp label1dbjunkcodelabel 1: jmp label2dbjunkcodelabel2: jmp label3dbjunkcodelabel 3

3.jnx和jx的条件跳转使用jz和jnz互补的条件跳转命令代替jmp。 居然没骗过OD,是因为吾爱的这个有插件吗? 但是ida没有正常识别

_ ASM { JZ label1jnzlabel1dbjunkcodelabel 1: }

4 .永真条件通过设置跳转永真或永假,程序将始终运行,其中ida反汇编优先反汇编以下部分(假分支) : 调用特定函数时,将返回确定值,也可以满足结构化的永恒或永恒的假条件。 ida和OD都被骗了

_ _ ASM {需要恢复push ebx xor ebx、ebx test ebx、ebxjnzlabel1JZ label2label 1: _ emitjunkcodelabel 23360 pop ebx///ebx寄存器}

5.callret结构花命令这里利用call和ret,在函数中修改返回地址,目的是跳过thunkcode,进入正常过程。 可以干扰ida的正常识别

_ _ ASM { call label1_ emitjunkcodelabel 1: addwordptrss : [ esp ],8//具体增加多少取决于调试

6 .汇编指令共享opcode jmp条指令,是inc eax的第一个字节,inc eax和dec eax抵消影响。 这个共享opcode确实很麻烦

三、清除花指令1 .手动清除找到所有花指令,重新设置数据和代码地址。 或将花命令设置为nop(0x90 )

0x401051设置为数据类型(快捷键d ),0x401052设置为代码类型(快捷键c )

现在,我们使用ida python脚本添加ALT N快捷键,并将指令的第一个字节设置为NOP

fromidaapiimport * fromidcimport * defnopit (: start=get _ screen _ ea ) patch_byte ) start,0x90 ) refresh_ea

互补条件跳转(比较容易处理)永真条件跳转(各种永真条件难以匹配) callret跳转(比较难处理),所以只对第一类jnx和jx的花命令进行自动化处理

所有的跳转命令、互补跳转命令只有最后一位不同

70jo (o标志位为一跳) 71jno 72JB/jnae/jc73jnb/jae/jnc 74JZ/je75jnz/jne 76jbe/jna 77jnbe/jnc 73 简单的是x03和x01

抄的代码

from ida_bytes import get_bytes,patch _ bytes start=0x 401000 # startaddrend=0x 422000 buf=get _ bytes (开始,结束) x90 ' * ln buf [ pln : ] fake _ JCC=[ ] foropcodeinrange (0x 70,0x76f, 2 x03'chr(opcode|1 ) (x01 ' fake _ JCC.append (pattern.encode ) ) pattern=chr ) opcode| 1 ) ) x03 ' chr x01 ' fake_JCC.append (pattern.encode () print ) fake _ JCC ) forpatterninfake _ JCC 3365284; buf

2 .也可以用等效替换程序集。

3 .增加无意义的汇编代码,除前后改变EIP外,什么都不改变。

根据程序的不同,可能会有独特的花命令,但自动生成后,可以提取特定的规则并自动将花命令转化为花。

很多花命令的类型只能慢慢积累。

也可以使用正则表达式的方法(我觉得很难使用)。

多数情况下,需要记录执行时的条件(接近jcc跳跃的几个汇编模拟执行判断是否一定会发生jcc跳跃) ) clc; jne|xor eax.eax; 像test eax、eax、jnz这样的记录接近了几个)

参考链接

鲜花指令总结

3359 www.anquan ke.com/post/id/236490

反向学习笔记花命令

33559 www.anquan ke.com/post/id/208682

反向-移除花命令(脚本)

3359 blog.csdn.net/whklhhh/article/details/88730934

《恶意代码分析实战》

Intel硬编码(1) Opcode Map、定长指令、指令前缀

3359 blog.csdn.net/apollon _ krj/article/details/77508073

ida python函数查询

3359 hex-rays.com/products/IDA/support/IDA python _ docs /

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。