GKLBB

当你经历了暴风雨,你也就成为了暴风雨

导航

应用安全 --- 反compile的通用流程

预分析

    是什么文件,是windows还是linux还是mac还是安卓上的可执行文件。

   是什么壳子,具有壳的程序会阻碍正常分析流程

      元数据提取,如果有壳可能会干扰正常的元数据分析需要去壳后再次分析这些数据

    •   架构信息(x86/x64/ARM等)
    •   编译器特征是gnu还是llvm还是msvc
    •   导入导出表:识别关键API调用
    •   段/节信息:在内存的文件是分段存储的
    •   提取可读文本(URL、路径、错误信息),可以使用ai提取关键字符串

 

静态分析

有壳子先脱壳,自动脱不行就手动脱,配合dump内存映像文件,然后修复脱壳后的程序保证可以正常运行就是脱修完成了,这一步是最难的部分,需要深入学习,这里不讨论。

用IDA脚本反compile导出所有的代码。

先反compile导出函数和初始化函数数组,这两部分是最重要的入口函数

将代码由大到小排序。,然后大文件的代码使用用gemini和glm4.5、deepseek去分析函数功能通俗解释并分析是不是公共库函数,如果是关键代码再用claude这种重量级的ai进行分析。因为大的代码更有可能是关键函数。这里我用的是evol claude工具生成的代码。或者https://lmarena.ai/,或者是在不行就某宝买一个稳定账号。反compile完成后在用gemini和glm4.5、deepseek作为辅助分析工具,因为claude太贵了。

分析所有函数哪些是第三方库或者调转函数。排除无关干扰。

  • FLIRT签名匹配标准库
  • IDA的Lumina服务器识别已知函数
  • 手动标记第三方库(OpenSSL/zlib等)

分析关键函数的交叉调用链还原原始的调用逻辑。按交叉引用(Cross-references, Xrefs)数量排序。被大量调用的函数通常是工具函数(如字符串处理、内存分配),而交叉引用很少但内部逻辑复杂的函数可能是核心功能。

  • 数据流分析:追踪关键变量的传播路径
  • 控制流分析:绘制状态机或流程图 

 

动态分析

  • 动态或者静态插桩快速分析内存中的函数。包含函数的调用的流程,函数入参和返回值,修改执行流程。
  • 手动调试。在关键函数下断点分析内存,栈,寄存器,加载模块地址和大小,指令集的执行位置的完整功能,配置可能非常复杂但是通用性强。

 报告文档

将所有关键函数和信息记录在一个文本中,同时将代码上传的gitee中方便下次分析

 

 
checksec --file=target_binary
# 检查项:
# - PIE (位置无关)
# - Stack Canary (栈保护)
# - NX (堆栈不可执行)
# - RELRO (重定位只读)
# - FORTIFY (源码加固)

🔍 二、静态分析阶段

2.1 IDA/Ghidra导入与处理

A. 初始化处理

Python
# IDA Python脚本
import ida_auto
import idaapi

# 等待自动分析完成
ida_auto.auto_wait()

# 处理未识别函数
for addr in segments():
    make_functions(addr, get_segm_end(addr))

B. 符号恢复与重命名

Python
# 导入符号文件
- DWARF调试信息
- 导出的.sym文件
- FLIRT签名库匹配
- Lumina云端符号

# 自动重命名
- 字符串引用函数命名
- 系统调用函数识别
- 虚表自动识别

2.2 分层导出策略

A. 导出优先级(你已经提到的)

text
第一层:入口函数
  - main / JNI_OnLoad
  - .init / .init_array
  - 构造/析构函数

第二层:导出函数
  - 公开符号表函数
  - 动态导出函数

第三层:按大小排序
  大文件 → 可能是核心逻辑
  小文件 → 可能是工具函数

B. 批量导出脚本

Python
# 导出所有反编译代码
import ida_hexrays
import os

output_dir = "decompiled_code"
os.makedirs(output_dir, exist_ok=True)

for func_ea in Functions():
    func_name = get_func_name(func_ea)
    
    try:
        cfunc = ida_hexrays.decompile(func_ea)
        code = str(cfunc)
        
        # 按大小分类
        size = cfunc.body.size()
        category = "large" if size > 1000 else "medium" if size > 200 else "small"
        
        filepath = f"{output_dir}/{category}/{func_name}_{hex(func_ea)}.c"
        with open(filepath, 'w') as f:
            f.write(f"// Size: {size} bytes\n")
            f.write(f"// Address: {hex(func_ea)}\n\n")
            f.write(code)
    except:
        pass

2.3 AI辅助分析流程(增强版)

A. 分级AI使用策略

text
🔴 大型函数 (>1000行)
   ├─ Claude Opus 3.5 (深度分析)
   ├─ GPT-4 (交叉验证)
   └─ 人工复审

🟡 中型函数 (200-1000行)
   ├─ Claude Sonnet (初步分析)
   ├─ Gemini Pro (功能识别)
   └─ DeepSeek (补充说明)

🟢 小型函数 (<200行)
   ├─ GLM-4 (批量处理)
   ├─ DeepSeek (快速判断)
   └─ 自动化脚本识别标准库

B. AI提示词模板

Markdown
**函数分析提示词**:

请分析以下反编译代码:

1. **功能描述**:用一句话说明函数作用
2. **是否为标准库**:判断是否为glibc/STL/Boost等
3. **关键逻辑**:提取核心算法
4. **敏感操作**:标注加密/网络/文件操作
5. **参数含义**:推测各参数用途
6. **返回值**:说明返回内容
7. **潜在漏洞**:指出可能的安全问题
8. **重命名建议**:给出语义化函数名

代码:
```c
[粘贴反编译代码]
text

### 2.4 第三方库识别(新增)

#### A. 自动化工具
```bash
# 二进制相似度分析
bindiff file1.so file2.so         # BinDiff
diaphora db1.sqlite db2.sqlite    # Diaphora

