当前位置: 首页 > article >正文

实战复盘:我是如何用Frida Hook一个AES加密的SO库,并拿到Key和IV的

逆向工程实战Frida动态Hook解密AES加密SO库的关键技术解析在移动安全领域逆向分析加密算法一直是极具挑战性的技术课题。当遇到关键业务逻辑被编译到SO库中特别是采用AES这类标准加密算法时如何高效提取密钥参数成为安全研究人员关注的焦点。本文将分享一套经过实战验证的Frida动态Hook方案通过真实案例演示如何快速定位SO库中的加密函数、提取AES密钥和初始向量(IV)并验证解密结果的完整流程。1. 逆向分析前的准备工作逆向工程的成功往往取决于前期准备的充分程度。在开始Hook之前我们需要构建完整的分析环境并掌握目标应用的基本信息。基础环境配置清单已root的Android测试设备或模拟器推荐Android 9-11版本Frida 15.1.17及以上版本包含frida-server和客户端工具IDA Pro 7.6用于静态分析可选但推荐Python 3.8环境运行Frida脚本adb工具链用于设备调试提示测试设备建议使用x86架构的模拟器或真机可避免ARM指令集转换带来的兼容性问题。通过静态分析初步定位加密函数是高效Hook的前提。对于AES加密的SO库我们需要特别关注以下特征函数参数中包含16字节或32字节的固定长度数组出现标准加密算法常量如AES_SBOX调用OpenSSL或BoringSSL相关加密接口Java层通过JNI调用的native方法# 检查目标SO库的导出函数 nm -D target.so | grep -i aes\|crypt\|decrypt2. 关键函数定位技术当SO库采用动态注册方式时传统的导出函数搜索方法往往失效。此时需要从JNI_OnLoad入手追踪RegisterNatives的调用过程。动态注册函数定位步骤在IDA中定位JNI_OnLoad函数入口分析RegisterNatives调用参数提取JNINativeMethod结构体中的函数指针交叉引用定位到实际加密函数// Frida脚本片段追踪RegisterNatives调用 Interceptor.attach(Module.findExportByName(null, RegisterNatives), { onEnter: function(args) { console.log([*] RegisterNatives called for class: Java.vm.getEnv().getClassName(args[0])); var methods ptr(args[2]); var count args[3].toInt32(); for (var i 0; i count; i) { var name methods.add(i * 12).readPointer().readCString(); var sig methods.add(i * 12 4).readPointer().readCString(); var fnPtr methods.add(i * 12 8).readPointer(); console.log( Method: name sig at fnPtr); } } });对于复杂的SO库还可以采用以下增强定位策略字符串搜索关键常量如aes、cbc等交叉引用分析标准加密函数调用内存特征码匹配适用于混淆场景3. Frida Hook实战技巧成功定位目标函数后接下来需要设计精确的Hook脚本来捕获关键参数。针对AES-CBC模式我们需要重点关注Key和IV的传递方式。典型AES参数Hook方案function hook_aes_function() { var target_func Module.findExportByName(libcrypto.so, AES_cbc_encrypt); if (target_func) { Interceptor.attach(target_func, { onEnter: function(args) { console.log(\n[*] AES_cbc_encrypt called); // 参数1: 输入数据 var in_data ptr(args[0]); // 参数2: 输出缓冲区 var out_data ptr(args[1]); // 参数3: 数据长度 var length args[2].toInt32(); // 参数4: AES_KEY结构体 var aes_key args[3]; // 参数5: IV向量 var iv ptr(args[4]); // 参数6: 加密/解密标志 var enc args[5].toInt32(); // 提取实际Key数据 var key_data aes_key.add(8).readByteArray(16); console.log(AES Key:, hexdump(key_data)); console.log(IV:, hexdump(iv.readByteArray(16))); } }); } }在实际项目中可能会遇到各种复杂情况下面列出常见问题及解决方案问题类型现象表现解决方案参数混淆参数通过寄存器传递使用Frida的CPUContext访问寄存器结构体封装Key/IV被包装在自定义结构体中分析内存布局后计算偏移量动态生成每次调用Key不同跟踪密钥生成函数反调试检测Hook后进程崩溃先Hook反调试函数4. 数据验证与结果分析获取到Key和IV后需要验证其有效性。可以通过以下方法进行交叉验证验证方法一本地解密测试from Crypto.Cipher import AES from binascii import unhexlify key unhexlify(获取到的16字节Key) iv unhexlify(获取到的16字节IV) cipher AES.new(key, AES.MODE_CBC, iv) plaintext cipher.decrypt(加密数据) print(Decrypted:, plaintext)验证方法二实时拦截对比// 在Hook脚本中添加结果验证逻辑 onLeave: function(retval) { var decrypted ptr(retval).readByteArray(16); console.log(Decrypted result:, hexdump(decrypted)); // 与Java层返回结果对比 }在实际测试中可能会遇到填充模式不一致导致解密失败的情况。常见的问题包括PKCS7填充与ZeroPadding混淆输出结果包含多余填充字节编码格式不匹配Base64/Hex注意某些应用会故意在解密后修改结果需对比内存中的原始输出和Java层返回结果。5. 高级Hook技巧与优化基础Hook技术掌握后可以进一步优化脚本的稳定性和隐蔽性性能优化技巧使用NativeFunction直接调用目标函数实现条件过滤避免频繁打印采用多线程处理大量数据// 优化后的Hook示例 var aes_func new NativeFunction( Module.findExportByName(libcrypto.so, AES_cbc_encrypt), void, [pointer, pointer, int, pointer, pointer, int] ); Interceptor.replace(aes_func, new NativeCallback(function(in_, out, len, key, iv, enc) { if (len 16) { // 只处理特定长度 console.log(Key captured:, hexdump(key.add(8).readByteArray(16))); } return aes_func(in_, out, len, key, iv, enc); }, void, [pointer, pointer, int, pointer, pointer, int]));反检测策略随机化Hook时机伪装Frida进程名称使用inline hook替代导出表Hook动态修改内存保护属性6. 自动化Hook框架设计对于需要批量分析多个加密函数的场景可以设计自动化Hook框架class CryptoHookManager { constructor() { this.hooks []; this.patterns { aes: /aes|AES|rijndael/i, des: /des|DES/i, rsa: /rsa|RSA/i }; } setupHooks() { Module.enumerateExportsSync(libcrypto.so).forEach(exp { for (let algo in this.patterns) { if (this.patterns[algo].test(exp.name)) { this.hookExport(exp.name, algo); break; } } }); } hookExport(name, algo) { let func Module.findExportByName(libcrypto.so, name); if (func) { Interceptor.attach(func, { onEnter: function(args) { this.algo algo; console.log([${algo}] ${name} called); }, onLeave: function(retval) { console.log([${this.algo}] ${name} returned); } }); this.hooks.push({name, algo}); } } } let manager new CryptoHookManager(); manager.setupHooks();该框架可实现自动识别常见加密算法批量Hook相关函数分类记录调用信息支持动态添加新规则7. 安全防护建议从防御角度出发开发者可以采取以下措施增加逆向难度防护策略对比表防护技术实现难度防护效果性能影响代码混淆低中低动态加载中高中完整性校验中高低白盒加密高极高高多态代码极高极高中具体实现建议将Key分成多个片段动态组合使用JNI_OnLoad进行运行时校验实现自定义内存分配器保护敏感数据定期更新加密方案和密钥在最近的一次金融APP测试中通过组合使用函数粒度Hook和内存访问监控成功还原了被VMProtect保护的AES密钥。整个过程耗时约8小时其中大部分时间花费在分析自定义的内存访问模式上。最终发现密钥被拆分成三部分分别存储在不同线程的TLS区域中只有特定操作序列才会组合出完整密钥。

