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 ...
随机推荐
- C++ 数据输入cin (解决CLoin输入中文程序出错)
数据输入cin 语法:cin >> 变量 解决 CLoin 使用cin输入中文程序无法正常运行 按住Ctrl+alt+shift+/键 弹出对话框选择注册表 取消勾选run.process ...
- 【linux】【docker】Docker默认网段配置导致无法访问
背景 集团有N个基地,所有基地的网络使用的是172.x.x.x网段,这本身没有什么问题!但Docker默认的桥接网段也是172.17.x.x的,如果不修改docker的默认配置会导致个别基地无法访问! ...
- 76.最小覆盖子串 Golang实现
题目描述: 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有字符的最小子串.如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" . 注意: 对于 t ...
- 第24天:安全开发-PHP应用&文件管理模块&显示上传&黑白名单类型过滤&访问控制
#文件管理模块-上传-过滤机制 1.无过滤机制 2.黑名单过滤机制 3.白名单过滤机制 4.文件类型过滤机制 $_FILES:PHP中一个预定义的超全局变量,用于在上传文件时从客户端接收文件,并将其保 ...
- PHP面试,拼团
如何设计数据库模型来支持拼团功能? 答案:拼团功能涉及到多个用户参与同一团的情况,可以设计以下表结构: Product 表: 存储商品信息,包括商品ID.名称.价格等字段. Group 表: 存储拼团 ...
- pytorch: grad can be implicitly created only for scalar outputs
运行这段代码 import torch import numpy as np import matplotlib.pyplot as plt x = torch.ones(2,2,requires_g ...
- 开源项目更新|WPF/Uno Platform/WinUI 3三个版本的《英雄联盟客户端》
哈喽大家好! 我们是中韩Microsoft MVP夫妇 Vicky&James^^很高兴能加入博客园和大家分享我们的技术! 自2008年以来,我们一直深耕于WPF技术,积累了丰富的经验.这 ...
- C++ 第一节课 名字空间 ,输入输出函数,和 C 语言的区别
#include <iostream> // #include 头文件,C++标准库的头文件都不带 .h (.h 是C库头文件添加的) #include <cstdio> #i ...
- 斜率优化DP简单总结&&“土地购买”题解
今天刚刷完了斜率优化DP,简单从头回顾一下. \[首先,能写出DP方程应该是最重要的,毕竟斜率只是用来优化的 \] 那么一个DP方程能用斜率优化,具备一种形式: \[f[i]+s1[i]+A[i]*B ...
- 常见APR攻击及其防护
0x01 什么是ARP 地址解析协议--ARP:是根据IP地址获取物理地址的一个TCP/IP协议.主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的 ...