# 开源库匹配
- rizzo (IDA插件)
- BinAbsInspector
- SaTC (静态二进制工具)

# FLIRT签名
- 官方sig库
- 自定义sig生成

B. 手动识别特征

text
✓ 字符串特征:版本号、作者信息、License
✓ 异常信息:"zlib version mismatch"
✓ 函数命名模式:ngx_*, SSL_*, curl_*
✓ 常量特征:魔数、算法常量

2.5 代码结构还原

A. 调用图生成

Python
# 生成函数调用图
import ida_gdl

# 全局调用图
gen_flow_graph("callgraph.gdl")

# 关键函数子图
target_funcs = ["encrypt_data", "verify_signature"]
gen_simple_call_chart("keyfunc_calls.gdl", target_funcs)

B. 数据流分析

text
- 污点分析:追踪敏感数据流向
- 控制流图:理解分支逻辑
- 交叉引用:字符串/常量使用位置

🎯 三、动态分析阶段(补充完善)

3.1 环境准备

A. 调试环境搭建

Bash
# Android
adb root && adb remount
adb push frida-server /data/local/tmp/
adb shell "/data/local/tmp/frida-server &"

# Linux
sudo gdb --pid=$(pidof target_process)

# iOS (越狱)
ssh root@iphone
debugserver *:1234 -a target_app

B. 仿真环境

Bash
# QEMU用户模式
qemu-arm -g 1234 ./arm_binary

# 全系统模拟
qemu-system-arm -M vexpress-a9 -kernel zImage

3.2 Hook框架部署

A. Frida Hook

JavaScript
// hook_template.js
Java.perform(function() {
    // Java层Hook
    var TargetClass = Java.use("com.example.TargetClass");
    TargetClass.targetMethod.implementation = function(arg1, arg2) {
        console.log("[*] targetMethod called");
        console.log("    arg1:", arg1);
        console.log("    arg2:", arg2);
        
        var ret = this.targetMethod(arg1, arg2);
        console.log("    return:", ret);
        return ret;
    };
});

// Native层Hook
Interceptor.attach(Module.findExportByName("libnative.so", "encrypt"), {
    onEnter: function(args) {
        console.log("[*] encrypt called");
        console.log("    data:", hexdump(args[0], {length: 64}));
        this.data = args[0];
    },
    onLeave: function(retval) {
        console.log("    result:", hexdump(this.data, {length: 64}));
    }
});

B. Xposed/LSPosed Hook

Java
// Android系统级Hook
public class HookModule implements IXposedHookLoadPackage {
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) {
        XposedHelpers.findAndHookMethod(
            "com.example.Class", lpparam.classLoader,
            "methodName", String.class, int.class,
            new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(MethodHookParam param) {
                    XposedBridge.log("参数1: " + param.args[0]);
                    XposedBridge.log("参数2: " + param.args[1]);
                }
                
                @Override
                protected void afterHookedMethod(MethodHookParam param) {
                    XposedBridge.log("返回值: " + param.getResult());
                }
            }
        );
    }
}

3.3 关键函数追踪

A. 参数捕获

Python
# Frida批量Hook脚本
import frida
import sys

def on_message(message, data):
    print(f"[{message['type']}] {message['payload']}")

device = frida.get_usb_device()
pid = device.spawn(["com.example.app"])
session = device.attach(pid)

script_code = """
// 批量Hook关键函数
var targets = [
    "encrypt_data",
    "verify_signature", 
    "parse_config",
    "network_request"
];

targets.forEach(function(name) {
    var addr = Module.findExportByName("libnative.so", name);
    if (addr) {
        Interceptor.attach(addr, {
            onEnter: function(args) {
                send({
                    func: name,
                    args: [args[0], args[1], args[2]].map(ptr => {
                        try {
                            return Memory.readUtf8String(ptr);
                        } catch(e) {
                            return ptr.toString();
                        }
                    })
                });
            }
        });
    }
});
"""

script = session.create_script(script_code)
script.on('message', on_message)
script.load()
device.resume(pid)
sys.stdin.read()

B. 内存dump

JavaScript
// 内存区域dump
var base = Module.findBaseAddress("libnative.so");
var size = Process.findModuleByName("libnative.so").size;
var buffer = Memory.readByteArray(base, size);
File.writeAllBytes("/sdcard/dump.bin", buffer);

// 特定数据结构dump
Interceptor.attach(target_addr, {
    onEnter: function(args) {
        var struct_ptr = args[0];
        var struct_data = {
            field1: struct_ptr.readU32(),
            field2: struct_ptr.add(4).readCString(),
            field3: struct_ptr.add(0x20).readByteArray(16)
        };
        send(JSON.stringify(struct_data));
    }
});

3.4 行为分析

A. 系统调用追踪

Bash
# strace详细追踪
strace -f -t -e trace=all -s 1024 -o trace.log ./target

# 过滤特定调用
strace -e trace=open,read,write,connect ./target

# Android上使用
adb shell strace -p $(pidof com.example.app)

B. 网络流量分析

Bash
# tcpdump抓包
tcpdump -i any -w capture.pcap

# mitmproxy抓HTTPS
mitmproxy --mode transparent --showhost

# Burp Suite + Frida绕过证书校验
frida -U -f com.example.app -l ssl-unpinning.js

3.5 调试器高级用法

A. GDB脚本化

Python
# gdb_script.py
import gdb

class BreakpointHandler(gdb.Breakpoint):
    def __init__(self, location):
        super().__init__(location)
        self.silent = True
    
    def stop(self):
        # 获取寄存器值
        rdi = gdb.parse_and_eval("$rdi")
        rsi = gdb.parse_and_eval("$rsi")
        
        print(f"[*] 断点命中: rdi={rdi}, rsi={rsi}")
        
        # 读取内存
        data = gdb.selected_inferior().read_memory(rdi, 64)
        print(f"    数据: {data.hex()}")
        
        return False  # 继续执行

# 设置断点
BreakpointHandler("encrypt_function")
gdb.execute("continue")