相关文章:

实战复盘:我是如何用Frida Hook一个AES加密的SO库,并拿到Key和IV的

逆向工程实战:Frida动态Hook解密AES加密SO库的关键技术解析 在移动安全领域,逆向分析加密算法一直是极具挑战性的技术课题。当遇到关键业务逻辑被编译到SO库中,特别是采用AES这类标准加密算法时,如何高效提取密钥参数成为安全研究…...

手把手教你排查STM32 SPI通信失败:从示波器看CLK信号到CubeMX代码审查

STM32 SPI通信故障深度排查:从硬件信号捕获到CubeMX配置陷阱 引言 当你在深夜调试一块新设计的STM32板卡,SPI外设无论如何都无法正常通信时,那种挫败感足以让任何嵌入式工程师抓狂。SPI作为嵌入式系统中最常用的串行通信协议之一,…...

如何在5分钟内免费拥有专属音乐播放器:开源酷狗客户端完整配置秘籍

如何在5分钟内免费拥有专属音乐播放器:开源酷狗客户端完整配置秘籍 【免费下载链接】MoeKoeMusic 一款开源简洁高颜值的酷狗第三方客户端 An open-source, concise, and aesthetically pleasing third-party client for KuGou that supports Windows / macOS / Linu…...

山东楼顶广告字技术白皮书:从选材到安装的完整实践指南

楼顶广告字的行业地位与价值在户外广告领域,山东楼顶广告字作为城市天际线的重要组成部分,不仅承担着商业宣传的功能,更成为区域经济发展的风向标。这类广告字通常安装在建筑物顶部,具有视野开阔、传播范围广的特点。随着城市建设…...

