Reverse花指令及反混淆
花指令及反混淆
1.花指令
花指令是反调试的一种基本的方法。其存在是干扰选手静态分析,但不会影响程序的运行。实质就是一串垃圾指令,它与程序本身的功能无关,并不影响程序本身的逻辑。在软件保护中,花指令被作为一种手段来增加静态分析的难度。IDA并不能正常识别花指令,导致可看可分析代码被破坏,因此需要我们自己去分析一下。花指令主要分为两类:可执行花指令和不可执行花指令。
- 可执行花指令:花指令在程序正常运行的时候被执行,但不会影响程序正常运行
- 不可执行花指令:花指令在程序正常运行的时候不会被执行
常见混淆的字节码:
| 机器码 | 汇编语言 |
|---|---|
| 9A | CALL immed32 |
| E8 | CALL immed16 |
| E9 | JMP immed16 |
| EB | JMP immed8 |
2.常见花指令分析
(1)单字节
#include <stdio.h>
int main()
{
__asm {
jz start; //jz 和 jnz 同时出现,导致永恒跳转
jnz start;
_emit 0xE8; //这个地方就是故意插入的花指令 CALL + 地址
}
start:
printf("ok!");
return 0;
}
例如:[NSSRound#3 Team]jump_by_jump
发现main函数编译不了 向下观察发现花指令

去除花指令 按D快捷键 先将call 转成硬编码 E8

再将光标放到 db 0E8上 将E8改成 nop(90) 再次按C键 点yes 将硬编码修复成代码

然后向下逐⼀修复 将光标放置在⻩⾊⾏上 按C修复 直到没有⻩⾊地址

将光标放置到函数开始的位置按 P键⽣成函数 最后tab转成伪代码

(2)永恒跳转
int main()
{
__asm {
xor eax, eax;// eax ^ eax = 0
jz s; // 必然成立跳转,一定会跳转
_emit 0x11; //填充垃圾指令 byte类型
_emit 0x22; //填充垃圾指令 byte类型
_emit 0x33; //填充垃圾指令 byte类型
s:
}
printf("test \n");
}
(3)更改ESP
int main()
{
__asm {
xor eax, eax;
jz s;
add esp, 0x11; // IDA 会把此指令识别对函数堆栈进行操作,导致识别函数失败
s:
}
printf("test \n");
}
(4)jmp跳转插入无效垃圾指令
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
_asm {
jmp $+5
_emit 0x71
_emit 2
_emit 0xE9
_emit 0xED
}
lable:
printf("ok2");
return 0;
}
(5)嵌套永恒跳转
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
_asm {
jz Label3;
jnz Label3;
_emit 0xE8;
}
Label2:
_asm {
jz Label4;
jnz Label4;
_emit 0xE8;
}
Label3:
_asm {
jz Label1;
jnz Label1;
_emit 0xE9;
}
Label1:
_asm {
jz Label2;
jnz Label2;
_emit 0xE9;
}
Label4:
printf("ok2");
return 0;
}
3.反混淆
方法一:手动恢复
适用条件:混淆少且类型单一
为了尽快解除题目,我们一般选择先手动去除混淆,迅速拿到flag
这里需要掌握IDA的基本快捷键:U、C、P
- U: 在IDA Pro中,按“U”重新定义汇编,转换为字节码格式
- C: 在IDA Pro中按“C”,转换字节码为汇编形式
- P: 在IDA Pro中,按“P” 转换汇编语言为高级语言函数视图
方法二:IDA-Python脚本恢复
适用条件:混淆大量,手工基本不可去除
需要拿到混淆的字节码组成,利用脚本去除大量混淆。
例如:[GFCTF 2021]wordy