B. LLDB调试

Bash
# iOS/macOS调试
lldb -p $(pgrep target_process)

(lldb) br s -n target_function
(lldb) br command add
> po $arg1
> po $arg2
> c
> DONE

3.6 运行时修改

A. 内存补丁

JavaScript
// Frida内存修改
var addr = Module.findExportByName("libnative.so", "check_license");
Memory.protect(addr, 64, 'rwx');

// 修改返回值为1 (mov r0, #1; bx lr)
Memory.writeByteArray(addr, [0x01, 0x00, 0xA0, 0xE3, 0x1E, 0xFF, 0x2F, 0xE1]);

B. 流程控制修改

JavaScript
// 跳过验证逻辑
Interceptor.replace(verify_func, new NativeCallback(function() {
    console.log("[*] 验证已绕过");
    return 1; // 强制返回成功
}, 'int', []));

// 修改条件跳转
var cmp_addr = base.add(0x1234);
Memory.patchCode(cmp_addr, 4, function(code) {
    var writer = new ArmWriter(code, {pc: cmp_addr});
    writer.putNop();  // 将条件跳转改为NOP
    writer.flush();
});

🔬 四、高级分析阶段(新增)

4.1 加密算法识别

Python
# FindCrypt插件
- AES常量检测
- RSA模数识别
- MD5/SHA魔数
- Base64编码表

# Kerckhoffs定律应用
- 查找密钥存储位置
- 分析IV/盐值生成
- 追踪密钥派生流程

4.2 混淆对抗

A. 控制流平坦化还原

Bash
# D810插件 (IDA)
# 自动化去除控制流混淆

# 手动分析思路
1. 识别dispatcher块
2. 提取case常量
3. 重建真实控制流
4. 生成清晰的伪代码

B. 字符串解密

Python
# 动态解密所有字符串
var decrypt_func = Module.findExportByName("libnative.so", "decrypt_string");

var strings = [0x1000, 0x1100, 0x1200];  // 加密字符串地址
strings.forEach(function(addr) {
    var result = new NativeFunction(decrypt_func, 'pointer', ['pointer'])(
        Module.findBaseAddress("libnative.so").add(addr)
    );
    console.log(Memory.readUtf8String(result));
});

4.3 漏洞挖掘

A. 静态污点分析

text
Source点:
- 网络输入
- 文件读取
- 用户输入

Sink点:
- strcpy/sprintf (缓冲区溢出)
- system/exec (命令注入)
- SQL查询 (SQL注入)

B. Fuzzing

Bash
# AFL++ 模糊测试
afl-fuzz -i input/ -o output/ -- ./target @@

# LibFuzzer
clang++ -g -fsanitize=fuzzer,address target.cpp
./a.out corpus/

📊 五、报告与文档阶段(新增)

5.1 生成分析报告

A. 自动化报告模板

Markdown
# 逆向分析报告 - [应用名称]

## 一、基本信息
- **文件名**: xxx.so
- **MD5**: xxxx
- **架构**: ARM64
- **编译器**: NDK r21
- **加壳**: 未加壳

## 二、关键函数分析
### 2.1 加密函数 (encrypt_data @ 0x12340)
- **功能**: AES-256-CBC加密
- **密钥来源**: 硬编码 + 设备ID
- **风险**: 密钥可提取

### 2.2 网络通信 (send_request @ 0x23450)
- **协议**: HTTPS + 自定义加密层
- **证书校验**: 已实现
- **风险**: 无

## 三、调用链分析

main()
├─ init_crypto()
│ └─ load_key()
├─ process_data()
│ ├─ encrypt_data()
│ └─ send_request()
└─ cleanup()

text

## 四、安全建议
1. 密钥不应硬编码
2. 建议使用KeyStore
3. 添加完整性校验

5.2 知识库建设

text
- 函数签名库积累
- 常见混淆模式总结
- 第三方库版本对照表
- 漏洞Pattern库

🛠️ 六、工具链推荐

6.1 静态分析

工具用途优势
IDA Pro 反汇编/反编译 功能最强
Ghidra 免费反编译 NSA开源
Binary Ninja 现代化UI 脚本友好
Cutter Rizin前端 开源免费
JEB Android专用 Dalvik/Native

6.2 动态分析

工具用途优势
Frida 动态Hook 跨平台
GDB/LLDB 调试器 底层控制
Xposed Android Hook 系统级
Cycript iOS运行时 ObjC注入
DBI框架 二进制插桩 指令级

6.3 辅助工具

Bash
- radare2: 命令行逆向
- angr: 符号执行
- Z3: 约束求解
- Keypatch: 汇编补丁
- ret-sync: 调试同步

💡 七、最佳实践

7.1 工作流程优化

text
1. 建立标准化目录结构
project/
├── original/          # 原始文件
├── unpacked/          # 脱壳后
├── decompiled/        # 反编译代码
│   ├── large/
│   ├── medium/
│   └── small/
├── analysis/          # 分析笔记
├── scripts/           # 自动化脚本
└── reports/           # 分析报告

7.2 版本控制

Bash
git init
git add -A
git commit -m "Initial decompiled code"

# 每次分析进展都提交
git commit -m "Identified encryption routine"

7.3 协作分析

  • 使用Notion/Obsidian记录思路
  • 关键发现及时同步团队
  • 建立术语统一表
  • Code Review反编译代码质量

🎓 八、学习资源

8.1 书籍

  • 《逆向工程权威指南》
  • 《Android软件安全权威指南》
  • 《iOS应用逆向与安全》
  • 《恶意代码分析实战》

8.2 在线资源

  • crackmes.one (练习题)
  • ReverseEngineering SubReddit
  • 看雪论坛/吾爱破解

8.3 CTF平台

  • XCTF / CTFtime
  • 0CTF / DEFCON CTF
  • pwnable.kr / pwnable.tw

⚠️ 九、法律与道德

9.1 合法边界

text
✅ 允许:
- 自己开发的应用
- 已授权的安全审计
- 教育研究目的(合理使用)

