转载自:http://www.520monkey.com/archives/1006
此处仅作为学习记录一用。至于评论问答环节,请去上面地址翻阅四哥的原文。上面已附上地址。
一、技术回顾
为了安全起见,一些应用会利用自身的签名信息对应用做一层防护,为了防止应用被二次打包操作,在之前已经介绍了很多关于应用签名校验**的方法,一条基本原则不能忘:全局搜索”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,最终都是失败的,不过这不代表就没有任何用了,因为不是所有的应用都会采取加固方式,只要不加固,那么这个工具就有效果,并且不管签名校验在哪都可以进行成功**。
Hook PMS代码下载地址:https://github.com/fourbrother/HookPmsSignature
kstools工具下载地址:https://github.com/fourbrother/kstools
六、总结
本文主要介绍了一个通过hook需要**应用的pms服务,拦截获取签名信息的方法,来做到全局**签名校验功能逻辑,这个工具可以解决以往需要手动的反编译app来进行**,有了这个工具,完全可以一键化操作功能,无需在进行反编译**操作了。