Android破签:密钥native方法里了?不会C也看不懂IDA?用这个工具吧~

2024-09-02 15:12

本文主要是介绍Android破签:密钥native方法里了?不会C也看不懂IDA?用这个工具吧~,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

吉祥知识星球icon-default.png?t=N7T8http://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247485367&idx=1&sn=837891059c360ad60db7e9ac980a3321&chksm=c0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330&scene=21#wechat_redirect

《网安面试指南》icon-default.png?t=N7T8http://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247484339&idx=1&sn=356300f169de74e7a778b04bfbbbd0ab&chksm=c0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene=21#wechat_redirect

最近在挖某APP时,想要尝试修改请求参数,但是发现这个APP对所有的请求都做了签名校验。那没办法,只能反编译APK看一下签名是怎么实现的了。

反编译不细说,无非就是dex2jar / jadx这些工具

反编译之后,在源码中根据签名请求头名称“Sign”搜索来找到对应的代码,发现签名的方式比较常规,就是通过“appId + 参数 + 时间戳 + 随机数 + 请求体(如果有)”生成一个字符串,然后使用一个密钥对这个字符串进行HMACMD5,生成一个签名后,将它放在“Sign”请求头里面一起传给服务端进行验证。

但是问题来了,其它的参数都好获取,但是它的密钥是通过一个Java的native方法获取的,像这样:

public native String a();

这就难搞了,这意味着密钥是通过调用C来生成的,而C动态库的反编译可比Java难搞多了,而我对C也实在说不上很熟悉。

不管怎么样,先试一下吧,先通代码找到对应的动态库名称,然后使用IDA反编译看了下,20分钟之后,我决定放弃了。我只想拿个密钥,并不想分析它的汇编代码(也没有这个能力),何况我也不是一个Android逆向工程师。

0x02

既然静态的分析不可行,那就只能换一种方式了,使用动态的分析来解决。作为一个Java应用程序是肯定可以Hook的,因为它原生就提供了这个功能。

而Frida则是一个Android的Hook工具,它可以通过简单的几行代码,来Hook应用中的某些方法,那我只需要Hook这个本地方法的上层方法,打印一下密钥就行了,这不比苦哈哈的去分析汇编简单多了?

安装

本机命令行工具安装使用pip只需要一行命令: 

$ pip install frida-tools 

Android Server则在Github下载对应版本的Server,使用adb推到手机/模拟器上再启动就行了:

$ adb root
$ adb push frida-server /data/local/tmp/
$ adb shell "chmod 755 /data/local/tmp/frida-server"
$ adb shell "/data/local/tmp/frida-server &"

这里就不细说了,看官方文档就行了,很详细:
https://frida.re/docs/android/

脚本

安装好了之后,就要写个Hook脚本了,它支持多种语言来实现,简单起见,使用JS吧,大概就是这样:

def on_message(message, data):
if message['type']=='send':
print("[*] {0}".format(message['payload']))
else:
print(message)jscode ="""Java.perform(() => {// hook 脚本// 找到我们需要hook的类const secret = Java.use('com.xxxx.xxxx.Secret');//对secret类的a方法提供一个新的实现secret.a.implementation = function () {//执行原来的方法 a()const result = this.a();//打印密钥console.log('key is: ', result);//返回return result;};
});
"""# 找到对应android应用的进程,可以使用 frida-ps -U 查看
process = frida.get_usb_device().attach(1001)
# 创建JS脚本
script = process.create_script(jscode)
script.on('message', on_message)
print('[*] Running')
# 加载脚本
script.load()
sys.stdin.read()

执行

执行上面的脚本,如果没有报错的话,那就是成功了,我们再回到应用中,触发一次HTTP请求,看到密钥已经被打印出来了:

知道密钥和签名方式之后,那就简单了,使用mimtproxy写个代理来自动对请求进行重新签名就行了,现在就可以愉快的随便修改参数啦~

这篇关于Android破签:密钥native方法里了?不会C也看不懂IDA?用这个工具吧~的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1130311

相关文章

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

504 Gateway Timeout网关超时的根源及完美解决方法

《504GatewayTimeout网关超时的根源及完美解决方法》在日常开发和运维过程中,504GatewayTimeout错误是常见的网络问题之一,尤其是在使用反向代理(如Nginx)或... 目录引言为什么会出现 504 错误?1. 探索 504 Gateway Timeout 错误的根源 1.1 后端

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消