zl程序教程

您现在的位置是:首页 >  其它

当前栏目

Apk 签名验证

验证 签名 APK
2023-06-13 09:12:06 时间

大家好,又见面了,我是你们的朋友全栈君。

当app进行反编译后修改,再回编译,若出现闪退的情况时,则有可能是由于程序本身已存在签名验证,才会出现闪退,今天分享如何解决因签名验证而出现的闪退现象。

1 阅读签名验证源码 1.打开文件

2.分析Java层,在调用init这个方法里面,是进行按钮以及其他控件的初始化

3.接下来是一个注册函数,判断用户名和密码是否相等,从而弹出不同的提示

4.LoginActivity类继承了BaseActivity,先分析BaseActivity这个类

5.分析onCreate方法里面的getSignature方法,该方法需要传入参数包名,根据包名获取签名信息,做出判断

6.完成上述操作后,开始获取签名信息

7.接着分析getSignature方法,首先,获取一个包管理

8.获取包管理后,将包名以及其他两个参数传进来

9.接下来,获取当前签名信息的途径,就是获取包管理等的操作

10.通过字符串定位,移动到这个类

11.找到类后,开始获取签名

12.获取签名时,会发现下面还有一个isOwnapp方法,进行一个是否相等的判断

13.判断过后,来到这个类

14.调用isOwnApp方法,对返回值进行判断,条件满足就killProcess,杀死进程

2 实战分析及过掉签名校验 以霸哥磁力为例。 1.安装程序霸哥磁力,直接拖进雷电模拟器,打开程序

2.打开androidkiller,对程序进行重新签名

3.重新签名过后,再次拖入,点击执行

4.将原有程序卸载,安装签名后的程序

5.安装完成,运行程序,提示:很抱歉,“霸哥磁力搜索”已停止运行

6.这里继续分析,首先将原版程序拖到androidkiller中进行反编译

7.反编译完成后,判断程序崩溃在打开程序时,说明检测签名校验的逻辑会在这种执行时间比较早的地方,先从启动界面开始查看

8.找到Oncreate方法,直接从Oncreate方法开始分析,然后点击咖啡图标,查看Java代码

9.找到Oncreate方法和onclick方法

10.一开始调用了函数:qian

11.点击该函数,获取包名管理,再进行签名,然后hash

12.如果这里不等于,会出现一个弹窗。继续分析,发现这里只是进行简单的判断就返回了,所以并不会杀死程序

13.继续查看onclick函数,发现在它下面还存在一个方法,是将bug函数返回值给eee,判断是否相等,然后弹窗

14.分析这个bug,在oncCreate里面,只有一个qian方法,然后是点击该方法,最后是bug,继续点击进来,发现是native,上面是so库的加载

15.解压文件,将so文件拖入IDA,发现没有JNI_onload,只有以Java_开头的一个文件

16.双击进入,简单分析。先压栈,然后move传参,然后调用getSignHashCode

17.点击进入,发现签名三兄弟

18.继续往下分析sinatureHashcode,从字符串中可以看出来,这些一块一块函数的调用,按快捷键F5,查看伪代码,查看具体参数

19.回到上一层,只传了一个R0,那么这里就是env

20.第二个参数没有被static修饰,那就是obj

21.将参数类型分别修改为JNIEnv *a1,jobject a2

22.隐藏类型

23.调用各种方法,若返回值与下图不相符,则直接exit退出

总结:通过一个案例,从java到so层,先分析动态注册和静态分册,再找到逻辑代码,找有签名三兄弟的函数,找到后分析这个函数的引用,进而可以采取手段过掉签名验证。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/134306.html原文链接:https://javaforall.cn