❌ 禁止:
- 盗版软件破解
- 游戏外挂开发
- 恶意代码植入
- 商业机密窃取

9.2 负责任披露

  • 发现漏洞应先报告厂商
  • 遵守CVE披露流程
  • 不传播0day利用代码
  • 保护用户隐私数据

总结:逆向分析是技术、经验和耐心的结合,建议循序渐进,从简单样本开始练习,逐步积累自己的工具库和知识库。祝你成功!

 

应用安全 --- 反编译(Decompile)通用流程(补充完善版)

一、预分析阶段

1.1 基础信息收集

  • 使用 readelfobjdump 等工具收集元数据
  • 识别文件格式:ELF、PE、Mach-O、DEX/APK 等
  • 检查壳/混淆/保护机制:UPX、VMProtect、Themida、ollvm 等
  • 分析导入导出表,识别依赖库

1.2 加固识别

Bash
# 检查加固类型
strings binary | grep -i "pack\|protect\|guard"
# 检查section异常
readelf -S binary | grep -E "UPX|\.encrypted"
# 计算熵值判断加密/压缩
binwalk -E binary

1.3 脱壳准备

  • 常见壳: UPX (upx -d)、梆梆、360加固、爱加密等
  • 反调试检测: 检查 ptrace、时间检测、父进程检测
  • 完整性校验: CRC、签名校验等

二、静态分析阶段

2.1 反编译工具选择

目标类型推荐工具
x86/x64 IDA Pro, Ghidra, Binary Ninja
ARM IDA Pro, Ghidra, Radare2
Android JADX, JEB, GDA, Ghidra(so)
iOS Hopper, IDA Pro, Ghidra
.NET dnSpy, ILSpy, dotPeek
Python uncompyle6, pycdc

2.2 代码分析优先级

第一优先级:入口点分析

text
1. main/start/_init/_init_array
2. JNI_OnLoad (Android Native)
3. __attribute__((constructor)) 函数
4. TLS回调函数
5. 导出函数列表

第二优先级:敏感函数定位

Python
# IDA Python脚本示例
sensitive_funcs = [
    "encrypt", "decrypt", "aes", "rsa", "md5", "sha",
    "verify", "check", "valid", "license", "register",
    "sign", "token", "auth", "login", "password"
]

2.3 AI辅助分析策略(补充)

分层分析策略

text
超大函数(>500行) → Claude Opus/Sonnet
大函数(200-500行) → GPT-4/DeepSeek
中函数(50-200行) → Gemini/GLM-4
小函数(<50行)    → 批量处理/本地分析

提示词模板

text
请分析以下反编译代码:
1. 函数主要功能
2. 输入输出参数含义
3. 是否为标准库/第三方库函数
4. 潜在的安全问题
5. 关键算法识别(加密/校验/混淆)
[代码]

2.4 代码清洗与标注

  • 重命名变量: var_1 → key_buffer
  • 识别结构体: 使用 IDA Local Types 定义
  • 标注常量: 魔数、算法标识(如 0x67452301 → MD5_A)
  • 交叉引用分析: Xrefs to/from 定位调用链

2.5 自动化脚本示例

Python
# IDA 批量导出伪代码
import idaapi
import idc

for func_ea in Functions():
    func_name = idc.get_func_name(func_ea)
    if idaapi.decompile(func_ea):
        pseudo_code = str(idaapi.decompile(func_ea))
        # 保存到文件按大小排序

三、动态分析阶段(补充完善)

3.1 调试环境准备

  • Linux: gdb + gef/pwndbg/peda
  • Android: frida, xposed, IDA Remote Debugger
  • iOS: debugserver, LLDB, frida
  • Windows: x64dbg, WinDbg, IDA

3.2 Hook框架选择

场景工具
Android Java层 Xposed, Frida, LSPosed
Android Native Frida, Substrate, Inline Hook
iOS Frida, Dobby, fishhook
Linux/Windows Frida, LD_PRELOAD, Detours

3.3 关键点Hook策略

加密算法Hook

JavaScript
// Frida Hook示例
Interceptor.attach(Module.findExportByName("libnative.so", "encrypt"), {
    onEnter: function(args) {
        console.log("Input:", hexdump(args[0], {length: 64}));
        console.log("Key:", hexdump(args[1], {length: 16}));
        this.context.backtrace().forEach(addr => {
            console.log(addr, DebugSymbol.fromAddress(addr));
        });
    },
    onLeave: function(retval) {
        console.log("Output:", hexdump(retval, {length: 64}));
    }
});

网络请求Hook

JavaScript
// Hook SSL_write/SSL_read
// Hook send/recv/sendto/recvfrom
// Hook HttpURLConnection/OkHttp

文件操作Hook

JavaScript
// Hook open/read/write
// Hook fopen/fread/fwrite
// Hook FileInputStream/FileOutputStream

3.4 动态调试技巧

反反调试

Python
# Frida 绕过 ptrace 检测
Interceptor.replace(Module.findExportByName(null, "ptrace"), new NativeCallback(function() {
    return 0;
}, 'int', []));

# 绕过时间检测
# 绕过完整性校验

内存dump

Bash
# dump 内存中的解密代码
frida-dump -U -f com.app -o dump/
# dump DEX
frida-dexdump
# dump SO
cat /proc/[pid]/maps
dd if=/proc/[pid]/mem of=dumped.so skip=addr count=size

3.5 动态插桩分析

  • 代码覆盖率: frida-trace, DynamoRIO
  • 污点分析: 跟踪敏感数据流向
  • 参数枚举: Fuzz关键函数输入

四、协同分析阶段(新增)

4.1 静态+动态结合

text
静态分析定位 → 动态验证 → 修正静态分析 → 循环迭代

4.2 流程还原

  1. 绘制调用图: IDA Call Graph, Graphviz
  2. 时序分析: 记录函数调用顺序
  3. 数据流分析: 参数传递与转换过程
  4. 状态机还原: 协议/逻辑状态转换

