Frida绕过APK的签名校验

APP简单启动顺序

  • 点击APP启动
  • 执行Application(attach, onCreate方法)
  • 执行开屏界面Activity
  • 执行Main
  • Activity(onCreate方法) 启动成功

简单签名校验

签名校验一般在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的方式去定位关键代码。

hook方法寻找签名校验

如果代码被混淆,我们无法通过搜索关键字定位到签名校验代码位置,就需要使用firda进行hook定位;一般是hook其中的Signature中的方法;

注意:这里要使用以spawn方式启动Frida

//先尝试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()));
        }
    } 
)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要查看APK中的所有类和方法,您可以使用Frida提供的frida-repl工具。frida-repl工具是一个交互式的JavaScript控制台,您可以使用它来探索和操作运行中的应用程序。 以下是在frida-repl中查看APK中的所有类和方法的步骤: 1. 启动frida-server 在您的测试设备或模拟器上启动frida-server。您可以从Frida官方网站下载适用于您的设备的frida-server二进制文件,并将其推送到设备上。然后,使用以下命令在设备上启动frida-server: ``` $ ./frida-server ``` 或者,您可以使用以下命令从计算机上启动frida-server并将其连接到设备: ``` $ frida --device <device_id> --no-pause ``` 2. 启动frida-repl 在计算机上打开终端窗口,并使用以下命令启动frida-repl工具: ``` $ frida-repl ``` 然后,使用以下命令连接到您要分析的APK: ``` > rpc.connect('tcp:<device_ip_addr>:<device_port>') ``` 请将“<device_ip_addr>”替换为您设备的IP地址,将“<device_port>”替换为您在设备上启动frida-server时使用的端口号。 3. 查看所有类 在frida-repl中,使用以下命令列出APK中的所有类: ``` > Java.enumerateLoadedClassesSync().forEach(function(className) { console.log(className); }); ``` 该命令将输出APK中的所有类名。 4. 查看类的所有方法 要查看特定类的所有方法,请使用以下命令: ``` > Java.use('<class_name>').__methods__.forEach(function(method) { console.log(method); }); ``` 请将“<class_name>”替换为您要查看其方法的类名。该命令将输出该类的所有方法名。 希望这些信息对您有所帮助。如果您有其他问题,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞得更高肥尾沙鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值