吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5125|回复: 18
收起左侧

[Android 原创] android逆向系列--java签名校验与反编译

  [复制链接]
宸道移动安全 发表于 2020-10-24 16:22


主要介绍两种简单的运行时签名校验的方法,和怎么绕开校验进行二次打包的方法;我们知道签名是Android软件的一种有效身份标识,因为签名所使用的秘钥文件是我们所独有的,而当我们app被重新打包后,app的签名信息势必会被篡改,所有我们就可以根据软件运行时签名与发布时签名的相同与否来决定是否需要将app中止运行;那么既然有此方法,为什么我们的软件还是会被破解呢?那是因为破解者在反编译app时,更改了我们的代码逻辑,让我们不能够正确的执行我们的原始校验代码,例如常见的改变if判断,返回错误返回值,校验方法被重新编写等,这都是破解者绕开校验的思路,也是我们在开发中需要考虑的问题。
Java代码签名校验在这里简单介绍下,纯java逻辑的签名校验方法,Android SDK中提供了检测软件签名的方法,我们可以使用签名对象的hashCode()方法来获取一个Hash值,在代码中比较它的值即可,下面是获取当前运行时的签名信息代码
微信图片_202010241602114.png
接下来我们需要跟我们发布时的签名信息比较,在这里已经把Hash值MD5加密了
微信图片_202010241602113.png
Java代码classes.dex的crc32校验通常重编译apk就是重编译classes文件,而代码重新编译后,生成的classes.dex文件的Hash值就会改变,所以我们可以检查程序安装后classes.dex文件的Hash值来判断软件是否被重新打包过。至于Hash算法MD5和CRC都可以,在这里就直接使用CRC算法获取当前运行的app的crc32值了
微信图片_202010241602112.png
有了当前的crc32值了,那么我们只需要将其与我们app发布时的crc32原始值做比较了,这是我们的java逻辑,R.string.classes_txt的值我们我们可以先随意赋予一个(不影响),随后AndroidStudio开始正式打包
微信图片_202010241602111.png
当打包成功后,我们获取apk的classes.dex的crc32值,随后将该crc32值赋予R.string.classes_txt,最后通过AndroidStudio再重新打包即可(因为更改资源文件并不会改变classe.dex的crc32值,改变代码才会)。获取classes.dex的crc32值的方法,我推荐使用 Windows CRC32命令工具 ,使用方法如下
20180921151521644.png
Java层面的校验方法都是脆弱的,因为破解者可以直接更改我们的判断逻辑以达到绕开校验的目的,所以我们只能通过增加其破解工作量,来达到一点点防破解的夙愿。我建议将crc32值或签名的hash值进行MD5加密,在代码中使用加密后的值进行比较,防止反编译后的全局搜索;我建议将签名校验与classes.dex校验结合起来使用,先进行签名校验,校验成功后将正确签名hash值作为参数去后台请求classes.dex的crc32值,再与当前运行crc32值进行比较;我建议进行多处校验,每处使用变形判断语句,并与其他判断条件组合使用,以增加破解时的工作量。

绕过Java代码签名校验在这里我就只以签名校验来对破解思路做个介绍了,让我们在实战以前认认路,磨磨刀。如果反编译步骤还有不了解的可以先去参考上篇博客,首先我们将待编译apk通过apktool生成我们所需要的smali文件,这些文件会根据程序包的层次结构生成相应的目录,程序中所有的类都会在相应的目录下生成独立的smali文件
20180919145356872.png
然后我们通过dex2jar和jd-gui得到反编译出的java代码(往往都是已混淆的),不熟悉步骤的可以先去查看 上篇博客,这两种方式相辅相成,通过查看Java代码我们可以快速搜索出需要的Android API方法,再通过API方法的位置来定位到相应smali文件的大概位置

20180919160544876.png
一般java层面的签名校验都离不开signatures来获取签名信息,所以我们可以在jd-gui中全局搜索signatures关键字,找到获取签名的方法,当然如果app在校验失败前有着特殊的Toast提示或者Log信息那就更方便了
20180920151302325.png
随后打开我们查找到的signatures代码,一般情况下app都会进行多处校验
20180920151917540.png
随后我们顺藤摸瓜,找到f()方法被调用的地方,在这里就只拿jd-gui来试试水了,我们可以先通过AndroidManifest.xml文件找到Application和主Activity,一般在这里都会进行一些校验和身份状态的判断,改好一处之后,通过运行app,再根据app退出或者卡住的位置来定位下一处校验代码的位置,递归,直到运行成功。
20180920173927469.png
通过上面的语句我们可以知道,这只是一个简单的equals()比较,之后我们打开相应的smali文件,搜索"F010AF8CFE611E1CC74845F80266",定位签名校验的反编译代码位置
微信图片_20201024160211.png
在这里我们只需要将判断语句if-nezv0, :cond_1更改为if-eqz v0, :cond_1翻转逻辑即可,随后我们通过apkTool重新打包并签名,ok,运行成功。

免费评分

参与人数 3吾爱币 +2 热心值 +2 收起 理由
Bascter_Main + 1 用心讨论,共获提升!
fengbolee + 1 + 1 用心讨论,共获提升!
zjun777 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

pigeon11 发表于 2020-10-26 22:23
感谢分享,非常专业
十年自由 发表于 2020-10-26 12:12
9526ufty 发表于 2020-10-26 14:27
gh饕餮 发表于 2020-10-26 15:18
感谢分享
碎步流年 发表于 2020-10-26 18:30
正在我需要的
无敌小车 发表于 2020-10-27 07:29
感谢分享,终于明白签名是怎么回事了
duso 发表于 2020-10-27 20:25
好文,谢谢楼主分享
lifz888 发表于 2020-10-28 08:23
非常好的学习材料,支持原创,支持分享
tomemouse 发表于 2020-10-28 10:56
感谢分享,终于明白签名是怎么回事了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 18:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表