首页
课程
问答
CTF
社区
招聘
峰会
发现
排行榜
知识库
工具下载
看雪20年
看雪商城
证书查询
登录
注册
首页
社区
课程
招聘
发现
问答
CTF
排行榜
知识库
工具下载
峰会
看雪商城
证书查询
社区
Android安全
发新帖
2
1
[原创]【银行逆向百例】16Android逆向之算法助手 frida绕过环境检测分析加密算法
发表于: 2026-5-22 14:59
2007
[原创]【银行逆向百例】16Android逆向之算法助手 frida绕过环境检测分析加密算法
差不多的张三
2026-5-22 14:59
2007
“ 你打算怎么活,今后,在我死之后,你打算过怎样的生活,托尔芬。——《冰海战记》S1E24 ” # 01环境版本 环境: 电脑,Windows 11 专业版 23H2 ``` https://github.com/JiaoSuInfoSec/JiaoSuInfoSec_T00ls_Win11 ``` 软件: Mumu模拟器,5.3.4 ``` https://mumu.163.com/download/ ``` Kitsune Mask,27.2 ``` https://github.com/1q23lyc45/KitsuneMagisk/releases ``` 算法助手,1.0.9 ``` https://www.123865.com/s/7G8aTd-bKH4H ``` LSPosed,1.9.2 ``` https://github.com/LSPosed/LSPosed/releases/tag/v1.9.2 ``` brook,20230606.5 ``` https://github.com/txthinking/brook ``` frida-server,16.1.8 ``` https://github.com/frida/frida/releases/tag/16.1.8 ``` burpsuite,2025.1 ``` https://portswigger.net/burp/releases ``` Charles,5.0.2 ``` https://www.charlesproxy.com/download/ ``` # 02操作步骤 1、弹窗提示设备环境风险,点击确定自动退出APP  2、可写系统盘 ``` https://mumu.163.com/help/20240202/35044_1136675.html ```  3、安装KitsuneMagisk ``` https://github.com/1q23lyc45/KitsuneMagisk/releases ```  4、安装算法助手 ``` https://www.123865.com/s/7G8aTd-bKH4H ```  5、下载LSPosed-v1.9.2-7024-zygisk-release ``` https://github.com/LSPosed/LSPosed/releases/tag/v1.9.2 ```  6、允许root权限  7、安装  8、直接安装  9、开启Zygisk  10、关闭模拟器  11、模块安装LSPosed-v1.9.2-7024-zygisk-release  12、关闭模拟器  13、下拉进入LSPosed  14、模块启用算法助手  15、启用模块后关闭模拟器  16、算法助手勾选目标APP  17、弹窗定位,启动APP  18、查看日志  19、复制调用堆栈  20、分析日志,最后调用了AlertMessageDialog.showIosAlert  21、启动frida-server ``` https://github.com/frida/frida/releases/tag/16.1.8 ```  ``` adb push .\frida-server-16.1.8-android-x86_64 /data/local/tmp adb shell su cd /data/local/tmp chmod +x frida-server-16.1.8-android-x86_64 ./frida-server-16.1.8-android-x86_64 ``` 22、获取包名 ``` frida-ps -Uai ```  23、hook弹窗通用方法Dialog.show,如果调用堆栈包含AlertMessageDialog关键字就返回空,成功绕过弹窗  ``` Java.perform(function() { var Dialog = Java.use("android.app.Dialog"); Dialog.show.implementation = function() { if (Java.use("java.lang.Thread").currentThread().getStackTrace().toString().indexOf("AlertMessageDialog") !== -1) { console.log("[+] 拦截环境检测弹窗"); return; } return this.show(); }; }); ``` 24、网络环境勾选  25、抓包请求加密 ``` https://xz.aliyun.com/news/11263 ```  26、算法助手勾选算法分析  27、复制调用堆栈日志  28、分析调用堆栈 用户名,调用 RSAUtils.IdNoEncrypt() → 内部调用 RSAUtils.encrypt() 进行 RSA 加密 ``` com.xxx.utils.keyboardutil.RSAUtils.encrypt com.xxx.utils.keyboardutil.RSAUtils.IdNoEncrypt ``` 密码,调用 RSAUtils.PwdRandomRsaEncrypt() → 内部先用 AESUtils.encrypt() 加密密码,再用 RSA 加密 AES 密钥 ``` com.xxx.utils.keyboardutil.AESUtils.encrypt com.xxx.utils.keyboardutil.AESUtils.encrypt com.xxx.utils.keyboardutil.RSAUtils.PwdRandomRsaEncrypt ```  29、hook.js  ``` Java.perform(function() { console.log("[*] Frida Hook已启动 - 延迟Hook策略"); // 字节转Hex function bytesToHex(bytes) { if (!bytes) return "null"; var result = ""; for (var i = 0; i < bytes.length; i++) { result += ("0" + (bytes[i] & 0xFF).toString(16)).slice(-2); } return result; } // 打印调用堆栈 function printStackTrace() { console.log("[调用堆栈]"); var traces = Java.use("java.lang.Thread").currentThread().getStackTrace(); for (var i = 0; i < traces.length && i < 10; i++) { var line = traces[i].toString(); if (line.indexOf("cn.com.xxx") !== -1 || line.indexOf("xxx") !== -1) { console.log(" at " + line); } } } // ==================== 弹窗拦截 ==================== try { var Dialog = Java.use("android.app.Dialog"); Dialog.show.implementation = function() { try { if (Java.use("java.lang.Thread").currentThread().getStackTrace().toString().indexOf("AlertMessageDialog") !== -1) { console.log("[+] 拦截环境检测弹窗"); return; } } catch(e) {} return this.show(); }; console.log("[+] 弹窗拦截已启用"); } catch(e) {} // ==================== 延迟Hook目标类 ==================== var rsaHooked = false; var aesHooked = false; var hookAttempts = 0; var maxAttempts = 30; function tryHookTargetClasses() { hookAttempts++; // 尝试Hook RSAUtils if (!rsaHooked) { try { var RSAUtils = Java.use("com.xxx.utils.keyboardutil.RSAUtils"); console.log("[+] RSAUtils 类已加载,开始Hook..."); // Hook encrypt (String, Key) try { RSAUtils.encrypt.overload('java.lang.String', 'java.security.Key').implementation = function(data, key) { console.log("\n================ RSAUtils.encrypt ================"); console.log("[输入] " + data); var result = this.encrypt(data, key); console.log("[输出Hex] " + bytesToHex(result)); printStackTrace(); console.log("=================================================="); return result; }; } catch(e) {} // Hook IdNoEncrypt try { RSAUtils.IdNoEncrypt.implementation = function(idNo) { console.log("\n================ RSAUtils.IdNoEncrypt ================"); console.log("[输入数据] " + idNo); var result = this.IdNoEncrypt(idNo); console.log("[加密结果] " + result); printStackTrace(); console.log("======================================================"); return result; }; } catch(e) {} // Hook PwdRandomRsaEncrypt try { RSAUtils.PwdRandomRsaEncrypt.implementation = function(pwd, randomKey) { console.log("\n================ RSAUtils.PwdRandomRsaEncrypt ================"); console.log("[AES随机密钥] " + pwd); console.log("[明文密码] " + randomKey); var result = this.PwdRandomRsaEncrypt(pwd, randomKey); console.log("[加密结果] " + result); printStackTrace(); console.log("=============================================================="); return result; }; } catch(e) {} rsaHooked = true; console.log("[+] RSAUtils Hook完成"); } catch(e) {} } // 尝试Hook AESUtils if (!aesHooked) { try { var AESUtils = Java.use("com.xxx.utils.keyboardutil.AESUtils"); console.log("[+] AESUtils 类已加载,开始Hook..."); try { AESUtils.encrypt.overload('java.lang.String', 'java.lang.String').implementation = function(data, key) { console.log("\n================ AESUtils.encrypt ================"); console.log("[随机密钥] " + data); console.log("[用户输入] " + key); var result = this.encrypt(data, key); console.log("[AES密文] " + result); printStackTrace(); console.log("=================================================="); return result; }; } catch(e) {} aesHooked = true; console.log("[+] AESUtils Hook完成"); } catch(e) {} } // 如果还有类未Hook成功,继续尝试 if ((!rsaHooked || !aesHooked) && hookAttempts < maxAttempts) { setTimeout(tryHookTargetClasses, 300); } else if (rsaHooked && aesHooked) { console.log("[*] 所有目标类Hook完成"); } } // 开始尝试Hook setTimeout(tryHookTargetClasses, 1000); console.log("[*] Hook设置完成,请操作APP进行登录"); }); ``` 30、输出日志与数据包一致 
冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。
最后于
2026-5-22 22:23 被差不多的张三编辑 ,原因:
#逆向分析
收藏
・
2
点赞
・
1
打赏
分享
分享到微信
分享到QQ
分享到微博
赞赏记录
参与人
雪币
留言
时间
mb_reyfinlv
非常支持你的观点!
2026-8-18 10:14
查看更多
赞赏
×
1 雪花
5 雪花
10 雪花
20 雪花
50 雪花
80 雪花
100 雪花
150 雪花
200 雪花
支付方式:
微信支付
赞赏留言:
快捷留言
感谢分享~
精品文章~
原创内容~
精彩转帖~
助人为乐~
感谢分享~
最新回复
(
1
)
YoungBai
雪 币:
1293
活跃值:
(1640)
能力值:
( LV2,RANK:10 )
在线值:
发帖
0
回帖
144
粉丝
2
关注
私信
YoungBai
2
楼
学习了.感谢分享.
2026-5-24 09:58
0
游客
登录
|
注册
方可回帖
回帖
表情
雪币赚取及消费
高级回复
返回
差不多的张三
19
发帖
13
回帖
0
RANK
关注
私信
他的文章
[原创]【银行逆向百例】18Android逆向之libDexHelper.so梆梆加固壳解密 frida-dexdump脱壳
5271
[原创]【代码审计】客户端代码执行之WebView JavaScript桥接劫持token账号接管
1889
[原创]【银行逆向百例】17Android逆向之libDexHelper梆梆加固frida检测绕过
4489
[原创]【银行逆向百例】16Android逆向之算法助手 frida绕过环境检测分析加密算法
2007
[原创]【银行逆向百例】15小程序逆向之支付宝提取data文件为tar格式
2435
关于我们
联系我们
企业服务
看雪公众号
专注于PC、移动、智能设备安全研究及逆向工程的开发者社区
看原图
赞赏
×
雪币:
+
留言:
快捷留言
为你点赞!
返回
顶部