[App逆向]环境搭建下篇 — — 逆向源码+hook实战
[App逆向]环境搭建下篇——逆向源码hook上篇[App逆向]环境搭建上篇——抓取apk https包免责声明本教程仅供技术学习和安全研究使用禁止用于任何非法用途。逆向他人 App 前请获得授权。环境搭建1. 安装jadx——逆向代码1.安装jadx方式一mac用户可直接通过brew安装brewinstalljadx# jadx --version1.5.1方式二如果不想通过brew安装的也可以直接下载zip包访问Githubhttps://github.com/skylot/jadx/releases/tag/v1.5.5下载jadx zip包2. 解析apk源文件# 1. 启动jadx可视化页面## mac/linux用户jadx-gui## Windows用户双击即可启动jadx-gui.bat# 2. 将需要反编译的apk拖入jadx可视化页面即可2. 安装Frida——HookHook 是一种在程序运行时动态修改或拦截函数调用、参数或返回值的技术。在 Android 安全研究、逆向分析以及自动化测试中Hook 技术扮演着至关重要的角色。目前 Android 生态中主流的 Hook 框架主要有两种而本文将重点介绍逆向中最常用的 Frida 框架。Frida 采用 C/S 架构客户端/服务端安装分为 PC 端客户端和手机端服务端两部分。1.安装 PC 端客户端# 确保已安装 Python 环境使用 pip 安装# 推荐指定版本安装PC 端和手机端版本保持一致以保证稳定性pipinstallfrida17.6.2 frida-tools# 安装最新版# pip install frida frida-tools2. 安装手机端服务端第一步确认设备 CPU 架构adb shell getprop ro.product.cpu.abi第二步下载对应版本的 frida-server前往 Frida Releases 下载。 下载原则版本号与 PC 端一致架构与手机匹配。 例如手机为 arm64-v8aPC 端 Frida 版本为 17.6.2则下载 frida-server-17.6.2-android-arm64.xz。下载后直接双击解压即可。第三步部署到手机# 1. 推送到手机临时目录adb push frida-server-17.6.2-android-arm64 /data/local/tmp/# 2. 进入手机 Shell 并提权adb shellsu# 3. 赋予执行权限并后台运行chmodx /data/local/tmp/frida-server-17.6.2-android-arm64 /data/local/tmp/frida-server-17.6.2-android-arm64## 如果要退出Frida hook执行exit命令即可 建议重命名 frida-server 文件如 fs既方便输入也能规避部分 App 对 “frida-server” 文件名的字符串检测。第四步检查是否能hook# 本地mac执行下面命令列出已连接的设备frida-ls-devices# 查看当前手机上活跃的进程frida-ps-U比如我就hook下我的设置应用首先打开设置应用然后编写js代码main.jsJava.perform(function(){console.log([*] Hook script loaded successfully!);// Hook android.util.Log 的 d() 方法调试日志输出函数varLogJava.use(android.util.Log);Log.d.overload(java.lang.String,java.lang.String).implementationfunction(tag,msg){console.log([] Log.d called);console.log( Tag: tag);console.log( Message: msg);// 调用原始方法保持原有日志输出returnthis.d(tag,msg);};});# 终端执行下面命令进行hook。然后点击任意子模块比如【通知模块】等frida-U-n设置-lmain.js出现有日志打印表示hook没问题。拓展Frida Hook 有两种方式分别是 附加模式(Attach) 和 孵化模式(Spawn)# 1. 附加模式 (Attach) – 进程已运行时#Frida 连接到已经在运行的进程适合对已经打开的应用进行 Hook或者需要动态注入脚本的场景。例如frida-U-n设置-lmain.js# 2. 孵化模式 (Spawn) – 应用未启动时#Frida 先启动应用孵化进程然后立即注入脚本适合需要 Hook 应用启动过程中的初始化代码或 onCreate 等早期方法。#-f 后跟包名表示启动该应用。#--no-pause 让应用自动继续运行否则需要手动调用 resume()。frida-U-fcom.android.settings-lmain.js --no-pause特性Attach (附加)Spawn (孵化)目标状态进程已存在进程未启动能否 Hook 启动过程❌ 可能错过早期方法✅ 可 Hook 从 onCreate 开始的所有代码命令标志-n 或 -p-f常见用途动态注入、调试已运行应用分析应用启动流程、绕过反调试实战案例App逆向常规思路从抓包找到可疑参数 → 静态分析定位代码 → 动态 Hook 验证猜想 → 编写脚本模拟请求。术语核心任务典型应用场景工具示例抓包反编译静态分析通过抓包获取接口参数再反编译APK找到对应的加密/签名代码逻辑分析通信协议、查找硬编码密钥、理解功能实现Charles Jadx抓包逆向动态分析在抓包基础上通过Hook技术动态监控或修改加密算法、签名参数破解加密参数、绕过签名校验、模拟请求、自动化脚本Charles Frida下面我们将以“尿大夫”App登录接口为例我们先用抓包反编译定位到 sign 字段的生成算法静态分析再用抓包逆向编写Frida脚本动态Hook该算法验证其输入输出甚至篡改签名动态分析。1. 抓包反编译尿大夫.apk反编译破解登录接口APK下载地址https://apkpure.com/niao-da-fu/com.uulife.medical.activity/download配置好Charles抓包然后手机打开apk输入用户名密码点击登录抓取对应接口观察请求体我们会发现主要是sign和devisetoken字段比较特殊那么我们就需要挨个尝试看哪些是需要我们逆向的尝试Charles compose移除部分字段观察哪些字段是必须的首先移除devisetoken字段我们会发现移除devisetoken字段后请求依然没问题按照上面流程我们尝试移除sign字段会发现移除之后状态码不一样了出现了报错那么说明sign字段是需要我们逆向的。其他字段都是除了时间戳都是固定的大家可以多请求几次观察6. 打开jadx将apk包拖入jad中。进行逆向分析主要是这个sign字段所以我们全局搜索这个sign这个sign字符是固定的我们推测目标是一个map且通过put方式设置到请求参数中双击进入该代码文件我们发现sign是通过SafeUtils.getSign方法获取到的那么我们选中getSign方法鼠标右键点击跳转到方法声明处查看底层实现逻辑于是我们就找到了底层加密逻辑接着直接复制给AI让它给我们一个python版本最后完善我们的python代码实现登录逻辑importrequestsimporttimeimporthashlibfromurllib.parseimportparse_qsl channelandroiddefgetSign(j):try:str1niaodaifustr(j)md5_1hashlib.md5(str1.encode(utf-8)).hexdigest()part1md5_1[12:30]str2channelstr(j)md5_2hashlib.md5(str2.encode(utf-8)).hexdigest()part2md5_2[12:26]returnpart1part2exceptException:returndefquery_to_dict(query_string):returndict(parse_qsl(query_string))phoneinput(请输入手机号/邮箱)passwordinput(请输入密码)signgetSign(int(time.time()))print(----,sign)qpassword%smobile%schannelandroidsign%stime%smechanism0platform1%(password,phone,sign,int(time.time()))# 实现query转字典dataquery_to_dict(q)resrequests.post(https://api.niaodaifu.cn/v4/site/loginnew,jsondata,verifyFalse)print(res.json())运行代码观察效果成功逆向2. 抓包逆向(动态Hook)目标使用 Frida 动态 Hook getSign 方法验证其输入输出甚至篡改签名。基于上面的反编译我们知道加密是通过SafeUtils.getSign方法实现的。于是可编写 Frida Hook 脚本 hook_sign.jsJava.perform(function(){// 定位 SafeUtils 类varSafeUtilsJava.use(com.uulife.medical.utils.SafeUtils);// Hook getSign 方法注意参数类型为 longSafeUtils.getSign.implementationfunction(timestamp){console.log([*] getSign 被调用);console.log( 参数 timestamp (long): timestamp);// 调用原始方法获取原始签名varoriginalSignthis.getSign(timestamp);console.log( 原始签名: originalSign);// 可选篡改签名例如在后面加 hackedvarfakeSignoriginalSignhacked;console.log( 篡改签名: fakeSign);// 返回篡改后的签名演示修改返回值returnfakeSign;// 若想保持原逻辑则返回 originalSign};console.log([*] Hook 安装成功等待登录操作...);});检查Frida-server是否运行若没运行则启动运行# 检查是否Android是否运行adb shellsups|grepfrida# 若未运行则运行Frida-server/data/local/tmp/frida-server-17.6.2-android-arm64检测到Android未运行Frida-server则执行命令运行。在手机上打开尿大夫 App然后运行Hook# 通过应用名定位frida-U-n尿大夫-lhook_sign.js# 或者通过包名进行hookfrida-U-ncom.uulife.medical.activity-lhook_sign.js输入尿大夫App账号密码点击登录观察 Frida 控制台输出[*]getSign 被调用 参数 timestamp(long):1775641135原始签名: d9828d465a091f9bba31f28710172db3 篡改签名: d9828d465a091f9bba31f28710172db3hacked由于我们篡改了签名服务器会返回签名错误如 401证明 Hook 生效且成功修改了参数。基于此我们可以确认apk登录后台确实调用了com.uulife.medical.utils.SafeUtils.getSign方法。当然验证猜想只是Hook最基础的功能。Hook 的真正威力在于动态篡改——可以让 App 做任何你想让它做的事比如绕过支付校验修改游戏金币禁用广告自动回复聊天消息抓取加密数据当然这些行为都需要遵循相关法律法规。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2499999.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!