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

相关文章

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

浅谈主机加固,六种有效的主机加固方法

在数字化时代,数据的价值不言而喻,但随之而来的安全威胁也日益严峻。从勒索病毒到内部泄露,企业的数据安全面临着前所未有的挑战。为了应对这些挑战,一种全新的主机加固解决方案应运而生。 MCK主机加固解决方案,采用先进的安全容器中间件技术,构建起一套内核级的纵深立体防护体系。这一体系突破了传统安全防护的局限,即使在管理员权限被恶意利用的情况下,也能确保服务器的安全稳定运行。 普适主机加固措施:

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

webm怎么转换成mp4?这几种方法超多人在用!

webm怎么转换成mp4?WebM作为一种新兴的视频编码格式,近年来逐渐进入大众视野,其背后承载着诸多优势,但同时也伴随着不容忽视的局限性,首要挑战在于其兼容性边界,尽管WebM已广泛适应于众多网站与软件平台,但在特定应用环境或老旧设备上,其兼容难题依旧凸显,为用户体验带来不便,再者,WebM格式的非普适性也体现在编辑流程上,由于它并非行业内的通用标准,编辑过程中可能会遭遇格式不兼容的障碍,导致操

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念