Frida通过APK的签名校验

本文详细介绍了Android APP的启动顺序,从点击启动到MainActivity的创建,并重点讲解了签名校验的过程。通过使用jadx反编译和Frida动态hook,寻找并定位了签名校验的关键代码,最终实现绕过签名校验。实战中展示了hook Signature类的hashCode()和toByteArray()方法,以及如何利用堆栈跟踪找到关键代码位置并hook其返回值为true,以达到免签的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

APP简单启动顺序

  1. 点击APP启动
  2. 执行Application(attach, onCreate方法)
  3. 执行开屏界面Activity
  4. 执行Main Activity(onCreate方法)
  5. 启动成功

简单签名校验

签名校验一般在APP启动阶段

几个安卓中常见的类:
Context类:android.content.Context保存应用环境信息
PackageManager类: 获取安卓系统信息和APP的信息
Signature类:https://developer.android.google.cn/reference/android/content/pm/Signature

签名关键字:
例如:context.getPackageManager().getPackageInfo(context.getPackageName(),
64).signatures[0].hashCode()

可以尝试使用签名关键字搜索或hook的方式去定位关键代码。

实战案例:

首先使用jadx反编译APP,先尝试搜索signature在这里插入图片描述

发现没有找到其签名校验的关键代码,接下来尝试使用frida进行hook。
在这里插入图片描述

//先尝试hook一波hashcode()发现没有,再加入hook一波toByteArray()

Java.perform(
    function(){
        console.log('enter frida');
        var signature = Java.use('android.content.pm.Signature')
        signature.hashCode.implementation = function(){
            console.log('enter signature.hashCode')
            return this.hashCode()
        }

        signature.toByteArray.implementation = function(){
            console.log('enter signature.toByteArray')
            return this.toByteArray()
        }
    } 
)

以spawn方式启动Frida,控制台打印出:“enter signature.toByteArray”,说明调用了这个方法,尝试打印其堆栈,看看能否找到其关键代码进行定位:

function printstack() {
	console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));
    }

控制台打印结果如下:
在这里插入图片描述
根据堆栈找到其代码位置:
在这里插入图片描述
观察后可以得知这是一个检验签名的代码,可以直接hook其返回值,令其直接返回true,完整代码如下:

Java.perform(
    function(){
        console.log('enter frida');
        var signature = Java.use('android.content.pm.Signature')
        signature.hashCode.implementation = function(){
            console.log('enter signature.hashCode')
            return this.hashCode()
        }

        signature.toByteArray.implementation = function(){
            console.log('enter signature.toByteArray')
            //printstack()
            return this.toByteArray()
        }
        
        var hook_signature = Java.use('com.chaozhuo.texteditor.widget.a')
        hook_signature.a.overload('android.content.Context').implementation = function(){
            console.log('enter hook_signature.a')
            return true
        }

        function printstack() {
            console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));
        }
    } 
)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值