Android逆向学习(六)绕过app签名校验,通过frida,io重定向(上)

Android逆向学习(六)绕过app签名校验,通过frida,io重定向(上)

一、写在前面

这是吾爱破解正己大大教程的第五个作业,然后我的系统还是ubuntu,建议先看一下上一个博客,关于动态调试的,因为我这才发现动态调试是真的有很大用处,然后我们开始今天的教程(拖更很久了,最近真的很忙事情好多,抽空出一期博客,这一节博客问题其实挺多的,如果有不对的地方请指出,不胜感激)

二、任务目标

  1. 破解签名,使程序可以正常运行

三、实现方法

1. 破解签名防止闪退

我们先简单看一下这个反编译之后的java文件

20231004205012

这里有个check,以及system终结的一个代码

解决方法具体有两种,一种简单的方法就是直接更改函数的返回值,让他只返回true

我们分析一下checkSign的代码

20231004205325

最主要就是修改这个地方,把false改成true

我们发现areEqual调用后有一个分支,就说明改变这个分支就可以了

20231004205711

我们直接修改smali代码后就是这样的

20231004211445

然后我们就可以看到这个页面是什么样子的了

20231004211546

然后还有一种方式就是我们动态调试一下,然后我们直接改变这个hash值

20231004211853

就是这个hash值,这个就是这个软件原来的hash,因为我们对这个软件进行了很多修改,所以现在的hash和原来的hash已经不一样了,所以我们需要改成和现在一样

我们直接在areEqual上面这里打一个断点,然后开始一步一步往下走,就可以看到这样:

20231004213430

这很明显就是要进行比较的两个值,然后我们把这个修改一下就可以了

20231004213554

然后我们打包运行一下(上一个方法的 add-int/lit8 v1, v1, 0x1 代码已经去除了 )

发现是可以进行运行的

20231004213918

2.关于剩余的签名

然后我这里一直有一些bug就是我点击验证总是会出问题,就是程序直接卡死,讲道理不应该这样才对,然后我直接debug动态调试发现是so校验的时候会卡死,讲道理不应该呀,我用真机测试也会出现这种情况,通过JEB进行动态调试之后发现就是在loadLibrary的时候会出现这个问题

搞了好久都不知道怎么回事,就只能把这个签名校验直接干掉了(字面意义上的干掉)

20231005160820

就是这三行直接全部消灭掉,当然这样一般肯定是有问题的,so文件里面一般都会有一些可能其他进程需要的函数,所以我建议最好不要用这个方法,我是实在没办法了才这样,要是不这样我可能连着好几天都没法更新新的blog,所以请大家见谅

但是不管如何我都会遇到这个问题,难不成因为版本问题?算了不管了先这样。

20240108204430

后来我想了想,不如反编译so文件看看,说不定可以看到哪里有问题,然后我们反编译后是这样

20240108211748

突然间想到,说不定是因为我把名称改成了东北往事,然后load的时候名称对不上

重新把东北往事换成了wuaipojie,结果还是完蛋,点击验证还是闪退,看来跟这个没关系,问题只有天知道了,就删掉继续吧,这样我们需要面对的就是API签名校验,CRC校验和hash校验

3.新API校验

我们同样进行一个逆向,直接看源代码

private final boolean useNewAPICheck() {String str;Signature[] signatureArr;try {if (Build.VERSION.SDK_INT >= 28) {signatureArr = getPackageManager().getPackageInfo(getPackageName(), 134217728).signingInfo.getApkContentsSigners();} else {signatureArr = getPackageManager().getPackageInfo(getPackageName(), 64).signatures;}str = MD5Utils.INSTANCE.MD5(Base64Utils.INSTANCE.encodeToString(signatureArr[0].toByteArray()));} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();str = "";}Log.e("zj2595", "newsign:" + str);return Intrinsics.areEqual("074f64af5821ae6aa1ac1779ad5687ad", str);}