Excel跨表格查找神器:VLOOKUP+粘贴链接实现数据自动同步(附避坑指南)

Excel跨表格动态同步:VLOOKUP与粘贴链接的进阶组合技 每次手动复制粘贴不同表格的数据,不仅耗时费力,还容易出错。想象一下,当源数据更新时,所有关联表格能自动同步变化,这才是高效办公的真谛。今天要分享的…...

AI Agent行动规划算法:动态环境下的最优决策生成

AI Agent行动规划算法:动态环境下的最优决策生成 1. 引言 在人工智能技术飞速发展的今天,AI Agent(智能体)已经成为了连接理论与实践的关键桥梁。从自动驾驶汽车到智能客服机器人,从游戏AI到工业自动化控制,AI Agent正在以前所未有的方式改变着我们的生活和工作方式。然…...

Axure RP中文界面终极配置指南:3分钟实现专业汉化

Axure RP中文界面终极配置指南:3分钟实现专业汉化 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英…...

别再只盯着SENet了!手把手教你用PyTorch复现SKNet和CBAM(附完整代码)

深度学习注意力机制实战:从SKNet到CBAM的PyTorch实现精要 在计算机视觉领域,注意力机制已经成为提升模型性能的关键技术。不同于传统的卷积神经网络平等对待所有特征通道,注意力机制让模型学会"关注"最重要的信息。本文将带您深入…...

SQL盲注技术全解析:布尔盲注、时间盲注与DNSLog带外注入

前言 在之前的学习中,我们掌握了 SQL 注入的基本原理,包括联合查询注入和报错注入技术。这些攻击方式都有一个共同点:需要页面能够显示查询结果或通过报错信息泄露数据。但在实际环境中,Web 应用通常会采取多种防护措施&#xff…...

SQL注入攻击与防御实战:手把手教你挖漏洞

三、防御方案。1.参数化查询:用Prepared Statements,用户输入当数据处理。PHP用PDO,Java用PreparedStatement。2.输入验证:白名单过滤危险字符单引号、分号等。3.使用ORM框架:Laravel、Hibernate等内置防注入。4.最小权…...

Vue3怎么起步入门?

Vue.js 是一个渐进式 JavaScript 框架,主要用于构建用户界面。 刚开始学习 Vue,我们不推荐使用 vue-cli 命令行工具来创建项目,更简单的方式是直接在页面引入 vue.global.js 文件来测试学习。 Vue3 中的应用是通过使用 createApp 函数来创建…...

从集合到点云:深入浅出图解Deep Sets的置换不变性到底在说什么

从集合到点云:深入浅出图解Deep Sets的置换不变性到底在说什么 想象一下,你面前有一堆散落的乐高积木,无论你怎么打乱它们的顺序,最终拼出来的城堡总是一样的。这就是置换不变性(Permutation Invariance)的…...

终极指南:3步解锁百度网盘SVIP高速下载功能(macOS版)

终极指南:3步解锁百度网盘SVIP高速下载功能(macOS版) 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘…...

【Python基础】零基础入门到实战,这一篇就够了!(附详细代码)

前言 大家好,我是jifeng,今天给大家带来一篇全网最贴心的Python保姆级入门教程。 在这个AI与大数据爆发的时代,“人生苦短,我用Python” 早已不仅仅是一句口号。无论是Web开发、数据分析、人工智能还是日常办公自动化&#xff0…...

SiameseUIE模型在网络安全领域的应用:威胁情报抽取

SiameseUIE模型在网络安全领域的应用:威胁情报抽取 网络安全分析师每天都要面对海量的威胁情报报告、安全日志和漏洞公告。这些文本数据里藏着攻击者的IP地址、恶意域名、攻击手法、漏洞编号等关键信息。传统做法是人工逐篇阅读、标记、整理,不仅效率低…...

终极指南:如何用KMS_VL_ALL_AIO一键永久激活Windows和Office系统

终极指南:如何用KMS_VL_ALL_AIO一键永久激活Windows和Office系统 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统频繁弹出激活提示而烦恼吗?Office文档…...

SOCD Cleaner:终极键盘优化工具 - 5个关键优势提升游戏操作精度

SOCD Cleaner:终极键盘优化工具 - 5个关键优势提升游戏操作精度 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 在竞技游戏的微秒级对决中,你是否曾因同时按下W和S键导致角色卡顿&#x…...

解锁小米EG系列机型的注意事项

