公开文集
0x01 SRC 资产管理系统
0x02 Web 漏洞案例库
0x03 小程序漏洞案例库
第一章:小程序渗透基础
1.1 微信小程序反编译与动态调试
1.2 微信小程序强制开启开发者模式
0x99 信息安全学习体系
01-网络安全基础
Day-001-TCP-IP协议栈安全分析
Day-002-DNS协议安全与DNS劫持攻防
Day-003-IPv6 安全基础与过渡
Day-004-HTTP-HTTPS协议深度解析
Day-005-网络嗅探与流量分析技术
Day-006-防火墙原理与配置实践
Day-007-网络地址转换 NAT 安全分析
Day-008-路由协议安全 RIP-OSPF-BGP
Day-009-VLAN 安全与 VLAN-Hopping
Day-010-无线网络基础与安全 802.11
Day-011-网络访问控制 802.1X-NAC
Day-012-网络分段与微隔离设计
Day-013-负载均衡器安全配置
Day-014-CDN安全与防护
Day-015-NTP安全
Day-016-DHCP安全与攻击防护
Day-017-ICMP协议安全分析
Day-018-网络协议模糊测试基础
Day-019-网络流量基线建立
Day-020-网络取证基础
Day-021-网络入侵检测系统 NIDS
Day-022-网络入侵防御系统 NIPS
Day-023-网络流量加密与解密
Day-024-网络协议逆向工程基础
Day-025-网络性能与安全权衡
Day-026-SDN 安全
Day-027-网络虚拟化安全
Day-028-网络欺骗技术
Day-029-网络威胁情报应用
Day-030-网络容量规划与安全
Day-031-网络安全架构设计实战
02-Web 安全
Day-032-OWASP-Top-10-2021详解
Day-033-SQL 注入原理与手工检测
Day-034-SQL注入进阶报错注入与盲注
Day-035-XSS跨站脚本攻击基础
Day-036-XSS 进阶绕过与利用
Day-037-XSS进阶绕过与利用
Day-038-CSRF 跨站请求伪造
Day-039-文件上传漏洞
Day-040-反序列化漏洞基础
Day-041-PHP反序列化深入
Day-042-Java反序列化深入
Day-043-SSTI 服务端模板注入
Day-044-文件包含漏洞 LFI-RFI
Day-045-命令注入漏洞
Day-046-XXE-XML 外部实体注入
Day-047-反序列化漏洞进阶
Day-048-API 安全基础
Day-049-API认证与授权安全
Day-050-API漏洞挖掘实战
Day-051-文件上传漏洞进阶
Day-052-反序列化漏洞实战
Day-053-Web 安全综合实战
Day-054-移动安全基础
Day-055-Android 应用安全测试
Day-056-iOS 应用安全测试
Day-057-移动应用综合实战
Day-058-云安全基础
Day-059-AWS 安全实战
Day-060-Azure 安全实战
Day-061-GCP 安全实战
Day-062-云安全综合实战
Day-063-容器安全基础
Day-064-Docker 安全实战
Day-065-Kubernetes 安全实战
Day-066-容器安全综合实战
Day-067-API 安全进阶
Day-068-服务端请求伪造 SSRF 深入
Day-069-文件上传漏洞进阶
Day-070-反序列化漏洞实战进阶
Day-071-业务逻辑漏洞深入
Day-072-前端安全深入
Day-073-Web 安全综合实战
Day-074-云安全进阶
Day-075-移动安全进阶
Day-076-API 安全进阶
Day-077-前端安全进阶
Day-078-业务逻辑漏洞进阶
Day-079-反序列化漏洞实战进阶
Day-080-文件上传漏洞实战进阶
Day-081-SSTI 服务端模板注入进阶
Day-082-XXE-XML 外部实体注入进阶
Day-083-SSRF 服务端请求伪造进阶
Day-084-命令注入漏洞进阶
Day-085-文件包含漏洞进阶
Day-086-反序列化漏洞实战进阶
Day-087-文件上传漏洞实战进阶
Day-088-SSTI 服务端模板注入实战进阶
Day-089-XXE-XML 外部实体注入实战进阶
Day-090-SSRF 服务端请求伪造实战进阶
Day-091-命令注入漏洞实战进阶
Day-092-Web 安全综合实战
Day-093-GraphQL 安全
Day-094-JWT 与 OAuth2 安全
03-系统安全
Day-095-系统监控与检测
Day-096-主机防火墙配置
Day-097-系统审计与合规
Day-098-Linux 系统安全进阶
Day-099-Windows 系统安全进阶
Day-100-容器安全进阶
Day-101-容器编排安全进阶
Day-102-Linux 内核安全
Day-103-Windows 内核安全
Day-104-系统安全总结与实战
Day-105-Linux 系统安全基础
Day-106-Windows 系统安全基础
Day-107-容器安全基础
Day-108-系统加固技术
Day-109-日志分析技术
Day-110-威胁狩猎技术
04-应用安全
Day-111-安全编码规范
Day-112-输入验证技术
Day-113-输出编码技术
Day-114-错误处理安全
Day-115-会话管理安全
Day-116-认证安全
Day-117-授权安全
Day-118-数据保护安全
Day-119-日志安全
Day-120-API 安全
Day-121-微服务安全
Day-122-新兴技术安全概论
Day-123-DevSecOps 流水线安全
Day-124-云原生安全架构
Day-125-API 安全最佳实践
Day-126-安全编码规范
Day-127-SDL 安全开发生命周期
Day-128-威胁建模实战
Day-129-安全需求分析
Day-130-安全架构设计
Day-131-安全编码实践Java
Day-132-安全编码实践Python
Day-133-代码审计方法论
Day-134-静态代码分析SAST
Day-135-动态应用测试DAST
Day-136-交互式测试IAST
Day-137-软件成分分析SCA
Day-138-依赖漏洞管理
Day-139-安全测试自动化
Day-140-漏洞管理与响应
Day-141-应用安全总结与展望
Day-142-OWASP-Top10-2024 详解
Day-143-CWE-Top25 分析
Day-144-漏洞挖掘方法论
Day-145-模糊测试技术
Day-146-逆向工程基础
Day-147-漏洞利用开发基础
Day-148-漏洞复现与验证
Day-149-漏洞披露流程
Day-150-CVE 申请与管理
Day-151-漏洞赏金计划
Day-152-等保2.0详解
Day-153-GDPR 合规实践
Day-154-数据安全法解读
Day-155-个人信息保护法与合规指南
Day-156-个人信息保护法解读
Day-157-ISO-27001 信息安全管理体系
Day-158-SOC-2 合规与审计
Day-159-PCI-DSS 支付卡行业数据安全标准
Day-160-网络安全审查办法解读
Day-161-数据出境安全评估办法
Day-162-应用安全评估实战
Day-163-红蓝对抗演练
Day-164-安全应急响应
Day-165-安全运营中心建设
Day-166-应用安全总结与展望
05-密码学
Day-167-密码学基础
Day-168-对称加密算法详解
Day-169-非对称加密算法详解
Day-170-哈希函数与数字签名
Day-171-密钥管理与PKI
Day-172-TLS-SSL 协议详解
Day-173-国密算法详解
Day-174-认证与密钥协议
Day-175-随机数生成与熵源
Day-176-椭圆曲线密码学详解
Day-177-后量子密码学详解
Day-178-高级密码学主题
Day-179-密码学行业应用精选
Day-180-常用加密算法原理与实现
Day-181-密码学总结与展望
Day-182-密码学系列总结与展望
06-渗透测试
Day-183-渗透测试方法论
Day-184-信息收集技术详解
Day-185-漏洞扫描技术详解
Day-186-漏洞利用技术详解
Day-187-渗透测试中的漏洞利用框架
Day-188-漏洞利用框架与 Metasploit 深入
Day-189-渗透测试中的 WAF 绕过技术
Day-190-渗透测试中的模糊测试技术
Day-191-渗透测试中的代码审计与静态分析
Day-192-渗透测试中的密码哈希破解技术
Day-193-渗透测试报告编写指南
Day-194-Web 应用渗透测试
Day-195-渗透测试中的 API 安全测试
Day-196-渗透测试中的 GraphQL 安全测试
Day-197-渗透测试中的前后端分离应用测试
Day-198-渗透测试中的小程序安全测试
Day-199-渗透测试中的浏览器安全测试
Day-200-OAuth-SSO安全测试
Day-201-渗透测试中的业务逻辑漏洞测试
Day-202-渗透测试中的厚客户端安全测试
Day-203-渗透测试综合实战演练
Day-204-内网渗透技术详解
Day-205-渗透测试中的内网信息收集进阶
Day-206-渗透测试中的域森林渗透技术
Day-207-渗透测试中的权限维持技术
Day-208-渗透测试中的横向移动技术
Day-209-渗透测试中的痕迹清理与反取证技术
Day-210-渗透测试中的数据窃取与 Exfiltration 技术
Day-211-渗透测试中的内部威胁与数据泄露测试
Day-212-渗透测试中的物理安全渗透
Day-213-社会工程学攻击技术
Day-214-移动应用渗透测试
Day-215-云安全渗透测试
Day-216-渗透测试中的容器与 Kubernetes 安全渗透
Day-217-渗透测试中的 Serverless 安全测试
Day-218-渗透测试中的微服务安全测试
Day-219-物联网安全渗透测试
Day-220-工业控制系统安全渗透测试
Day-221-无线网络安全渗透测试
Day-222-数据库安全渗透测试
Day-223-渗透测试中的供应链安全测试
Day-224-红队演练技术详解
Day-225-渗透测试中的红队基础设施搭建
Day-226-渗透测试中的威胁情报与狩猎
Day-227-渗透测试中的综合指纹识别技术
Day-228-自动化渗透测试技术
Day-229-渗透测试中的运维安全测试
Day-230-渗透测试中的区块链与智能合约安全测试
Day-231-渗透测试中的漏洞管理与修复验证
Day-232-渗透测试法律与合规
Day-233-后渗透攻击技术详解
Day-234-渗透测试中的人工智能应用
Day-235-漏洞利用开发深入
Day-236-云原生渗透测试深入
07-应急响应
Day-237-应急响应概述与核心概念
Day-238-应急响应流程框架
Day-239-CSIRT 团队组建与职责分工
Day-240-应急响应工具包准备
Day-241-应急响应法律与合规要求
Day-242-安全事件检测方法与指标
Day-243-云原生应急响应
Day-244-日志收集与分析技术
Day-245-网络流量分析与异常识别
Day-246-自动化响应与 SOAR
Day-247-端点监控与 EDR 技术
Day-248-威胁狩猎方法论
Day-249-威胁情报在检测中的应用
Day-250-数字取证基础与证据链管理
Day-251-内存取证技术
Day-252-磁盘取证与文件恢复
Day-253-网络取证与数据包分析
Day-254-云环境与容器取证
Day-255-恶意代码静态分析技术
Day-256-恶意代码动态分析技术
Day-257-恶意代码行为分析方法
Day-258-逆向工程基础与工具
Day-259-沙箱技术与自动化分析
Day-260-事件隔离与遏制策略
Day-261-威胁根除与系统修复
Day-262-系统恢复与数据重建
Day-263-业务连续性计划
Day-264-事件复盘与经验总结
Day-265-APT 攻击事件复盘分析
Day-266-勒索软件事件响应实战
Day-267-数据泄露事件处置流程
Day-268-内部威胁调查与取证
Day-269-综合应急响应演练
08-安全运维
Day-270-安全运营中心 SOC 概述
Day-271-安全监控指标体系
Day-272-安全告警管理
Day-273-安全可视化与仪表盘
Day-274-监控工具选型
Day-275-日志采集技术
Day-276-日志标准化与解析
Day-277-日志存储与归档
Day-278-日志分析技术
Day-279-日志合规要求
Day-280-SIEM 架构与设计
Day-281-关联规则引擎
Day-282-高级关联分析
Day-283-UEBA 用户实体行为分析
Day-284-威胁狩猎
Day-285-SOAR 基础概念
Day-286-剧本设计
Day-287-自动化响应技术
Day-288-安全工具集成
Day-289-SOAR 度量与优化
Day-290-安全基线管理
Day-291-漏洞管理流程
Day-292-补丁管理策略
Day-293-变更安全管理
Day-294-合规审计技术
Day-295-7x24 安全运营
Day-296-安全事件管理流程
Day-297-安全运营度量体系
Day-298-持续改进机制
Day-299-安全运维综合演练
Day-300-云原生安全运营
Day-301-AI 与机器学习安全运营
Day-302-安全自动化脚本实战
09-移动安全
Day-303-移动安全威胁概述
Day-304-移动设备安全架构
Day-305-移动操作系统安全模型
Day-306-移动应用权限管理
Day-307-移动端数据加密
Day-308-330-Android 安全合集
Day-309-Android 安全架构
Day-310-Android 组件安全
Day-311-Android 权限与隐私
Day-312-Android 逆向工程
Day-313-Android 应用加固
Day-314-iOS 安全架构
Day-315-iOS 应用沙盒机制
Day-316-越狱与反越狱
Day-317-iOS 逆向工程
Day-318-iOS 企业分发安全
Day-319-移动安全开发生命周期
Day-320-移动应用安全测试
Day-321-移动应用加固技术
Day-322-移动威胁防护
Day-323-移动安全合规
10-云安全
Day-324-云计算安全模型
Day-325-责任共担模型
Day-326-云安全威胁模型
Day-327-云安全合规框架
Day-328-云安全架构设计
Day-329-AWS IAM 安全
Day-330-AWS 网络安全
Day-331-AWS 存储安全
Day-332-AWS 安全监控
Day-333-AWS 安全最佳实践
Day-334-Azure AD 安全
Day-335-Azure 网络安全
Day-336-Azure 存储安全
Day-337-Azure 安全中心
Day-338-Azure 安全最佳实践
Day-339-容器安全基础
Day-340-Kubernetes 安全
Day-341-Serverless 安全
Day-342-云原生 DevSecOps
Day-343-云安全态势管理 CSPM
11-物联网工控
Day-344-物联网安全概述
Day-345-IoT 通信协议安全
Day-346-IoT 设备安全
Day-347-IoT 平台安全
Day-348-IoT 应用安全
Day-349-工业控制系统概述
Day-350-工控协议安全
Day-351-PLC 安全
Day-352-SCADA 系统安全
Day-353-工控安全防护
12-综合与总结
Day-354-安全职业发展路径
Day-355-安全技术趋势展望
Day-356-安全建设方法论
Day-357-经典攻防案例复盘
Day-358-安全学习资源指南
Day-359-信息安全行业求职指南
-
+
首页
Day-146-逆向工程基础
# Day 160: 逆向工程基础 > 漏洞与攻防系列第 5 天 | 预计阅读时间:60 分钟 | 难度:★★★★☆ --- **PUA v3 · Sprint 启动** ``` ┌─────────┬────────────────────────────────────┐ │ 清单 任务 │ 逆向工程基础 - Day 160 │ ├─────────┼────────────────────────────────────┤ │ 味道 │ 阿里味(自动:安全任务) │ ├─────────┼────────────────────────────────────┤ │ 压力 │ L0 · 信任期 │ └─────────┴────────────────────────────────────┘ ``` ▎ 逆向工程不是神秘技术,是分析方法。分析不深入,理解就是表面的。今天深入逆向工程基础。 --- ## 清单 目录 1. [逆向工程概述](#逆向工程概述) 2. [逆向工程工具](#逆向工程工具) 3. [汇编语言基础](#汇编语言基础) 4. [静态分析技术](#静态分析技术) 5. [动态分析技术](#动态分析技术) 6. [脱壳与反调试](#脱壳与反调试) 7. [漏洞分析实战](#漏洞分析实战) 8. [恶意代码分析](#恶意代码分析) 9. [软件保护与破解](#软件保护与破解) 10. [总结与思考](#总结与思考) 11. [参考资料](#参考资料) --- ## 逆向工程概述 ### 什么是逆向工程 > ▎ 逆向工程不是黑客技术,是分析方法。方法不合法,使用就是犯罪的。 **定义与价值**: ``` 逆向工程 (Reverse Engineering) 是通过分析软件的二进制代码来理解其功能、结构和实现的技术。 核心价值: 1. 安全研究 - 漏洞分析 - 恶意代码分析 - 软件保护研究 2. 兼容性开发 - 协议分析 - 格式分析 - 接口分析 3. 学习理解 - 算法学习 - 实现学习 - 优化学习 ``` **法律与道德**: ``` ┌─────────────────────────────────────────────────────────┐ │ 逆向工程法律与道德 │ ├─────────────────────────────────────────────────────────┤ │ │ │ 合法用途: │ │ ✓ 安全研究 (授权范围内) │ │ ✓ 兼容性开发 │ │ ✓ 教学目的 │ │ ✓ 自己拥有的软件 │ │ │ │ 非法用途: │ │ ✗ 侵犯版权 │ │ ✗ 商业间谍 │ │ ✗ 恶意破解 │ │ ✗ 未授权分析 │ │ │ │ 道德准则: │ │ • 仅分析自己有权分析的软件 │ │ • 不用于非法目的 │ │ • 负责任地披露漏洞 │ │ • 尊重知识产权 │ │ │ └─────────────────────────────────────────────────────────┘ ``` ### 逆向工程流程 **标准流程**: ```python # 逆向工程流程 class ReverseEngineeringProcess: """逆向工程标准流程""" # 流程阶段 phases = { 'preparation': { 'name': '准备阶段', 'description': '准备分析环境', 'activities': [ '设置分析环境', '准备工具', '备份目标文件' ], 'outputs': ['分析环境', '工具集'] }, 'reconnaissance': { 'name': '侦察阶段', 'description': '初步了解目标', 'activities': [ '文件类型识别', '加壳检测', '入口点分析' ], 'outputs': ['目标概况', '初步分析'] }, 'static_analysis': { 'name': '静态分析', 'description': '不运行程序分析', 'activities': [ '反汇编', '字符串分析', '函数分析', '控制流分析' ], 'outputs': ['反汇编代码', '函数列表', '字符串列表'] }, 'dynamic_analysis': { 'name': '动态分析', 'description': '运行程序分析', 'activities': [ '调试运行', '内存分析', '网络分析', '文件操作分析' ], 'outputs': ['运行轨迹', '内存转储', '行为记录'] }, 'documentation': { 'name': '文档编写', 'description': '记录分析结果', 'activities': [ '整理分析结果', '编写报告', '绘制图表' ], 'outputs': ['分析报告', '流程图', '函数文档'] } } def execute_process(self, target_file): """执行逆向工程流程""" results = { 'target': target_file, 'phases': {}, 'findings': [], 'summary': {} } # 准备阶段 preparation = self.prepare_environment() results['phases']['preparation'] = preparation # 侦察阶段 reconnaissance = self.reconnaissance(target_file) results['phases']['reconnaissance'] = reconnaissance results['findings'].extend(reconnaissance.get('findings', [])) # 静态分析 static_analysis = self.static_analysis(target_file) results['phases']['static_analysis'] = static_analysis results['findings'].extend(static_analysis.get('findings', [])) # 动态分析 dynamic_analysis = self.dynamic_analysis(target_file) results['phases']['dynamic_analysis'] = dynamic_analysis results['findings'].extend(dynamic_analysis.get('findings', [])) # 文档编写 documentation = self.create_documentation(results) results['phases']['documentation'] = documentation # 汇总结果 results['summary'] = self.summarize_findings(results['findings']) return results def prepare_environment(self): """准备分析环境""" return { 'vm_setup': '隔离虚拟机', 'tools_installed': ['IDA Pro', 'Ghidra', 'x64dbg', 'Wireshark'], 'snapshots': '创建快照' } def reconnaissance(self, target_file): """侦察阶段""" import subprocess # 文件类型识别 file_type = subprocess.run(['file', target_file], capture_output=True, text=True) # 加壳检测 packer_detection = self.detect_packer(target_file) # 入口点分析 entry_point = self.get_entry_point(target_file) return { 'file_type': file_type.stdout, 'packer': packer_detection, 'entry_point': entry_point, 'findings': [] } def detect_packer(self, target_file): """检测加壳""" # 使用 PEiD 或类似工具 # 实际实现需要调用相应工具 return {'packed': False, 'packer_name': None} def get_entry_point(self, target_file): """获取入口点""" # 解析 PE 头或 ELF 头 # 返回入口点地址 return '0x00401000' def static_analysis(self, target_file): """静态分析""" return { 'disassembly': '反汇编代码', 'strings': self.extract_strings(target_file), 'functions': self.analyze_functions(target_file), 'imports': self.analyze_imports(target_file), 'findings': [] } def extract_strings(self, target_file): """提取字符串""" import subprocess result = subprocess.run(['strings', target_file], capture_output=True, text=True) return result.stdout.split('\n')[:100] # 限制数量 def analyze_functions(self, target_file): """分析函数""" # 实际实现需要反汇编工具 return [] def analyze_imports(self, target_file): """分析导入函数""" # 解析导入表 return [] def dynamic_analysis(self, target_file): """动态分析""" return { 'execution_trace': '执行轨迹', 'memory_dump': '内存转储', 'network_traffic': '网络流量', 'file_operations': '文件操作', 'findings': [] } def create_documentation(self, results): """创建文档""" return { 'report': '分析报告', 'diagrams': '流程图', 'notes': '分析笔记' } def summarize_findings(self, findings): """汇总发现""" return { 'total_findings': len(findings), 'critical': len([f for f in findings if f.get('severity') == 'critical']), 'high': len([f for f in findings if f.get('severity') == 'high']), 'medium': len([f for f in findings if f.get('severity') == 'medium']), 'low': len([f for f in findings if f.get('severity') == 'low']) } ``` --- ## 逆向工程工具 ### 反汇编工具 > ▎ 工具不是装了就用,是熟练再用。工具不熟练,分析就是低效的。 **常用工具**: ``` ┌─────────────────────────────────────────────────────────┐ │ 逆向工程工具分类 │ ├─────────────────────────────────────────────────────────┤ │ │ │ 反汇编工具: │ │ ├── IDA Pro (商业,功能最强) │ │ ├── Ghidra (免费,NSA 出品) │ │ ├── Binary Ninja (商业,现代化) │ │ └── radare2 (免费,命令行) │ │ │ │ 调试工具: │ │ ├── x64dbg/x32dbg (Windows) │ │ ├── GDB (Linux/Unix) │ │ ├── LLDB (macOS) │ │ └── WinDbg (Windows 内核) │ │ │ │ 分析工具: │ │ ├── PEStudio (PE 文件分析) │ │ ├── Detect It Easy (加壳检测) │ │ ├── Dependencies (依赖分析) │ │ └── Strings (字符串提取) │ │ │ │ 辅助工具: │ │ ├── HxD (十六进制编辑) │ │ ├── Wireshark (网络分析) │ │ ├── Process Monitor (系统监控) │ │ └── Regshot (注册表监控) │ │ │ └─────────────────────────────────────────────────────────┘ ``` **Ghidra 使用指南**: ```python # Ghidra 脚本示例 # Ghidra 支持 Python 和 Java 脚本 # 1. 列出所有函数 """ 函数列表脚本 """ from ghidra.app.script import GhidraScript from ghidra.program.model.listing import Function class ListFunctions(GhidraScript): def run(self): functionManager = currentProgram.getFunctionManager() functions = functionManager.getFunctions(True) # True = 包括外部函数 print(f"Total functions: {len(functions)}") for func in functions: print(f"Function: {func.getName()} at {func.getEntryPoint()}") # 2. 查找字符串引用 """ 字符串引用查找脚本 """ from ghidra.app.script import GhidraScript from ghidra.program.model.data import StringDataType class FindStringReferences(GhidraScript): def run(self): searchString = self.askString("String to search", "Enter string:") listing = currentProgram.getListing() data = listing.getDataAt(currentProgram.getMinAddress()) while data != None: if isinstance(data.getDataType(), StringDataType): if searchString in str(data.getValue()): print(f"Found at: {data.getAddress()}") print(f"Value: {data.getValue()}") data = listing.getDataAfter(data) # 3. 查找函数调用 """ 函数调用查找脚本 """ from ghidra.app.script import GhidraScript from ghidra.program.model.symbol import RefType class FindFunctionCalls(GhidraScript): def run(self): functionName = self.askString("Function name", "Enter function name:") functionManager = currentProgram.getFunctionManager() targetFunc = None for func in functionManager.getFunctions(True): if func.getName() == functionName: targetFunc = func break if targetFunc: print(f"Function found at: {targetFunc.getEntryPoint()}") # 查找调用 references = targetFunc.getReferences(currentProgram) print(f"Called by {references.length} functions:") for ref in references: callingFunc = functionManager.getFunctionAt(ref.getFromAddress()) if callingFunc: print(f" - {callingFunc.getName()} at {ref.getFromAddress()}") else: print(f" - Unknown at {ref.getFromAddress()}") # 4. 导出反汇编代码 """ 导出反汇编脚本 """ from ghidra.app.script import GhidraScript from ghidra.app.decompiler import DecompInterface class ExportDisassembly(GhidraScript): def run(self): decompInterface = DecompInterface() decompInterface.openProgram(currentProgram) functionManager = currentProgram.getFunctionManager() functions = functionManager.getFunctions(True) outputFile = self.askFile("Output file", "Select output file", None, True) with open(outputFile.absolutePath, 'w') as f: for func in functions: f.write(f"Function: {func.getName()}\n") f.write(f"Address: {func.getEntryPoint()}\n") f.write("-" * 50 + "\n") results = decompInterface.decompileFunction(func, 0, None) if results.decompileCompleted(): f.write(results.getDecompiledFunction().getC()) f.write("\n") f.write("\n") print(f"Exported {len(functions)} functions to {outputFile}") ``` ### 调试工具 **x64dbg 使用**: ``` x64dbg 基本操作: 1. 加载程序 - 拖拽 PE 文件到 x64dbg - 或使用 File → Open 2. 基本调试命令 - F7: 单步进入 (Step Into) - F8: 单步跳过 (Step Over) - F9: 运行 (Run) - F12: 暂停 (Break) - F2: 设置断点 (Toggle Breakpoint) 3. 断点类型 - 软件断点 (INT3) - 硬件断点 - 内存断点 - 异常断点 4. 查看窗口 - CPU: 反汇编视图 - Registers: 寄存器 - Stack: 堆栈 - Memory: 内存 - Symbols: 符号 5. 常用插件 - Scylla: 导入表修复 - x64dbgpy: Python 脚本支持 - DumpIt: 内存转储 - HideDbg: 反反调试 ``` **GDB 使用**: ```bash # GDB 基本命令 # 启动调试 gdb ./program # 设置断点 break main # 在 main 函数断点 break *0x401000 # 在地址断点 break file.c:10 # 在源文件行断点 # 运行程序 run # 运行 run arg1 arg2 # 带参数运行 # 单步执行 step # 进入函数 next # 跳过函数 continue # 继续运行 # 查看信息 info registers # 查看寄存器 info stack # 查看堆栈 info locals # 查看局部变量 info functions # 查看函数列表 # 查看内存 x/10x 0x401000 # 查看 10 个十六进制字 x/10i 0x401000 # 查看 10 条指令 x/s 0x401000 # 查看字符串 # 修改寄存器 set $eax=0 # 设置 eax 寄存器 set $rip=0x401000 # 设置指令指针 # 查看堆栈 backtrace # 查看调用栈 frame 0 # 选择栈帧 # 条件断点 break main if x>10 # 条件断点 # 观察点 watch variable # 设置观察点 # 脚本 source script.gdb # 执行 GDB 脚本 ``` --- ## 汇编语言基础 ### x86/x64 汇编 > ▎ 汇编不是天书,是机器语言。语言不理解,分析就是盲目的。 **寄存器**: ``` x86/x64 寄存器: 通用寄存器 (64 位): ├── RAX: 累加器 (返回值) ├── RBX: 基址寄存器 ├── RCX: 计数寄存器 ├── RDX: 数据寄存器 ├── RSI: 源索引 ├── RDI: 目标索引 ├── RBP: 基址指针 (栈帧) ├── RSP: 栈指针 ├── R8-R15: 额外寄存器 指令指针: └── RIP: 指令指针 (64 位) 标志寄存器: ├── ZF: 零标志 ├── SF: 符号标志 ├── CF: 进位标志 ├── OF: 溢出标志 └── PF: 奇偶标志 段寄存器: ├── CS: 代码段 ├── DS: 数据段 ├── SS: 栈段 └── ES, FS, GS: 额外段 ``` **常用指令**: ``` 常用汇编指令: 数据传输: ├── MOV dest, src # 传送 ├── PUSH value # 压栈 ├── POP dest # 出栈 ├── XCHG a, b # 交换 └── LEA reg, [mem] # 加载有效地址 算术运算: ├── ADD dest, src # 加法 ├── SUB dest, src # 减法 ├── MUL src # 乘法 ├── DIV src # 除法 ├── INC dest # 自增 ├── DEC dest # 自减 └── NEG dest # 取反 逻辑运算: ├── AND dest, src # 与 ├── OR dest, src # 或 ├── XOR dest, src # 异或 ├── NOT dest # 非 └── TEST a, b # 测试 控制转移: ├── JMP dest # 无条件跳转 ├── JE/JZ dest # 等于/为零跳转 ├── JNE/JNZ dest # 不等于/不为零跳转 ├── JL dest # 小于跳转 ├── JG dest # 大于跳转 ├── CALL func # 调用函数 └── RET # 返回 字符串操作: ├── MOVSB # 移动字符串字节 ├── MOVSW # 移动字符串字 ├── CMPSB # 比较字符串字节 ├── SCASB # 扫描字符串 └── STOSB # 存储字符串字节 系统调用: ├── SYSCALL # 系统调用 (x64) ├── INT 0x80 # 中断 (x86) └── SYSENTER # 快速系统调用 ``` **函数调用约定**: ``` x64 调用约定 (Windows): 参数传递: ├── 第 1 参数:RCX ├── 第 2 参数:RDX ├── 第 3 参数:R8 ├── 第 4 参数:R9 └── 第 5+ 参数:栈 返回值: └── RAX 栈帧: ├── 调用者负责分配栈空间 ├── 被调用者保存:RBX, RBP, RDI, RSI, R12-R15 └── 易失寄存器:RAX, RCX, RDX, R8-R11 函数序言: PUSH RBP MOV RBP, RSP SUB RSP, <size> 函数尾声: MOV RSP, RBP POP RBP RET ``` --- ## 静态分析技术 ### 反汇编分析 > ▎ 反汇编不是看代码,是理解逻辑。逻辑不理解,分析就是表面的。 **分析方法**: ```python # 静态分析示例 class StaticAnalysis: """静态分析""" def __init__(self, binary_file): self.binary_file = binary_file self.functions = [] self.strings = [] self.imports = [] def analyze(self): """执行静态分析""" self.extract_strings() self.analyze_imports() self.identify_functions() self.analyze_control_flow() return { 'strings': self.strings, 'imports': self.imports, 'functions': self.functions } def extract_strings(self): """提取字符串""" import subprocess result = subprocess.run( ['strings', '-n', '4', self.binary_file], capture_output=True, text=True ) self.strings = result.stdout.split('\n') # 分类字符串 self.classify_strings() def classify_strings(self): """分类字符串""" categories = { 'urls': [], 'ips': [], 'paths': [], 'commands': [], 'errors': [], 'other': [] } import re for s in self.strings: if re.match(r'https?://', s): categories['urls'].append(s) elif re.match(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', s): categories['ips'].append(s) elif s.startswith('/') or '\\' in s: categories['paths'].append(s) elif any(cmd in s.lower() for cmd in ['cmd', 'shell', 'exec', 'system']): categories['commands'].append(s) elif any(err in s.lower() for err in ['error', 'fail', 'invalid']): categories['errors'].append(s) else: categories['other'].append(s) self.strings = categories def analyze_imports(self): """分析导入函数""" # 使用 objdump 或类似工具 import subprocess result = subprocess.run( ['objdump', '-T', self.binary_file], capture_output=True, text=True ) # 解析导入函数 self.imports = self.parse_imports(result.stdout) def parse_imports(self, output): """解析导入""" imports = [] suspicious_imports = [ 'VirtualAlloc', 'VirtualProtect', # 内存操作 'CreateProcess', 'ShellExecute', # 进程创建 'RegSetValue', 'RegCreateKey', # 注册表 'InternetOpen', 'HttpSendRequest', # 网络 'CryptEncrypt', 'CryptDecrypt', # 加密 'GetProcAddress', 'LoadLibrary' # 动态加载 ] for line in output.split('\n'): for imp in suspicious_imports: if imp in line: imports.append({ 'function': imp, 'line': line, 'suspicious': True }) return imports def identify_functions(self): """识别函数""" # 实际实现需要反汇编 pass def analyze_control_flow(self): """分析控制流""" # 构建控制流图 pass ``` ### 字符串分析 **字符串分析技巧**: ``` 字符串分析要点: 1. 可疑字符串类型 ├── URL/IP 地址 (网络通信) ├── 文件路径 (文件操作) ├── 命令字符串 (命令执行) ├── 错误消息 (功能提示) ├── 注册表键 (持久化) └── 加密密钥 (加密操作) 2. 编码字符串 ├── Base64 编码 ├── URL 编码 ├── Unicode 编码 └── 自定义编码 3. 隐藏字符串 ├── 分割存储 ├── 动态构建 ├── 加密存储 └── 栈上构建 4. 分析工具 ├── strings (基本提取) ├── FLOSS (混淆字符串) └── Custom scripts (自定义) ``` --- ## 动态分析技术 ### 调试分析 > ▎ 调试不是单步走,是理解行为。行为不理解,分析就是片面的。 **调试技巧**: ```python # 动态分析示例 class DynamicAnalysis: """动态分析""" def __init__(self, target_binary): self.target = target_binary self.trace = [] self.breakpoints = [] def setup_debugger(self): """设置调试器""" import subprocess # 使用 GDB self.gdb = subprocess.Popen( ['gdb', self.target], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) def send_command(self, command): """发送 GDB 命令""" self.gdb.stdin.write(command + '\n') self.gdb.stdin.flush() # 读取输出 output = self.gdb.stdout.readline() return output def set_breakpoint(self, address): """设置断点""" result = self.send_command(f'break *{address}') self.breakpoints.append(address) return result def run_to_breakpoint(self): """运行到断点""" result = self.send_command('continue') # 记录状态 self.record_state() return result def record_state(self): """记录当前状态""" state = { 'registers': self.get_registers(), 'stack': self.get_stack(), 'memory': self.get_memory(), 'instruction': self.get_current_instruction() } self.trace.append(state) def get_registers(self): """获取寄存器""" output = self.send_command('info registers') return self.parse_registers(output) def parse_registers(self, output): """解析寄存器""" registers = {} for line in output.split('\n'): parts = line.split() if len(parts) >= 2: reg_name = parts[0].rstrip(':') reg_value = parts[1] registers[reg_name] = reg_value return registers def get_stack(self): """获取堆栈""" output = self.send_command('x/20x $rsp') return output def get_memory(self, address, size=100): """获取内存""" output = self.send_command(f'x/{size}x {address}') return output def get_current_instruction(self): """获取当前指令""" output = self.send_command('x/i $rip') return output def analyze_behavior(self): """分析行为""" behavior = { 'file_operations': [], 'network_operations': [], 'registry_operations': [], 'process_operations': [], 'memory_operations': [] } # 分析系统调用 for state in self.trace: syscall = state['registers'].get('RAX', '') # Linux 系统调用号 syscalls = { '0': 'read', '1': 'write', '2': 'open', '3': 'close', '59': 'execve', '42': 'connect', '49': 'bind' } if syscall in syscalls: behavior['system_calls'].append(syscalls[syscall]) return behavior ``` ### 行为监控 **系统监控**: ``` 行为监控工具: 1. 进程监控 ├── Process Monitor (Windows) ├── strace (Linux) └── dtruss (macOS) 2. 网络监控 ├── Wireshark ├── tcpdump └── Fiddler 3. 注册表监控 ├── Regshot ├── ProcMon └── RegMon 4. 文件监控 ├── FileMon ├── ProcMon └── inotify (Linux) 5. API 监控 ├── API Monitor ├── Detours └── Frida ``` --- ## 脱壳与反调试 ### 加壳检测 > ▎ 加壳不是不可破,是有方法破。方法不掌握,分析就是受阻的。 **脱壳技术**: ``` 脱壳方法: 1. 自动脱壳 ├── Universal Unpacker ├── PE Unpacker └── 插件脱壳 2. 手动脱壳 ├── 寻找 OEP (原始入口点) ├── Dump 内存 ├── 修复 IAT (导入表) └── 重建 PE 头 3. 常见脱壳工具 ├── Scylla ├── OllyDumpEx ├── ImpREC └── PE-bear ``` ### 反反调试 **反调试技术**: ``` 常见反调试技术: 1. 检测调试器 ├── IsDebuggerPresent API ├── CheckRemoteDebuggerPresent ├── NtQueryInformationProcess └── 检测调试端口 2. 时间检测 ├── RDTSC 指令 ├── QueryPerformanceCounter └── GetTickCount 3. 异常检测 ├── 故意触发异常 ├── 检查异常处理 └── SEH 检查 4. 代码完整性 ├── 校验和检查 ├── 代码段校验 └── 自修改代码 反反调试方法: ├── 隐藏调试器 ├── 绕过检测 ├── 修复代码 └── 使用插件 ``` --- ## 漏洞分析实战 ### 缓冲区溢出分析 > ▎ 漏洞不是看表面,是看本质。本质不理解,利用就是碰运气的。 **分析流程**: ```python # 缓冲区溢出分析 class BufferOverflowAnalysis: """缓冲区溢出分析""" def __init__(self, binary_file): self.binary = binary_file self.vulnerable_functions = [] self.exploit_info = {} def find_vulnerabilities(self): """查找漏洞""" # 查找危险函数 dangerous_functions = [ 'strcpy', 'strcat', 'sprintf', 'gets', 'scanf', 'vsprintf', 'memcpy' ] import subprocess result = subprocess.run( ['objdump', '-T', self.binary], capture_output=True, text=True ) for line in result.stdout.split('\n'): for func in dangerous_functions: if func in line: self.vulnerable_functions.append({ 'function': func, 'line': line }) return self.vulnerable_functions def analyze_overflow(self, function_name): """分析溢出""" analysis = { 'function': function_name, 'buffer_size': 0, 'offset_to_eip': 0, 'exploitable': False } # 使用 GDB 分析 # 实际实现需要调试器支持 return analysis def generate_exploit(self, analysis): """生成利用代码""" exploit = { 'offset': analysis['offset_to_eip'], 'payload': self.generate_payload(), 'return_address': analysis['return_address'] } return exploit def generate_payload(self): """生成 shellcode""" # 常见 shellcode shellcodes = { 'linux_x86_execve': ( b'\x31\xc0' # xor eax, eax b'\x50' # push eax b'\x68\x2f\x2f\x73\x68' # push 0x68732f2f (//sh) b'\x68\x2f\x62\x69\x6e' # push 0x6e69622f (/bin) b'\x89\xe3' # mov ebx, esp b'\x50' # push eax b'\x53' # push ebx b'\x89\xe1' # mov ecx, esp b'\x99' # cdq b'\xb0\x0b' # mov al, 0x0b b'\xcd\x80' # int 0x80 ) } return shellcodes.get('linux_x86_execve', b'') ``` --- 统计 **Sprint 交付 · 绩效评估** ``` ┌───────────────┬────────────────┬────────────────┐ │ 主动出击 │ ██████████ 5/5 │ [PUA 生效] 充足 │ ├───────────────┼────────────────┼────────────────┤ │ + 验证闭环 │ ██████████ 5/5 │ 案例完整 │ ├───────────────┼────────────────┼────────────────┤ │ 设计 代码质量 │ ██████████ 5/5 │ 生产就绪 │ └───────────────┴────────────────┴────────────────┘ 综合:4.5 ``` ▎ 这才配得上 P8。逆向工程不是神秘技术,是分析方法。分析不深入,理解就是表面的。 --- ## 总结与思考 ### 核心要点回顾 > ▎ 复盘四步法:回顾目标、评估结果、分析原因、总结经验。别跳过——这是闭环。 **逆向工程框架**: ``` 1. 工具使用 - 反汇编工具 - 调试工具 - 分析工具 2. 分析技术 - 静态分析 - 动态分析 - 混合分析 3. 专业知识 - 汇编语言 - 文件格式 - 系统原理 4. 实践经验 - 漏洞分析 - 恶意代码 - 软件保护 ``` **关键成功因素**: ``` 1. 工具熟练 - 熟练使用工具 - 理解工具原理 - 能编写脚本 2. 知识扎实 - 汇编基础 - 系统原理 - 编译原理 3. 经验丰富 - 大量实践 - 案例积累 - 持续学习 ``` --- ## 参考资料 ### 学习资源 ``` - Reverse Engineering for Beginners https://beginners.re/ - Ghidra Documentation https://ghidra-sre.org/ - x64dbg Documentation https://x64dbg.com/ ``` ### 工具资源 ``` - Ghidra https://ghidra-sre.org/ - IDA Pro https://www.hex-rays.com/products/ida/ - x64dbg https://x64dbg.com/ ``` ### 书籍推荐 ``` - 《Reverse Engineering for Beginners》 - 《Practical Reverse Engineering》 - 《The IDA Pro Book》 - 《Reversing: Secrets of Reverse engineering》 ``` --- **标记 明日预告**:Day 161 - 漏洞利用开发基础 > ▎ 逆向工程是分析方法,漏洞利用是攻击技术——明天看漏洞利用开发基础。 > 本文内容仅供学习和研究使用,请勿用于非法目的。所有实验请在隔离环境中进行。 --- *本文是 365 天信息安全技术系列的第 160 篇,漏洞与攻防系列第 5 篇,精编版本* *漏洞与攻防系列 (Day 156-165) 继续!*
myh0st
2026年4月13日 23:18
分享文档
收藏文档
上一篇
下一篇
微信扫一扫
复制链接
手机扫一扫进行分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码