这个就是新API校验的函数,当然按照正己大大的教程,我们是可以得到这个Log.e中的这个信息,那我们就先按照正己大大的教程,查看一下这个log就行了,我采用的方法是直接用adb看

首先打开终端,adb连接后打开shell,然后使用logcat关键词查询,就可以看到这个

20240108220253

这个然后复制过去,替换掉就可以了,就像这样

20240108220314

但是这就有一个问题了,一半正常情况下是不会有人专门log出来,所以这个方法在实战中是没有用处的,所以一般来说,我们的操作有

  1. 动态调试找到这个str
  2. 直接强行修改返回值,永远返回一个true

这两招是比较实用的

20240108220447

4.CRC校验(有问题,请先看完再实际操作)

这个方法也差不多,首先看一下crc校验的代码

    public final boolean check_crc(long j) {try {ZipEntry entry = new ZipFile(getPackageCodePath()).getEntry("classes.dex");Log.e("zj2595", "dexCrc:" + entry.getCrc());return entry.getCrc() == j;} catch (Exception e) {e.printStackTrace();return true;}}

关于这个j我也看到了,我把相关代码摘出来

我们可以看到相关的代码有一个jtextView5.setText(challengeFifth.check_crc(j) ? "通过" : "不通过");然后我们找到这个函数的参数
(TextView textView, ChallengeFifth challengeFifth, TextView textView2, TextView textView3, TextView textView4, TextView textView5, long j, TextView textView6, TextView textView7, View view)顺藤摸瓜往上找,找到了long parseLong = Long.parseLong(getString(2131755055));button.setOnClickListener(new ChallengeFifth$.ExternalSyntheticLambda0(textView, this, textView2, textView3, textView6, textView4, parseLong, textView5, textView7));

这时候就比较难办了,修改也不好修改(强行修改返回值我不讲了,这个方法算作弊了,我们就学习一种新的破解方法)

原教程io重定向写的有点简略了,然后这个其实用frida可以很方便,我们在后面会详细讲到frida,这里我觉得我们就直接写,先对frida有个了解。

frida的安装我在之前的博客写过了,就是camodroid和tracedroid那篇,这里我们就直接使用,根据代码分析是getPackageCodePath()获得的地址,我们查看一下这个代码

20240109120111

这个是在android.content.ContextWrapper下面,之后我们就hook一下试一试

import sys
import fridadef on_message(messages, data):if messages["type"] == "send":print("[+] {}".format(messages["payload"]))print("[+] {}".format(messages))else:for name in messages:print("[+] {}".format(messages[name]))process = frida.get_usb_device().attach('东北往事')
with open("frida.js") as f:script = process.create_script(f.read())# 这是将frida 的脚本给读取进来了
script.on("message", on_message)
script.load()
sys.stdin.read()

下面是frida的js脚本

Java.perform(function () {Java.use("android.content.ContextWrapper").getPackageCodePath.implementation=function () {var result = this.getPackageCodePath();send(result);return result;}
})

我们运行的结果是

‘/data/app/~~VEf27Hz4Vx9zDMiZ-UPXZQ==/com.zj.wuaipojie-Qpx1v_KIH3iiBblSp6vvtg==/base.apk’

这就是运行的路径了

所以我们目前的思路就是更改这个获取路径方法的返回值,将它定位到其他地方,我们当然可以直接hook check_crc的函数,但是这样还是一种作弊的方式吧,因为我写这个博客不是为了完成52的作业,而是学习更多的技术,如果是hook check_crc方法的话用下面这个脚本。

Java.perform(function () {Java.use("com.zj.wuaipojie.ui.ChallengeFifth").check_crc.overload('long').implementation = function (j) {var result = this.check_crc(j);send(result);return true;}
})

如果按我们之前的思路,那就开始更改路径

我们的方法就是,将这个返回值,给修改成我们放入原始包的地址,这样它检测的地址就是我们没有修改的包,说干就干.

我们还是首先把这个的apk包,用adb工具给发送到手机上

adb push 52demo.apk /data/local/tmp
cp /data/local/tmp/base.apk /data/user/0/com.zj.wuaipojie/files/