出现大量机器码为EBFF的花指令,如果手动nop很费,所以这里用idapython
import idc
import ida_bytes
start_add=0x1144
end_add=0x3100
for address in range(start_add, end_add):
new_byte = ida_bytes.get_byte(address)
next = ida_bytes.get_byte(address + 1)
nnext = ida_bytes.get_byte(address + 2)
if new_byte == 0xeb and next == 0xff and nnext == 0xc0:
ida_bytes.patch_byte(address, 0x90)
首先循环遍历从 0x1144 到 0x3100 的地址。在每个地址处,检查当前字节是否是 0xeb,下一个字节是否是 0xff,再下一个字节是否是 0xc0。如果匹配到 0xeb 0xff 0xc0 这个字节序列,就将当前地址处的字节 0xeb 修改为 0x90。0x90 在汇编语言中是 NOP 指令,表示“无操作”,即这个指令不会对程序执行产生影响。
Reverse花指令及反混淆的更多相关文章
- 【Reverse】初遇花指令
解密花指令 全文参考了一个大师傅的blog:https://blog.csdn.net/zhangmiaoping23/article/details/38400393 介绍 花指令是对抗反汇编的有效 ...
- 反混淆:恢复被OLLVM保护的程序
译者序: OLLVM作为代码混淆的优秀开源项目,在国内主流app加固应用中也经常能看到它的身影,但是公开的分析研究资料寥寥.本文是Quarkslab团队技术博客中一篇关于反混淆的文章,对OLLVM项目 ...
- .net破解一(反编译,反混淆-剥壳)
大家好,前段时间做数据分析,需要解析对方数据,而数据文件是对方公司内部的生成方式,完全不知道它是怎么生成的. 不过还好能拿到客户端(正好是C#开发)所以第一件事就是用Reflector编译,但是没有想 ...
- C# 反编译-Reflector 反混淆-De4Dot 修改dll/exe代码-reflexil
反编译工具 Reflector 破解版下载地址:http://pan.baidu.com/s/15UwJo 使用方法:略 反混淆工具De4Dot 开源软件 下载地址http://pan.baidu.c ...
- js混淆 反混淆 在线
js反混淆地址:http://www.bm8.com.cn/jsConfusion/ 在线javascript 混淆http://www.moralsoft.com/jso-online/hdojso ...
- net破解一(反编译,反混淆-剥壳,工具推荐)
net破解一(反编译,反混淆-剥壳,工具推荐) 大家好,前段时间做数据分析,需要解析对方数据,而数据文件是对方公司内部的生成方式,完全不知道它是怎么生成的. 不过还好能拿到客户端(正好是C#开发)所以 ...
- RESTClient调试POST方法&Reflector+de4dot反混淆破解dll
RESTClient调试POST方法 RESTClient是火狐的一款WebAPI测试工具. 1.先看下我们要调试的接口
- .net反混淆脱壳工具de4dot的使用
de4dot是一个开源的.net反混淆脱壳工具,是用C#编写的,介绍一下它的使用方法 首先 pushd 到de4dot.exe所在文件夹,然后调用 de4dot.exe 路径+dll名称 如果显示: ...
- 通过C#调用,实现js加密代码的反混淆,并运行js函数
前一篇我测试了vba调用htmlfile做反混淆,并执行js加密函数的代码.本文换成C#实现. 联系QQ:564955427 C#操作JS函数,可以通过ScriptControl组件,但这个组件只能在 ...
- 使用VBA进行JS加密的反混淆,还原JS代码。
本文地址:http://www.cnblogs.com/Charltsing/p/JSEval.html 联系QQ:564955427 类似下面的代码是登陆 全国企业信用信息公示系统(安徽)(网址:h ...
随机推荐
- CMake构建学习笔记16-使用VS进行CMake项目的开发
目录 1. 概论 2. 详论 2.1 创建工程 2.2 加载工程 2.3 配置文件 2.4 工程配置 2.5 调试执行 3. 项目案例 4. 总结 1. 概论 在之前的系列博文中,我们学习了如何构建第 ...
- 学好QT框架之后可以做什么工作?QT技术框架现代化行业大型复杂应用的经典成功案例
简介 本文粗略的介绍了QT框架的软件开发技术生态体系的全球影响力:QT框架在文字办公领域.CAD三维图形领域.Linux操作系统领域.物联网领域.汽车电子领域以及数字医疗领域等现代化行业的大型复杂应用 ...
- 配置windows update失败还原更改
配置windows update失败还原更改_解决方案 解决方法: 方法1: 重启,按F8,选择最后一次正常启动. 如果还是需要等待.可采用方法2: 方法2: 重启,按F8,选 ...
- markdown公式关系符
- 【赵渝强老师】MongoDB管理用户的认证机制
一.MongoDB用户认证机制简介 为了认证客户端,你必须要添加一个对应的用户到MongoDB.基本的步骤分为以下几步: 用户管理接口:db.createUser()方法可以创建一个用户,添加完成后可 ...
- 安装mysql5.7报错启动失败(3534)的处理
一 ,在官网下载好了mysql5.7之后,解压到对应的文件的夹下 二, 在cmd中进入到mysql下单bin目录下,一定要是管理员权限,执行mysqld --initialize 命令,会看到根目录下 ...
- 批量解压zip文件到指定位置
话不多说,直接上代码. # coding:utf-8 import zipfile import utils_file n = 21 # 我事先知道我有多少个文件,所以确定为21 for i in r ...
- problemmatcher 引用无效: $esbuild-watch vscode插件报错
vscode 插件 esbuild类型提示报错 最近在上手开发vscode插件,demo阶段就遇到了一个小问题. 搜索引擎没有特别好的回答, 记录一下,以供查漏补缺. vscode插件开发 做为一统前 ...
- Exchange2016中搜索和删除邮件
Exchange2016中搜索和删除邮件 在以前版本的 Exchange 中,可以运行 Search-Mailbox -DeleteContent 命令搜索并删除电子邮件.你仍可以在 Exchang ...
- KubeKey 离线部署 KubeSphere v3.4.1 和 K8s v1.26 实战指南
作者:运维有术 前言 知识点 定级:入门级 了解清单 (manifest) 和制品 (artifact) 的概念 掌握 manifest 清单的编写方法 根据 manifest 清单制作 artifa ...