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

相关文章

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1

Maven 配置中的 <mirror>绕过 HTTP 阻断机制的方法

《Maven配置中的<mirror>绕过HTTP阻断机制的方法》:本文主要介绍Maven配置中的<mirror>绕过HTTP阻断机制的方法,本文给大家分享问题原因及解决方案,感兴趣的朋友一... 目录一、问题场景:升级 Maven 后构建失败二、解决方案:通过 <mirror> 配置覆盖默认行为1. 配置示

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

Mybatis Plus Join使用方法示例详解

《MybatisPlusJoin使用方法示例详解》:本文主要介绍MybatisPlusJoin使用方法示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录1、pom文件2、yaml配置文件3、分页插件4、示例代码:5、测试代码6、和PageHelper结合6

Java中实现线程的创建和启动的方法

《Java中实现线程的创建和启动的方法》在Java中,实现线程的创建和启动是两个不同但紧密相关的概念,理解为什么要启动线程(调用start()方法)而非直接调用run()方法,是掌握多线程编程的关键,... 目录1. 线程的生命周期2. start() vs run() 的本质区别3. 为什么必须通过 st

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据