4.3 算法提取

  • 加密算法识别: FindCrypt, Kryptor插件
  • 常量定位: KANAL插件
  • 算法复现: 提取关键代码用Python/C重写

五、文档输出阶段(新增)

5.1 分析报告结构

text
1. 目标概述(版本、架构、保护机制)
2. 关键函数清单(功能、地址、调用关系)
3. 算法分析(伪代码、流程图)
4. 安全问题(漏洞、逻辑缺陷)
5. 附录(脚本、dump文件)

5.2 代码重构

  • 将分析结果整理成可读性强的伪代码
  • 使用PlantUML/Mermaid绘制流程图
  • 编写PoC验证分析结论

六、工具链推荐(新增)

6.1 自动化分析

  • angr: 符号执行
  • Triton: 动态符号执行
  • QEMU: 模拟执行
  • Unicorn: 指令模拟

6.2 辅助工具

  • BinDiff: 二进制对比
  • Diaphora: 函数相似度对比
  • Bindiff + BinExport: 版本差异分析

6.3 在线资源

  • VirusTotal: 样本检测
  • UnpacMe: 在线脱壳
  • Intezer: 代码基因分析

七、常见问题处理(新增)

7.1 混淆对抗

  • 控制流平坦化: 使用 deflat, D810插件
  • 虚假控制流: 模式识别去除
  • 字符串加密: 动态dump或编写解密脚本
  • OLLVM: 使用去混淆工具链

7.2 性能优化

Python
# 批量分析时使用多进程
from multiprocessing import Pool
# 设置IDA分析超时
# 跳过标准库函数

7.3 合规建议

⚠️ 仅在授权情况下进行逆向分析
⚠️ 遵守DMCA、计算机欺诈和滥用法等法律
⚠️ 研究目的应为安全测试、漏洞挖掘、学习交流


八、检查清单(新增)

  •  确认目标架构和保护机制
  •  完成脱壳/解密
  •  定位所有入口点
  •  识别并排除第三方库
  •  分析关键算法
  •  Hook验证静态分析结论
  •  绘制完整调用链
  •  编写分析文档
  •  PoC验证
  •  清理敏感信息

提示: 根据具体目标(恶意软件分析、漏洞挖掘、协议逆向、授权破解等)调整分析侧重点。

 

逆向分析完整流程补充

一、预分析(补充)

基础信息采集

  • 文件哈希计算:MD5/SHA1/SHA256,用于病毒库和威胁情报平台查询(VirusTotal/微步在线)
  • 数字签名验证:检查证书有效性、签名者信息、时间戳
  • 熵值分析:高熵值(>7.0)可能表示加密/压缩/混淆
  • 文件大小异常检测:与同类程序对比判断是否异常

元数据深度提取

  • PE文件(Windows):

    • 编译时间戳(可能被伪造)
    • 子系统类型(GUI/Console/Driver)
    • 资源节提取(图标、对话框、版本信息、嵌入文件)
    • Rich Header信息(编译环境指纹)
  • ELF文件(Linux):

    • Build ID
    • .note段信息
    • 动态链接器路径
    • RPATH/RUNPATH
  • Mach-O(Mac):

    • Load Commands
    • Code Signature
    • Entitlements
  • APK/DEX(Android):

    • AndroidManifest.xml解析
    • 权限列表
    • 四大组件信息
    • 资源文件

依赖关系分析

  • 静态链接库识别
  • 动态依赖库列表
  • 异常导入(少见API可能是恶意行为)
  • 延迟加载DLL(Windows)

二、静态分析(补充)

脱壳补充

  • 壳类型识别:
    • 商业壳:VMProtect/Themida/Enigma/Safengine
    • 压缩壳:UPX/ASPack/PECompact
    • 自定义壳:需深入分析
  • 脱壳策略:
    • ESP定律/一步到达OEP
    • 内存断点法(硬件/内存访问断点)
    • 堆栈平衡法
    • IAT重建(ImportREC/Scylla)
    • 资源修复

字符串分析

  • 加密字符串处理:

    • 识别解密函数特征(XOR/Base64/AES)
    • 编写IDAPython脚本批量解密
    • 动态内存dump后提取
  • 敏感信息提取:

    • C2服务器地址
    • 加密密钥/盐值
    • 调试信息残留
    • PDB路径
    • 开发者注释

代码分析技巧

  • 反混淆:

    • 控制流平坦化还原(D810/HexRaysDeob插件)
    • 虚假控制流消除
    • 常量展开
    • 死代码消除
  • 算法识别:

    • Kryptostor/Kanal插件识别加密常数
    • YARA规则匹配算法特征
    • Diaphora/BinDiff比对已知实现
  • 反调试/反虚拟机检测:

    • IsDebuggerPresent/CheckRemoteDebugger
    • PEB!BeingDebugged检测
    • 时间检测(RDTSC/GetTickCount)
    • 虚拟机指纹检测(CPUID/MAC地址/注册表特征)
    • 文档化所有检测点以便patch

特殊语言处理

  • Go语言:IDAGolangHelper恢复符号
  • Rust语言:识别panic处理和trait vtable
  • .NET/Java:dnSpy/JD-GUI/Jadx反编译
  • Python打包:pyinstxtractor + uncompyle6
  • Electron应用:asar提取源码

二进制对比分析

  • 补丁分析:BinDiff对比修复前后版本定位漏洞
  • 变种分析:识别恶意软件家族共性
  • 版本演进:追踪功能变更

三、动态分析(补充)

沙箱自动化分析

  • 在线沙箱:Any.run/Hybrid-Analysis/Joe Sandbox
  • 本地沙箱:Cuckoo Sandbox/CAPE/VMRay
  • 移动端沙箱:MobSF/Genymotion
  • 输出分析:行为报告/网络流量/进程树/文件操作