springboot自动配置 自动配置了大量组件,配置信息可以在application.properties文件中修改。 当添加了特定的Starter POM后,springboot会根据类路径上的jar包来自动配置bean(比如:springboot发现类路径上的MyBatis相关类&#xff…...

如何在Windows上获得苹果触控板的原生级体验:mac-precision-touchpad完整指南

如何在Windows上获得苹果触控板的原生级体验:mac-precision-touchpad完整指南 【免费下载链接】mac-precision-touchpad Windows Precision Touchpad Driver Implementation for Apple MacBook / Magic Trackpad 项目地址: https://gitcode.com/gh_mirrors/ma/mac…...

H5GG:零门槛定制iOS应用,JavaScript引擎开启全新可能

H5GG:零门槛定制iOS应用,JavaScript引擎开启全新可能 【免费下载链接】H5GG an iOS Mod Engine with JavaScript APIs & Html5 UI 项目地址: https://gitcode.com/gh_mirrors/h5/H5GG 在iOS生态系统中,定制化一直是技术爱好者的追…...

YOLO系列算法改进 | C2PSA改进篇 | 融合UPT不确定性先验Transformer模块 | 突破模糊感知瓶颈,动态聚焦困难样本 | CVPR 2026

0. 前言 本文介绍UPT(不确定性先验Transformer模块),并将其集成到ultralytics最新发布的YOLO26目标检测算法中,构建C2PSA_UPT创新模块。UPT是一种基于不确定性感知的注意力机制,源自UCMNet图像复原架构,旨在通过估计特征图的空间不确定性来引导上下文特征的动态检索与聚…...

从VGA到8K:一文读懂HDMI协议进化史与关键版本差异(1.4/2.0/2.1对比)

从VGA到8K:HDMI协议进化史与关键版本差异全解析 2002年12月,当索尼、松下、东芝等七家电子巨头联合发布HDMI 1.0标准时,很少有人能预料到这个接口会在未来二十年彻底改变视听产业的格局。如今,从家庭影院到电竞显示器,…...

Pandas 复制 DataFrame的方法总结

Pandas 复制 DataFrame的方法总结 1.pandas.DataFrame.copy() 方法语法 DataFrame.copy(deepTrue) 它返回 DataFrame 的副本。deep 默认为 True,这意味着在副本中所作的任何更改将不会反映在原始 DataFrame 中。但是,如果我们设置 deepFalse&#xff…...

数据库分库分表方案设计

数据库分库分表方案设计:应对海量数据挑战 随着互联网业务规模不断扩大,传统单库单表的数据库架构逐渐暴露出性能瓶颈。当数据量达到千万甚至亿级时,查询延迟、写入拥堵等问题频发,分库分表成为解决这一难题的核心方案。通过将数…...

3分钟搞定专业照片批量水印:告别繁琐手动操作

3分钟搞定专业照片批量水印:告别繁琐手动操作 【免费下载链接】semi-utils 一个批量添加相机机型和拍摄参数的工具,后续「可能」添加其他功能。 项目地址: https://gitcode.com/gh_mirrors/se/semi-utils 还在为每张照片手动添加水印而烦恼吗&…...

为何要使用虚拟计算机(v0.1.0)

一、术语 【虚拟计算机】 虚拟计算机(Virtual Machine, VM),简称虚拟机,是通过软件模拟出来的、具有完整硬件系统功能的、运行在一个完全隔离环境中的计算机系统。 你可以把它理解为“电脑里的另一台电脑”。其概念图见图1。[1] …...

从‘浪费生命’到‘轻松驾驭’:我的NRF24L01/SI24L01调试心路与替代方案盘点

从‘浪费生命’到‘轻松驾驭’:NRF24L01/SI24L01调试心路与替代方案盘点 第一次点亮NRF24L01模块时,我天真地以为无线通信的大门就此敞开。直到连续三天的调试中,这个火柴盒大小的模块让我经历了从期待到崩溃的全过程——明明代码和接线都&qu…...

长沙金海中学答题:中天电子实现精准调控

课堂困境与答题需求长沙金海中学在传统教学模式中,面临着诸多答题相关的痛点。每次进行50题的答题测试,教师需要花费30分钟以上的时间进行人工批改,这不仅耗时耗力,还容易出现批改错误。同时,课堂互动参与率不足30%&am…...

3步解锁加密音频:实现全平台自由播放的终极方案

3步解锁加密音频:实现全平台自由播放的终极方案 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾遇到过这样的困扰?在网易云音乐下载的歌曲只能在特定应用播放,无法在车载音响、智能音箱或…...

告别盲目干扰!用VH6501做车载网络测试,你必须分清Rx和Tx的触发逻辑

车载网络测试进阶:VH6501中Rx与Tx干扰逻辑的深度解析 在车载电子系统日益复杂的今天,CAN-FD总线承载着越来越多的关键数据交换。作为测试工程师,我们常常需要模拟各种异常场景来验证系统的鲁棒性。VH6501作为专业的CAN干扰接口,其…...