Android中带你开发一款自动爆破签名校验工具kstools

一、技术回顾

为了安全起见,一些应用会利用自身的签名信息对应用做一层防护,为了防止应用被二次打包操作,在之前已经介绍了很多关于应用签名校验爆破的方法,一条基本原则不能忘:全局搜索"signature"字符串,这里可以在Jadx打开apk搜索,也可以在IDA中打开so搜索都可以。找到这信息之后可以手动的修改校验逻辑,但是这个法则有个问题,就是如果一个应用在代码中很多地方都做了签名校验,比如以前介绍的一篇爆破游戏文章:Android中爆破应用签名信息案例分析,那时候就会发现,应用在很多地方都做了签名校验,当时的解决办法是一个一个地方修改,这样会感觉操作非常繁琐,所以本人就发明了一个比较好的办法,就是直接hook应用的pms服务,拦截其获取签名的方法,然后替换正确的签名信息即可。这个技术得益于之前介绍的技术:Android中免root进行hook应用自身的系统服务,这个技术原理非常简单,就是借助于动态代理技术+反射机制即可。而这个技术正好可以用于这次自动爆破功能,我们只需要在程序的入口处添加这段hook代码即可。关于这个技术,在上一篇的文章中已经实践过了:Android中爆破应用签名校验的新姿势。在那篇文章中我结尾说到了,这样的操作步骤可以完全自动化,所以这篇文章就把这个操作步骤变成自动化,开发一款一键化操作工具,我将其命名为:kill_signed_tools(简称:kstools);

二、工具流程开发

在介绍这个工具开发之前,我们还必须了解一个知识点,就是我在之前开发的一个自动注入代码工具icodetools的原理,不了解的同学可以去查看这篇文章:Android中自动注入代码工具icodetools原理解析,主要利用asm技术和dex2jar工具进行操作的。因为本文我们需要在应用的入口插入hook代码,所以也需要这样类似操作。原理和准备工作已经介绍完了,下面开始正式的开发流程:安徽板面

第一步:获取应用正确签名信息

因为我们在后面hook代码之后拦截签名方法,得返回应用本身正确的签名信息,所以得在第一步中就要获取应用签名信息,这个网上有很多代码可以直接获取apk文件的签名信息,这里不多说了。

第二步:获取应用入口信息

这个需要借助AXMLPrinter.jar工具来进行解析apk文件中的AndroidManifest.xml文件信息,然后获取程序入口,这里采用PullXML解析方式,需要注意的是:应用的入口一般有两处,一个是自定义的Application,一个是启动Activity。所以这里解析的时候,优先判断有没有自定义的Application入口,如果没有,就获取启动的Activity即可。找到入口之后一定要获取入口类的完整名称即:包名+类名。

第三步:插入hook功能代码

借助于icodetools工具,以及第二步中获取到的程序入口类信息,开始动态插入hook代码,这里需要注意的是:最好是在attachBaseContext方法中进行添加即可,如果入口类没有实现这个方法,可以在onCreate方法中添加,但是一定要在方法的第一行代码处添加。插入的asm代码也很简单,可以利用Bytecode插件进行查看即可:

我们只需要将这段asm代码添加到入口处即可:

而这里的ServiceManagerWraper类后面会给出下载地址。

第四步:二次打包签名

这个中间还有很多步骤,比如讲jar转化成dex,再把dex替换到apk中,这个过程在icodetools中已经有了,完全一样,这里就没必要在介绍了,最后一步都是二次打包签名操作。

三、hook代码分析

到这里我们就把操作步骤流程介绍完了,下面在来介绍关于hook代码逻辑,hook代码比较简单,就两个类,一个是反射类,一个是动态代理类,下载地址后面会给出:

这里的代码非常简单,通过传入的Context变量,利用反射机制替换服务的Binder对象,然后就是动态代理对象:

拦截获取签名信息的方法,替换正确的签名信息即可。然后将这两个类编译得到对应的class文件,放到工具目录下:

所以最终的工具目录是这样的结构,只要将操作的apk文件拷贝到这里,改名为src.apk,然后运行kstools.bat即可:

这个运行操作和icodetools操作一模一样,运行完成之后,会生成一个signed.apk签过名的,还有一个没有签名的unsigned.apk文件,如果想自己签名,可以利用这个文件即可。

这时候我们可以用Jadx工具查看signed.apk文件:

添加成功了。

四、工具使用说明

从github上弄下来的工具目录如下:

因为现在很多app做了加固操作,所以这里需要注意这么几个问题:

第一个问题:如果发现app加固了,第一步你得先脱壳,再次说明,本工具不适合加固app,需要自己手动脱壳修复apk才能继续操作。加固app操作,先把加固app放到当前目录下,直接拖动apk文件到apksign.bat上运行,获取正确的签名信息,会保存到apksign.txt文件中,然后再去脱壳修复apk,在放到当前目录下命名为src.apk,然后在此运行kstools.bat文件即可。操作过程不可错乱,不然会出错。

第二个问题:如果发现app没有加固,那么就直接将apk命名为src.apk放到当前目录下,直接运行kstools.bat即可,这里又要注意啦,如果直接运行kstools工具的话,当前目录可能存在你上次操作加固的app存留的apksign.txt文件,这时候需要手动删除,切记,不然也是操作失败的。

第三个问题:不要问怎么区分是加固的还是没有加固的,这个技能小学生都会了,这里不介绍了。

第四个问题:在获取app签名信息失败的时候,怎么办?我们需要手动的去获取,这里方法很多,可以用Android中的这段代码即可:

这样就可以得到签名信息了,然后再把签名信息拷贝到目录的apksign.txt文件中即可。