系统监控工具

  • Windows:

    • Process Monitor(文件/注册表/进程/网络)
    • Process Explorer(进程树/句柄/DLL)
    • Regshot(注册表快照对比)
    • API Monitor(API调用追踪)
  • Linux:

    • strace(系统调用)
    • ltrace(库函数调用)
    • sysdig(系统活动)
    • eBPF工具(bpftrace/bcc)
  • Android:

    • Frida(动态插桩)
    • Xposed框架
    • Magisk模块
    • tcpdump/Wireshark

调试技术进阶

  • 调试器选择:

    • x64dbg/WinDbg/OllyDbg(Windows)
    • GDB/LLDB(Linux/Mac)
    • IDA Debugger(跨平台)
    • Frida/qiling(模拟执行)
  • 反反调试:

    • ScyllaHide/TitanHide插件
    • 时间检测绕过(修改返回值/Hook API)
    • 硬件断点隐藏
    • 内核调试绕过(双机调试/虚拟机调试)

插桩技术

  • 动态插桩:

    • Frida:JavaScript编写Hook脚本
    • DynamoRIO/Pin:二进制插桩框架
    • DBI优势:无需修改目标文件
  • 静态插桩:

    • 二进制重写(Dyninst)
    • 指令替换/跳转注入
    • 需处理重定位问题

网络分析

  • 流量捕获:

    • Wireshark/tcpdump
    • Fiddler/Burp Suite(HTTP/HTTPS)
    • SSL/TLS解密(导入私钥/中间人证书)
  • 协议分析:

    • 自定义协议逆向
    • 加密流量解密
    • C2通信模式识别

内存分析

  • 运行时dump:

    • 关键函数执行后dump堆/栈
    • 全内存快照(Volatility分析)
    • 字符串解密后提取
  • 内存取证:

    • 进程注入检测
    • Shellcode提取
    • 隐藏进程/模块发现

环境对抗

  • 时间操纵:修改系统时间绕过时间炸弹
  • 网络模拟:INetSim/FakeDNS模拟C2服务器
  • 文件系统伪造:满足样本运行条件
  • 用户交互自动化:AutoIt/Sikuli模拟点击

四、综合分析

数据关联

  • 静态+动态结合:

    • 静态定位关键函数 → 动态下断点验证
    • 动态发现加密API → 静态分析算法实现
    • 交叉验证提高准确性
  • 多样本关联:

    • 同家族样本对比找共性
    • 提取通用检测特征

漏洞挖掘

  • Fuzzing:

    • AFL++/LibFuzzer生成测试用例
    • 覆盖率引导变异
    • Crash分析与复现
  • 符号执行:

    • angr/Triton/KLEE
    • 路径约束求解
    • 自动化漏洞利用生成
  • 静态漏洞扫描:

    • 缓冲区溢出模式
    • 整数溢出
    • 格式化字符串
    • UAF/Double Free

五、成果输出

IOC提取

  • 网络IOC:IP/域名/URL/User-Agent
  • 文件IOC:哈希值/文件路径/Mutex名称
  • 注册表IOC:键值特征
  • 行为IOC:进程链/API序列

特征规则编写

  • YARA规则:

    yara
    rule Example {
        strings:
            $hex = { 6A 40 68 00 30 00 00 }
            $str = "malicious_string" nocase
        condition:
            $hex or $str
    }
  • Snort/Suricata规则:网络检测

  • Sigma规则:日志检测

分析报告

  • 执行摘要:非技术概述
  • 技术细节:
    • 样本基本信息
    • 感染链条/TTPs
    • 功能模块分析
    • 关键代码片段
    • IOC列表
  • 防护建议:
    • 检测规则
    • 清除方案
    • 加固措施

可复现验证

  • POC编写:验证关键功能
  • 自动化检测脚本:Python/PowerShell
  • 解密工具:配置文件/流量解密

六、工具集整理

推荐工具链

text
预分析:PEiD, Exeinfo PE, Detect It Easy, pestudio
脱壳:x64dbg + Scylla, OllyDbg, Universal Extractor
反编译:IDA Pro, Ghidra, Binary Ninja, Cutter
动态监控:Process Monitor, API Monitor, Regshot
插桩:Frida, DynamoRIO, Pin
网络:Wireshark, Fiddler, mitmproxy
自动化:radare2, Cuckoo, YARA
辅助:HxD(十六进制), 010 Editor(模板解析)

脚本自动化

  • IDAPython批处理
  • Frida脚本库建设
  • 符号恢复自动化
  • 报告生成模板化

七、注意事项

安全隔离

  • 专用分析环境:虚拟机快照/Docker容器
  • 网络隔离:Host-Only/断网分析
  • 数据备份:重要发现及时保存
  • 样本管理:加密存储/权限控制

法律合规

  • 遵守《网络安全法》等法律法规
  • 样本来源合法性
  • 数据脱敏处理
  • 研究目的正当性

持续学习

  • 跟踪CVE漏洞分析
  • 阅读APT组织报告
  • 参与CTF比赛
  • 开源项目贡献

补充说明:

  1. 根据样本类型(恶意软件/商业软件/固件)调整分析侧重点
  2. 建立个人知识库记录常见模式
  3. 善用AI辅助但需人工验证关键结论
  4. 复杂样本需团队协作和多轮迭代分析
 

预分析

    是什么文件,是windows还是linux还是mac还是安卓上的可执行文件。

   是什么壳子,具有壳的程序会阻碍正常分析流程

   元数据提取,如果有壳可能会干扰正常的元数据分析需要去壳后再次分析这些数据

  架构信息(x86/x64/ARM等)
  编译器特征是gnu还是llvm还是msvc
  导入导出表:识别关键API调用
  段/节信息:在内存的文件是分段存储的
  提取可读文本(URL、路径、错误信息)

静态分析

有壳子先脱壳,自动脱不行就手动脱,配合dump内存映像文件,然后修复脱壳后的程序保证可以正常运行就是脱修完成了,这一步是最难的部分,需要深入学习。
用IDA脚本反compile导出所有的代码。

先反compile导出函数和初始化函数数组,这两部分是最重要的入口函数