然后我们修改返回值为这个地址加apk文件名

Java.perform(function () {Java.use("android.content.ContextWrapper").getPackageCodePath.implementation=function () {var result = this.getPackageCodePath();send(result);var javaString = Java.use("java.lang.String")var newstring = javaString.$new("/data/user/0/com.zj.wuaipojie/files/base.apk")send(newstring)return newstring;}
})

然后扯淡的地方来了,这个始终不会出现crc校验通过,我不知道为什么会这样,按照道理来说应该是没问题的才对啊,这个就直接跳过了,不过这个思路是完全没有问题的,我感觉可能是因为版本对不上导致的,所以我直接hook crc函数算了,如果大家知道这个问题的话请联系我(可能是因为我用的第13节课的课件?最多只到7关的那个,可能是这个原因,等以后我换换试试)

这个就先这样过了吧

20240109214318

三、结尾

20240109214942

还是虎哥镇楼,作为我csdn博客的封面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/610997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux: netstat 与 ss 用法详解

文章目录 netstat描述语法参数例子 ss描述语法参数例子 总结 netstat 描述 内核中访问网络连接状态及其相关信息的程序,它能提供 TCP 连接,TCP 和 UDP 监听,进程内存管理的相关报告 语法 netstat [选项] usage: netstat [-vWeenNcCF] [&l…

聊聊 Java 集合框架中的Arrays

Arrays 和 Collections是分别操作数组和集合的两个工具类。今天就来对 Arrays 中的内容作个总结。 一、Arrays 类概述 Arrays 类位于 java.util包中。Arrays 继承 Object java.lang.Object↳ java.util.ArraysArrays 类中的静态方法可以对数组进行排序、查询、搜索等等操作。…

Zookeeper设计理念与源码剖析

Zookeeper 架构理解 整体架构 Follower server 可以直接处理读请求,但不能直接处理写请求。写请求只能转发给 leader server 进行处理。最终所有的写请求在 leader server 端串行执行。(因为分布式环境下永远无法精确地确认不同服务器不同事件发生的先后…

easyExcel 获取多个sheet中复杂表头的数据

easyExcel 获取多个sheet中复杂表头的数据 easyExcel 解释 EasyExcel是一个强大且易于使用的Java库,用于简化Excel文件的读写操作。它是阿里巴巴开源的一个基于POI实现的Excel处理工具,并提供了一组简单的API来处理Excel文件,包括读取、写入…

逐步分解,一文教会你如何用 jenkins+docker 实现主从模式

jenkins 主从模式想必大家都不陌生,大家在学习过程中为了学习方便都在自己本地搭建了 jenkins 环境,然后通过 javaweb 方式实现,对于 docker 下实现主从模式大家好像兴趣挺大。 今天就通过这篇文章给大家讲讲怎么玩,希望对大家有帮…

Vivado开发FPGA使用流程、教程 verilog(建立工程、编译文件到最终烧录的全流程)

目录 一、概述 二、工程创建 三、添加设计文件并编译 四、线上仿真 五、布局布线 六、生成比特流文件 七、烧录 一、概述 vivado开发FPGA流程分为创建工程、添加设计文件、编译、线上仿真、布局布线(添加约束文件)、生成比特流文件、烧录等步骤&a…

交叉编译ARM64架构electron详解

基本介绍 本文主要参考Electron官方文档中 构建说明 和 构建步骤(Linux) 在amd64环境内构建arm64的electron包。 如果是arm64环境请查看文章arm64架构编译electron长征路 一、环境说明 操作系统版本:统信1060 操作系统架构:amd64 内存:32G 如下图: electron版本:v25…

企业微信forMAC,如何左右翻动预览图片

1、control commandshifd 进入企业微信的debug调试模式 2、按照如下步骤选择 3、重启企业微信

全球再生环保趋势的热门项目GRS认证

GRS,最初由世优认证(CU)于2008年制定,并于2011年1月1日将所有权转让给了纺织品交易所TE。 自2017年7月1日GRS4.0版本开始生效。是为在纺织工业的需求所制定,核查回收产品或某些特定产品。更重要的是让零售商和消费者了…

【K8S 存储卷】K8S的存储卷+PV/PVC

目录 一、K8S的存储卷 1、概念: 2、挂载的方式: 2.1、emptyDir: 2.2、hostPath: 2.3、NFS共享存储: 二、PV和PVC: 1、概念 2、请求方式 3、静态请求流程图: 4、PV和PVC的生命周期 5、…

基于ubuntu2204使用kubeadm部署k8s集群

部署k8s集群 基础环境配置安装container安装runc安装CNI插件部署1.24版本k8s集群(flannel)安装crictl使用kubeadm部署集群节点加入集群部署flannel网络配置dashboard 本集群基于ubuntu2204系统使用kubeadm工具部署1.24版本k8s,容器运行时使用…

Unity | Shader基础知识(第九集:shader常用单词基础知识速成)

目录 一、顶点(Vertex)和法线(Normal) 二、UV信息 三、 基础数据种类 1 基础数据种类 2 基础数据数组 3 基础数据数组的赋值 4 对数据数组的调用 四、 基础矩阵 1 基础矩阵种类 2 对矩阵数组的调用 2.1对一个数据的调用 2.2对多个数据的调用 2…

js判断当前是否是企业微信环境,微信环境

前言: js判断当前是否是企业微信环境,微信环境 封装方法: function envjudge() {var isMobile window.navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBro…

关于frida定位无误却无法hook到加密方法的见解

一、HOOK不到问题 原先使用 frida -U APP名 -l .\hook.js 这种方法进行hook加密函数,不料始终hook不到,没反应。思考了一下,应该是该app有多个进程,使用上面hook的不是加密进程,古应当用进程pid办法进行hook 二、解决办…

机器之心 AI 技术--人工智能助力个性化视频实战经验分享(文末送书)

【清华社&机器之心】视频生成前沿研究与应用特别活动 在视频生成即将迎来技术和应用大爆发之际,为了帮助企业和广大从业者掌握技术前沿,把握时代机遇,机器之心AI论坛就将国内的视频生成技术力量齐聚一堂,共同分享国内顶尖力量…

华为云AI:轻松实现图像识别调用

文章目录 前言一、环境配置关键步骤 二、图像识别实例媒资图像标签名人识别 总结 前言 基于华为云AI服务和java使用SDK实现图像识别,主要以媒资图像标签和名人识别为例。 一、环境配置 Maven(没有直接下载华为的SDK包,而是使用Maven安装依赖…

韩语翻译是怎么收费的

近年来,随着中韩交流的日益密切,韩语翻译在国内的需求呈现出不断增长的态势。无论是韩语笔译还是口译,其应用领域都非常广泛。那么,韩语翻译的价格是否高昂?翻译公司又是如何进行报价的呢? 在翻译领域&…

C2-3.3.2 机器学习/深度学习——数据增强

C2-3.3.2 数据增强 参考链接 1、为什么要使用数据增强? ※总结最经典的一句话:希望模型学习的更稳健 当数据量不足时候: 人工智能三要素之一为数据,但获取大量数据成本高,但数据又是提高模型精度和泛化效果的重要因…

图数据库Gremlin语法(1)| 图基本概念与操作

图数据库Gremlin语法(1)| 图基本概念与操作 文章目录 图数据库Gremlin语法(1)| 图基本概念与操作[TOC] 前言一、本章学习重点二、图基本概念三、图基本操作总结 前言 Gremlin语言是图数据库最主流的查询语言,是Apache…

SQL查询连续两个时间段,以Hadoop为例

1、原理: 要实现连续两个时间段的数据查询,网上有很多,我也转载了别人写得比较好的文章。但是最简便的方法是用最原始的方法,将相同数据查询两遍,关联后将两个时间段的数据放在一行。 select a.*,b.列1,b…