应用安全 --- 反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. 初始化处理
# IDA Python脚本
import ida_auto
import idaapi
# 等待自动分析完成
ida_auto.auto_wait()
# 处理未识别函数
for addr in segments():
make_functions(addr, get_segm_end(addr))
B. 符号恢复与重命名
# 导入符号文件
- DWARF调试信息
- 导出的.sym文件
- FLIRT签名库匹配
- Lumina云端符号
# 自动重命名
- 字符串引用函数命名
- 系统调用函数识别
- 虚表自动识别
2.2 分层导出策略
A. 导出优先级(你已经提到的)
第一层:入口函数
- main / JNI_OnLoad
- .init / .init_array
- 构造/析构函数
第二层:导出函数
- 公开符号表函数
- 动态导出函数
第三层:按大小排序
大文件 → 可能是核心逻辑
小文件 → 可能是工具函数
B. 批量导出脚本
# 导出所有反编译代码
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使用策略
🔴 大型函数 (>1000行)
├─ Claude Opus 3.5 (深度分析)
├─ GPT-4 (交叉验证)
└─ 人工复审
🟡 中型函数 (200-1000行)
├─ Claude Sonnet (初步分析)
├─ Gemini Pro (功能识别)
└─ DeepSeek (补充说明)
🟢 小型函数 (<200行)
├─ GLM-4 (批量处理)
├─ DeepSeek (快速判断)
└─ 自动化脚本识别标准库
B. AI提示词模板
**函数分析提示词**:
请分析以下反编译代码:
1. **功能描述**:用一句话说明函数作用
2. **是否为标准库**:判断是否为glibc/STL/Boost等
3. **关键逻辑**:提取核心算法
4. **敏感操作**:标注加密/网络/文件操作
5. **参数含义**:推测各参数用途
6. **返回值**:说明返回内容
7. **潜在漏洞**:指出可能的安全问题
8. **重命名建议**:给出语义化函数名
代码:
```c
[粘贴反编译代码]
### 2.4 第三方库识别(新增)
#### A. 自动化工具
```bash
# 二进制相似度分析
bindiff file1.so file2.so # BinDiff
diaphora db1.sqlite db2.sqlite # Diaphora
# 开源库匹配
- rizzo (IDA插件)
- BinAbsInspector
- SaTC (静态二进制工具)
# FLIRT签名
- 官方sig库
- 自定义sig生成
B. 手动识别特征
✓ 字符串特征:版本号、作者信息、License
✓ 异常信息:"zlib version mismatch"
✓ 函数命名模式:ngx_*, SSL_*, curl_*
✓ 常量特征:魔数、算法常量
2.5 代码结构还原
A. 调用图生成
# 生成函数调用图
import ida_gdl
# 全局调用图
gen_flow_graph("callgraph.gdl")
# 关键函数子图
target_funcs = ["encrypt_data", "verify_signature"]
gen_simple_call_chart("keyfunc_calls.gdl", target_funcs)
B. 数据流分析
- 污点分析:追踪敏感数据流向
- 控制流图:理解分支逻辑
- 交叉引用:字符串/常量使用位置
🎯 三、动态分析阶段(补充完善)
3.1 环境准备
A. 调试环境搭建
# 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. 仿真环境
# QEMU用户模式
qemu-arm -g 1234 ./arm_binary
# 全系统模拟
qemu-system-arm -M vexpress-a9 -kernel zImage
3.2 Hook框架部署
A. Frida Hook
// 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
// 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. 参数捕获
# 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
// 内存区域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. 系统调用追踪
# 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. 网络流量分析
# 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脚本化
# 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调试
# 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. 内存补丁
// 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. 流程控制修改
// 跳过验证逻辑
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 加密算法识别
# FindCrypt插件
- AES常量检测
- RSA模数识别
- MD5/SHA魔数
- Base64编码表
# Kerckhoffs定律应用
- 查找密钥存储位置
- 分析IV/盐值生成
- 追踪密钥派生流程
4.2 混淆对抗
A. 控制流平坦化还原
# D810插件 (IDA)
# 自动化去除控制流混淆
# 手动分析思路
1. 识别dispatcher块
2. 提取case常量
3. 重建真实控制流
4. 生成清晰的伪代码
B. 字符串解密
# 动态解密所有字符串
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. 静态污点分析
Source点:
- 网络输入
- 文件读取
- 用户输入
Sink点:
- strcpy/sprintf (缓冲区溢出)
- system/exec (命令注入)
- SQL查询 (SQL注入)
B. Fuzzing
# AFL++ 模糊测试
afl-fuzz -i input/ -o output/ -- ./target @@
# LibFuzzer
clang++ -g -fsanitize=fuzzer,address target.cpp
./a.out corpus/
📊 五、报告与文档阶段(新增)
5.1 生成分析报告
A. 自动化报告模板
# 逆向分析报告 - [应用名称]
## 一、基本信息
- **文件名**: 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()
## 四、安全建议
1. 密钥不应硬编码
2. 建议使用KeyStore
3. 添加完整性校验
5.2 知识库建设
- 函数签名库积累
- 常见混淆模式总结
- 第三方库版本对照表
- 漏洞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 辅助工具
- radare2: 命令行逆向
- angr: 符号执行
- Z3: 约束求解
- Keypatch: 汇编补丁
- ret-sync: 调试同步
💡 七、最佳实践
7.1 工作流程优化
1. 建立标准化目录结构
project/
├── original/ # 原始文件
├── unpacked/ # 脱壳后
├── decompiled/ # 反编译代码
│ ├── large/
│ ├── medium/
│ └── small/
├── analysis/ # 分析笔记
├── scripts/ # 自动化脚本
└── reports/ # 分析报告
7.2 版本控制
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 合法边界
✅ 允许:
- 自己开发的应用
- 已授权的安全审计
- 教育研究目的(合理使用)
❌ 禁止:
- 盗版软件破解
- 游戏外挂开发
- 恶意代码植入
- 商业机密窃取
9.2 负责任披露
- 发现漏洞应先报告厂商
- 遵守CVE披露流程
- 不传播0day利用代码
- 保护用户隐私数据
总结:逆向分析是技术、经验和耐心的结合,建议循序渐进,从简单样本开始练习,逐步积累自己的工具库和知识库。祝你成功!
应用安全 --- 反编译(Decompile)通用流程(补充完善版)
一、预分析阶段
1.1 基础信息收集
- 使用
readelf、objdump等工具收集元数据 - 识别文件格式:ELF、PE、Mach-O、DEX/APK 等
- 检查壳/混淆/保护机制:UPX、VMProtect、Themida、ollvm 等
- 分析导入导出表,识别依赖库
1.2 加固识别
# 检查加固类型
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 代码分析优先级
第一优先级:入口点分析
1. main/start/_init/_init_array
2. JNI_OnLoad (Android Native)
3. __attribute__((constructor)) 函数
4. TLS回调函数
5. 导出函数列表
第二优先级:敏感函数定位
# IDA Python脚本示例
sensitive_funcs = [
"encrypt", "decrypt", "aes", "rsa", "md5", "sha",
"verify", "check", "valid", "license", "register",
"sign", "token", "auth", "login", "password"
]
2.3 AI辅助分析策略(补充)
分层分析策略
超大函数(>500行) → Claude Opus/Sonnet
大函数(200-500行) → GPT-4/DeepSeek
中函数(50-200行) → Gemini/GLM-4
小函数(<50行) → 批量处理/本地分析
提示词模板
请分析以下反编译代码:
1. 函数主要功能
2. 输入输出参数含义
3. 是否为标准库/第三方库函数
4. 潜在的安全问题
5. 关键算法识别(加密/校验/混淆)
[代码]
2.4 代码清洗与标注
- 重命名变量: var_1 → key_buffer
- 识别结构体: 使用 IDA Local Types 定义
- 标注常量: 魔数、算法标识(如 0x67452301 → MD5_A)
- 交叉引用分析: Xrefs to/from 定位调用链
2.5 自动化脚本示例
# 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
// 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
// Hook SSL_write/SSL_read
// Hook send/recv/sendto/recvfrom
// Hook HttpURLConnection/OkHttp
文件操作Hook
// Hook open/read/write
// Hook fopen/fread/fwrite
// Hook FileInputStream/FileOutputStream
3.4 动态调试技巧
反反调试
# Frida 绕过 ptrace 检测
Interceptor.replace(Module.findExportByName(null, "ptrace"), new NativeCallback(function() {
return 0;
}, 'int', []));
# 绕过时间检测
# 绕过完整性校验
内存dump
# 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 静态+动态结合
静态分析定位 → 动态验证 → 修正静态分析 → 循环迭代
4.2 流程还原
- 绘制调用图: IDA Call Graph, Graphviz
- 时序分析: 记录函数调用顺序
- 数据流分析: 参数传递与转换过程
- 状态机还原: 协议/逻辑状态转换
4.3 算法提取
- 加密算法识别: FindCrypt, Kryptor插件
- 常量定位: KANAL插件
- 算法复现: 提取关键代码用Python/C重写
五、文档输出阶段(新增)
5.1 分析报告结构
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 性能优化
# 批量分析时使用多进程
from multiprocessing import Pool
# 设置IDA分析超时
# 跳过标准库函数
7.3 合规建议
⚠️ 仅在授权情况下进行逆向分析
⚠️ 遵守DMCA、计算机欺诈和滥用法等法律
⚠️ 研究目的应为安全测试、漏洞挖掘、学习交流
八、检查清单(新增)
- 确认目标架构和保护机制
- 完成脱壳/解密
- 定位所有入口点
- 识别并排除第三方库
- 分析关键算法
- Hook验证静态分析结论
- 绘制完整调用链
- 编写分析文档
- PoC验证
- 清理敏感信息
提示: 根据具体目标(恶意软件分析、漏洞挖掘、协议逆向、授权破解等)调整分析侧重点。
预分析
是什么文件,是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等)
分析关键函数的交叉调用链还原原始的调用逻辑。
数据流分析:追踪关键变量的传播路径
控制流分析:绘制状态机或流程图
动态分析
动态或者静态插桩快速分析内存中的函数。包含函数的调用的流程,函数入参和返回值,修改执行流程。
手动调试。在关键函数下断点分析内存,栈,寄存器,加载模块地址和大小,指令集的执行位置的完整功能,配置可能非常复杂但是通用性强。
请补充
浙公网安备 33010602011771号