将代码由大到小排序。,然后大文件的代码使用用gemini和glm4.5、deepseek去分析函数功能通俗解释并分析是不是公共库函数,如果是关键代码再用claude这种重量级的ai进行分析。因为大的代码更有可能是关键函数。这里我用的是evol claude工具生成的代码。或者https://lmarena.ai/,或者是在不行就某宝买一个稳定账号。反compile完成后在用gemini和glm4.5、deepseek作为辅助分析工具,因为claude太贵了。

分析所有函数哪些是第三方库或者调转函数。排除无关干扰。

FLIRT签名匹配标准库
IDA的Lumina服务器识别已知函数
手动标记第三方库(OpenSSL/zlib等)
分析关键函数的交叉调用链还原原始的调用逻辑。

数据流分析:追踪关键变量的传播路径
控制流分析:绘制状态机或流程图

动态分析
动态或者静态插桩快速分析内存中的函数。包含函数的调用的流程,函数入参和返回值,修改执行流程。
手动调试。在关键函数下断点分析内存,栈,寄存器,加载模块地址和大小,指令集的执行位置的完整功能,配置可能非常复杂但是通用性强。
请补充

 
 

非常棒!您提供的逆向工程分析流程已经非常专业和系统化了,涵盖了从预分析到静态、动态分析的核心步骤,并且融入了使用AI大模型辅助分析的现代化方法。这是一个非常好的框架。

为了让这个流程更加完善,我将根据您的框架进行补充和扩展,主要集中在以下几个方面:

  1. 增加“准备阶段”和“收尾阶段”,使流程形成一个完整的闭环。
  2. 在现有阶段中补充一些关键的细节、工具和思维方式。
  3. 强调“迭代”和“综合”,因为逆向过程很少是线性的。
  4. 细化对抗反分析技术的策略。

以下是补充和完善后的完整流程:

阶段 0:目标定义与环境准备 (新增)

这是所有分析开始之前最重要的一步,常常被忽略。

  1. 明确分析目标:

    • 目的: 是为了做漏洞挖掘、恶意软件分析、兼容性研究,还是为了学习某个算法?
    • 范围: 需要分析到什么程度?是只要搞懂大概功能,还是要完整提取核心算法/配置/密钥?明确的目标可以避免在无关的细节上浪费时间。
  2. 搭建安全的分析环境:

    • 隔离: 使用虚拟机(如 VMware, VirtualBox)或专用的物理机,确保样本不会影响到你的主系统。
    • 快照: 在运行样本前,务必创建虚拟机快照。这样无论样本对系统做了什么修改,都可以随时恢复到干净的状态。
    • 网络隔离/控制: 配置虚拟机的网络。可以选择完全断网、连接到仅主机网络(Host-Only),或者使用专门的工具(如 INetSim)来模拟互联网服务(HTTP, DNS, FTP等),从而在安全的环境下观察样本的网络行为。
    • 安装必备工具: 在虚拟机中安装所有需要的分析工具(IDA, x64dbg, Ghidra, PE-bear, Process Monitor, Wireshark等)。

阶段 1:预分析 / 初步探查 (Triage)

您的列表已经很全面了,这里做一些细化和补充。

  • 文件类型识别:

    • 工具: file (Linux/macOS), Detect It Easy (DiE)。DiE 不仅能识别文件类型,还能检测壳、加密器和编译器。
  • 壳/混淆检测:

    • 工具: 除了 DiE,还有 PEiD (虽然老但对旧壳有效), Exeinfo PE
    • 指标:
      • 熵值高: 加壳或加密的部分通常具有很高的信息熵。可以使用 Binwalk 或 Detect It Easy 查看节区熵。
      • 导入表极小: 一个复杂的程序如果导入表里只有 LoadLibrary 和 GetProcAddress 等寥寥几个API,极有可能是加壳了,它会在运行时动态解析所需API。
      • 不寻常的节区名: 如 UPX0UPX1.petite 等都是常见壳的特征。
  • 元数据与字符串提取:

    • 工具: strings 命令配合参数(如 -n 8 指定最小长度),FLOSS 工具可以自动从内存中提取并解码被混淆的字符串。
    • 关注点: 除了URL、路径,还要特别注意 IP地址、域名、用户代理(User-Agent)字符串、加密相关的常量(如IV、盐)、以及独特的互斥体(Mutex)名称。
  • 基础行为分析 (补充):

    • 在不附加调试器的情况下,直接运行样本,同时用监控工具观察其高层行为。这是一个快速了解其意图的“沙箱”步骤。
    • 工具:
      • Process Monitor (Procmon): 监控文件系统、注册表和进程/线程活动。
      • Wireshark / tcpdump: 捕获网络流量,看它与哪些IP/域名通信,使用什么协议。
      • Process Explorer: 查看进程树、加载的DLL、打开的句柄等。
    • 这一步的发现(如创建了某个文件、连接了某个IP)是后续深入分析的重要线索。

阶段 2:静态分析

