1、FieldsPackageManagerField=activityThreadClass.getDeclaredField("sPackageManager");
2、看到这里可能是在native层调用了系统获取签名的方法,选中红色框中的内容,然后按X键,展示被调用的地方索引:
3、看到了,其中签名字符串:"aN+VCd8ns0yqsotX2WuKyScq/ZA="就是正确的官方版本的值。下面在顺便写一个直接返回这个字符串的方法,然后变编译得到对应的smali代码:
4、在手机桌面上找到微信并点击打开微信APP,在微信首页的任务栏中可以看到““我”四个选项。
5、通过反射调用ActivityThread的getPackageManager方法即可获取到接口的实例。动态代理HookgetPackageInfo实现代码为:
6、MethodcurrentActivityThreadMethod=activityThreadClass.getDeclaredMethod("currentActivityThread");
7、申办个人可以使用已实名认证的“随申办市民云” 或“微信”、“支付宝”app进行扫码登录,也可以直接通过一网通办进行账号注册和实名认证。
8、这里看到了,有data字符串内容了,也就是这里开始对上面传递的json数据进行加密,然后拼接到data中,在native层在拼接一套json:{"data":"加密之后的值","ver":"1"},而在这里有一个寻找加密key的函数,可惜这里我不在分析了,因为我看的头疼,他的加密算法还是比较复杂的。所以就放弃分析了。那么到这里,我们有什么方式可以得到加密算法呢?有的同学可能想到了动态调试,这个方法是最好的,但是这个app做了很多反调试策略,动态调试也是不好弄的,而且这个算法有点复杂,及时动态调试,也要详细阅读arm指令,才能猜到这个加密算法功能。所以这条路不好走。
9、入口处代码已经添加完毕了。然后安装运行,就可以完成。而这么操作之后应用所有的签名信息就是正确的。包括native层的签名校验逻辑。所以这种方式是最靠谱的。不要改多处签名校验的逻辑了。(签名软件在线使用)。
10、if(args(0)!=null&&args(0)instanceofString){
11、signaturesArray(0)=newSignature(originalSignature);
12、既然经过Xpatch重打包后的App可以加载任意Xposed插件(https://github.com/WindySha/Xpatch),那我们何不写一个Xposed插件Hook住获取App签名的方法呢。
13、if(packageInfo.signingInfo!=null){
14、看到了,在之前有一个判断,如果为false,就是走到i方法,展示对话框,所以这个checkHashKey方法肯定是签名校验的方法,进入查看:
15、在“Appleaccount”处输入你要用来给应用签名的AppleID,不能是带双重认证的,然后将要安装应用的iOS设备用数据线与电脑连接
16、在“设置图片格式”面板,选择“版式”栏,在”环绕方式“选择”衬于文字下方“,点击确定。
17、if("getPackageInfo".equals(method.getName())){
18、✔“基本信息”中个人登录时通过实名验证调取个人信息。点击“更多”可以查看详细账户信息。
19、mPmField.set(pm,proxy);
20、庆幸的是,笔者找到了一个做了签名校验的App,趣头条App。
21、publicstaticStringgetPackageSignature(Contextcontext,StringpackageName){
22、到这里我们就成功的爆破了一款服务端+Native双签名校验的样本案例了,而这次操作签名爆破之后,后面将不会在介绍更多的签名校验了,原因很简单,因为这次操作之后,我们发明了一个通用的爆破方式,可以解决签名校验问题了,下面就来总结一下现阶段Android中签名校验逻辑处理方式:
23、这里看到就是标准的获取应用签名信息的方法。
24、保存,二次打包即可,记住:这里没必要手动的编写smali代码返回指定的签名字符串,除非你对smali语法非常熟悉了,不过我是不会这么做的。因为我不熟悉smali,最笨的最有效的方法就是自己手动写一个Java方法,然后反编译得到对应的smali代码即可。
25、然后把这个方法的的代码拷贝替换样本应用的aj.m方法代码即可:
26、看到i方法中有一个show方法,应该就是对话框展示的逻辑。看看这个i方法调用的地方:
27、第在逆向领域中,字符串信息永远是第一选择的爆破的突破口,在之前的文章我已经多次讲到了,不管是IDA,还是Jadx工具,只要全局搜索关键字符串信息,就可以找到我们想要的入口。
28、二次打包成功之后,安装应用,运行发现竟然还有错误,登录失败:
29、publicObjectinvoke(Objectproxy,Methodmethod,Object()args)throwsThrowable{
30、https://gitee.com/openharmony/developtools_hapsigner
31、在这里我们可以通过方法名来拦截签名信息,我们用正版的签名信息构造一个新的Signature对象,然后将其设置已有的对象中即可。因为我们最终还是需要把代码放到样本案例的入口处,所以就在这里将这两个类放到样本入口类的包下面,具体包名可以手动构造:
32、使用DevEcoStudio完成HAP自动签名
33、privatestaticfinalStringQU_TOU_TIAO_SIGNATURE="3082021b30820184a0030201020204574beab6300d06092a864886f70d01010505003052310c300a06035504061303303231310b3009060355040813025348310b3009060355040713025348310b3009060355040a13025a48310b3009060355040b1302434e310e300c0603550403130551754b616e301e170d3136303533303037323433385a170d3431303532343037323433385a3052310c300a06035504061303303231310b3009060355040813025348310b3009060355040713025348310b3009060355040a13025a48310b3009060355040b1302434e310e300c0603550403130551754b616e30819f300d06092a864886f70d010101050003818d0030818902818100aa5bae49b771380e692444437b82b375cabdefb3f23307c29510653776b8e4115f776bea5eb6690285f97d4e6e8d0469e49f79ecba31e4b7fb85dd612ee6b27ef38502aa38d055ddad2aa7b52d19fb8d2aeeb59a830b91c341f1b467655e7313e9ff65feb6539bf1655f35a37e17faa94e506a08219df196730f45d9c1cd94d30203010001300d06092a864886f70d0101050500038181000e6cc9fb74aef11dd33d6603869a9db61b8dcedae77bc815433026693fe59fd4b75a3284170f8872737e55595c1fd40da3dfbe5ad8a4e96802f53637977f0eb6e9b0dc35161cbaed398b41ecd73c4009a1dae7bcb00b75c3f8d5792405bcc5e4602d9dff6a0dc4739240a3b42626f5efce4d7baea0fced2b13361cb4ded8ed0b"
34、该款电子签名软件的用户遍布全球30多个国家,涵盖各行各业,软件可在手机、平板、电脑上实时同步使用,支持OFFICE、PDF、JPG等几乎所有文档,支持签字文件微信/QQ分享发送。其独有的签字验签技术,防拷贝,防篡改,轻松鉴别笔迹真伪。
35、极速源:http://signtool.cn/app.json
36、登录成功后,进入(办理须知)界面。申办个人如未在一网通办平台中设置或个人电子签名的,应先点击“设置签名”进行个人签名设置。
37、http://pangucom/sideloadly/
38、StringpackageName=(String)args(0);
39、https://github.com/fourbrother/HookPmsSignature
40、因为ApplicationPackageManager的getPackageInfo的最终实现是IPackageManager接口通过Binder跨进程调用PMS实现的,其实现逻辑如下:
41、publicMyInvocationHandler(Objectbase){
42、生产和分发经过认证的代码签名软件和应用程序可以提高用户的信心,有助于建立值得信赖的品牌声誉。
43、if(signaturesArray!=null&&signaturesArray.length>0){