说明:工具第一次发布,肯定有一些问题,请敬请的使用,提问题,如果在操作的工程中遇到任何问题请在小密圈留言提供错误样本,我好进行研究爆破!

五、工具开发流程总结

到这里,我们就介绍完了,自动爆破签名校验工具的原理了,下面用一张图来总结一下:

下面在来说一下这个工具的缺点,其实就一点,对于一些加固的应用是没有效果的,本人尝试了一些加固app,最终都是失败的,不过这不代表就没有任何用了,因为不是所有的应用都会采取加固方式,只要不加固,那么这个工具就有效果,并且不管签名校验在哪都可以进行成功爆破。

时间: 2024-12-16 10:55:52

Android中带你开发一款自动爆破签名校验工具kstools的相关文章

Android 中带你开发一款自动爆破签名校验工具 kstools

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> Android中带你开发一款自动爆破签名校验工具kstools - 生死看淡,不服就干! - 博客频道 - CSDN.NET 生死看淡,不服就干! http://www.wjdiankong.cn 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &n

Android腾讯微博开发之随机字符串与签名实现

Android腾讯微博开发入门之随机字符串与签名实现 直接上代码 1.Utils类,包括签名和随机字符串 import java.util.Random; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; /** * * @author mrlixirong * * 2011-11-16 */ public class Utils { //签名 public static String getSignature(St

带你开发一款给Apk中自动注入代码工具icodetools(开凿篇)

一.前言 从这篇开始咋们开始一个全新的静态方式逆向工具icodetools的实现过程,这个也是我自己第一次写的个人觉得比较有用的小工具,特别是在静态方式逆向apk找关键点的时候,后续会分为三篇来详细介绍这个工具实现: 第一篇:开凿篇,简单介绍实现原理以及简单的初次方案实现简单的apk注入代码功能 第二篇:填坑篇,这一篇是在前一篇的基础上对工具的优化,可以应对市面上大部分的apk代码注入功能实现 第三篇:生产篇,这一篇是在前两篇的基础上利用这个工具来实际操刀如何进行快速定位应用的关键方法功能 还记

带你开发一款给Apk中自动注入代码工具icodetools(完善篇)

一.前言 在前面已经介绍完了 自动给apk中注入日志代码工具icodetools原理了,在那里我们曾经说过其实离真正的可使用价值有点距离,本篇就对这个工具进行一些优化,让其真正意义上开始能工作量产.当时在前面一篇文章中说到遗留的三个主要问题: 第一个问题:对每个类中都添加一个静态打印方法堆栈信息的方法,这样会导致有些应用的dex过大,方法数超了问题 第二个问题:在从输入一个apk到给每个类中的每个方法添加日志代码然后在签名输出最终的apk,这个过程其实很多步,但是我们之前都是手动的去进行操作,非

带你开发一款给Apk中自己主动注入代码工具icodetools(开凿篇)

一.前言 从这篇開始咋们開始一个全新的静态方式逆向工具icodetools的实现过程.这个也是我自己第一次写的个人认为比較实用的小工具,特别是在静态方式逆向apk找关键点的时候.兴许会分为三篇来具体介绍这个工具实现: 第一篇:开凿篇,简介实现原理以及简单的初次方案实现简单的apk注入代码功能 第二篇:填坑篇.这一篇是在前一篇的基础上对工具的优化,能够应对市面上大部分的apk代码注入功能实现 第三篇:生产篇.这一篇是在前两篇的基础上利用这个工具来实际操刀怎样进行高速定位应用的关键方法功能 还记得那

Android中ViewHolder模式开发的详细解释

Android开发中ViewHolder模式开发的详细解释: 1.ViewHolder的解释: (1).只是一个静态类,不是Android的API方法. (2).它的作用就在于减少不必要的调用findViewById,然后把对底下的控件引用存在ViewHolder里面,再在View.setTag(holder)把它放在view里,下次就可以直接取了. 2.convertView中的TAG: (1).Tag不像ID是用标示view的.Tag从本质上来讲是就是相关联的view的额外的信息.它们经常用

Android中textView自动识别电话号码,电子邮件,网址(自动加连接)

extends:http://blog.csdn.net/wx_962464/article/details/8471195 其实这个是很简单的,在android中已经为我们实现了,但是我估计很多人都不知道.包括我.所以就写下来供大家看看,学习. 核心的就是在TextView中添加一个属性就行了,添加android:autoLink="email|phone|web" 这样我们的程序中就会主动的识别我们的email地址,我们的电话号码,以及我们的web页面. 下面就看看效果图吧.

android黑科技系列——破解一款永久免费网络访问工具

一.前言 因为最近个人需要,想在手机上使用“高级搜索”,但是找了一圈发现都是需要收费的网络工具,奈何我没钱,所以只能通过专业技能弄一个破解版的. 二.应用分析 下面就直接奔入主题.首先我们看到到期界面如下: 提示会员还有0天,所以这个就是我们的突破口,直接反编译这个app,然后找到这个字符串信息: 然后用Jadx打开apk文件,全局搜索这个name值: 直接点进入进行查看即可: 最终会跟踪到这个方法中,我们在这里发现两个关键点:一个是程序会把用户的有效期保存到本地xml中,一个是这个程序漏洞,没

Android - 基带版本为未知时自动隐藏

Android5.1 机器没有刷入基带时,在Settings - About tablet中,Baseband version那栏显示Unknown 现在希望在未知基带版本时不显示这一栏 参考<Android5.1 壁纸来源选项中有两个“壁纸”选项>,可知这些设置说明是动态加载的Fragment 首先找到加载About tablet的地方 packages/apps/Settings/src/com/android/settings/ DeviceInfoSettings.java 可以看到