您的流程非常棒,特别是利用AI的部分。这里补充一些战术细节。

  • 脱壳 (Deobfuscation/Unpacking):

    • 补充策略:
      • 寻找OEP (Original Entry Point): 壳代码执行完毕后,通常会有一个跳转指令(JMP 或 CALL)将控制权交给原始程序的入口点。这是手动脱壳的关键。常见的技巧是在内存访问断点(如对.text节区设置执行断点)或关键API(如 VirtualAllocVirtualProtect)之后寻找这个跳转。
      • Import Table Reconstruction (IAT修复): 脱壳后,程序的导入表通常是无效的。需要使用如 Scylla 或 Import REConstructor 这样的工具来扫描内存,找到IAT并重建,这样dump出的文件才能独立运行。
  • 代码分析与AI辅助:

    • 排序与优先级:
      • 按函数大小排序是个好方法。补充一下,还可以按交叉引用(Cross-references, Xrefs)数量排序。被大量调用的函数通常是工具函数(如字符串处理、内存分配),而交叉引用很少但内部逻辑复杂的函数可能是核心功能。
      • 优先分析与字符串、敏感API(网络、加密、文件操作)相关的函数。在IDA中,你可以直接在字符串或导入API上按 x 键查找其引用位置,从这里开始分析。
    • AI辅助分析的细化:
      • Prompt工程: 给AI提供上下文是关键。不要只扔给它一堆汇编,而是告诉它:“这是一个在恶意软件中发现的函数,它接受一个加密的字符串作为输入,请分析其功能,并猜测它可能是什么解密算法。” 这样的提问效果会好得多。
      • 结构化分析: 可以让AI将反编译代码转换成伪代码,或者解释每个代码块的作用,然后你再将这些解释串联起来。
  • 库函数与无关代码排除:

    • 补充: Ghidra内置了非常强大的函数签名分析功能,类似于IDA的FLIRT/Lumina,并且是免费的。对于非常见的库,可以自己编译该库,然后用 BinDiff 或 Diaphora 这类工具将你的样本与库文件进行对比,快速识别出匹配的函数。
  • 数据流与控制流分析:

    • IDA技巧: 使用IDA的 “高亮操作数” 功能可以快速追踪一个变量在函数内的使用情况。对于跨函数的追踪,可以使用数据交叉引用。
    • Ghidra技巧: Ghidra的反编译器非常强大,其变量重命名和类型推断功能可以极大地简化数据流分析。你可以将一个值(如一个句柄)重命名,所有使用到它的地方都会自动更新。

阶段 3:动态分析

动态分析是为了验证静态分析的猜想,并处理静态分析无法解决的问题(如动态计算的跳转、加密数据)。

  • 调试与插桩:
    • Instrumentation (插桩):
      • 工具: Frida 是现代逆向工程的神器。它允许你用JavaScript编写脚本,注入到正在运行的进程中。你可以用它来:
        • Hook函数: 拦截任意函数的调用,打印其输入参数和返回值。这对于理解加密/解密函数、网络通信协议至关重要。
        • 修改逻辑: 在运行时修改函数的行为,例如,让一个检查许可证的函数永远返回 true
        • 主动调用: 在目标进程中调用任意函数,测试其功能。
      • Intel Pin / DynamoRIO: 更底层的动态二进制插桩框架,功能更强大但使用也更复杂。
    • 手动调试:
      • 断点策略:
        • 基于静态分析的断点: 在静态分析中确定的关键函数、可疑循环、解密例程的开头下断点。
        • 条件断点: 当某个寄存器或内存地址的值满足特定条件时中断。例如,when (eax == 0x12345678) { break }。这在追踪特定数据时非常有用。
        • 内存断点: 对某个内存地址或范围设置访问/写入断点。当程序读取或修改该处数据时会中断。这对于找到解密后的数据在何处被使用非常有效。
      • 内存Dump: 在关键时刻(如一个解密函数执行完毕后),从调试器中将相关内存区域dump下来进行离线分析。

阶段 4:综合分析与循环迭代 (新增)

这是对整个过程思维方式的总结,也是高手和新手的区别所在。

  1. 静态与动态的结合: 这是一个循环往复的过程。

    • 示例:
      1. 静态: 发现一段可疑代码,似乎在解密数据,但不知道密钥和算法。
      2. 动态: 在这段代码的入口和出口下断点。运行程序,在入口处查看输入(加密数据),在出口处查看内存(解密后的数据)。
      3. 获取信息: 你得到了明文!比如一个URL。
      4. 回到静态: 在IDA中搜索这个URL字符串的交叉引用(虽然现在内存里才有,但可以手动在IDA中定义这个字符串),找到使用它的代码,从而理解程序的下一步行为。
  2. 对抗反分析技术 (细化):

    • 反调试:
      • 检测: IsDebuggerPresentCheckRemoteDebuggerPresent, 查询PEB标志等。
      • 对抗: 使用如 ScyllaHide 或 x64dbg的插件来隐藏调试器;在API被调用前下断点,并修改其返回值。
    • 反虚拟机/沙箱:
      • 检测: 检测特定的虚拟硬件名称(如 VMware SVGA)、MAC地址、注册表项(HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Disk\Enum)、或执行特定指令(如 sidtsgdt)并检查结果。
      • 对抗: 使用特殊配置的虚拟机(如 VBoxHardenedLoader),或在调试时跳过这些检测代码。
    • 控制流混淆:
      • 表现: 大量的 JMPCALL 指令,形成一个复杂的“意大利面条”式代码,使人难以理清逻辑。
      • 对抗: 动态调试是最好的方法,单步跟踪程序的实际执行路径。或者使用符号执行工具(如 angr)来探索可能的路径。

阶段 5:报告与收尾 (新增)

  1. 文档化: 好的分析需要好的记录。在IDA/Ghidra中,积极地重命名函数、变量,添加注释。你的AI分析结果也应该整理并作为注释写入。
  2. 提取关键指标 (Indicators of Compromise, IOCs): 对于恶意软件分析,这是最重要的产出。
    • 文件哈希 (MD5, SHA1, SHA256)
    • C2服务器的IP地址和域名
    • URL路径
    • 独特的注册表项
    • 创建的文件名和路径
    • 互斥体名称
    • 网络通信特征(User-Agent, 协议)
  3. 撰写分析报告:
    • 摘要: 程序是做什么的?主要威胁是什么?
    • 详细分析: 描述你的整个分析过程,包括预分析、静态和动态分析的发现。
    • 能力描述: 详细说明程序的功能,如持久化机制、信息窃取模块、通信协议等。
    • 结论与建议: 总结发现,并提供检测和清除的建议。

通过补充这几个阶段,您的逆向工程流程将从一个“技术操作手册”升级为一个“完整的项目工作流”,更加全面、强大和实用。您的原始框架已经非常出色,这些补充只是锦上添花。

posted on 2025-11-15 15:30  GKLBB  阅读(2)  评论(0)    收藏  举报