java 方法签名_APP签名验证

本文介绍了在APP修改后回编译导致闪退的原因,通常与签名验证有关。通过详细分析Java层的签名验证逻辑,包括获取包名、签名信息的过程,以及在遇到签名不匹配时如何终止进程。实战部分展示了如何通过反编译和重新签名APP,以及使用androidkiller工具进行分析,找到关键函数并理解其工作原理,从而理解如何绕过签名校验。提供了一个具体的案例,从Java层深入到SO库,解析关键函数,为解决签名验证问题提供了思路。
摘要由CSDN通过智能技术生成

4b580ae694cda6dcceae1429269d037e.png

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

1阅读签名验证源码

1.打开文件

d6bd0667bd05bd3e93c0f1b0df1cd31c.png

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

ac7d796c20f9e57d17d05e9ac0402590.png

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

3f90725ade2dd576c9b68e3f80a6837c.png

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

6636e95b5e8bb7c428f30652b149b4a8.png

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

3a95487f991c1dc938897106214c8308.png

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

da1c33c557ac5ca772f8c5ae46dd9487.png

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

d69fd3268453e3169fa309700cd2f251.png

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

0305571432456619480eb22fd4b7ff94.png

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

4068755cf517d7cd8429cbdf14f4bda5.png

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

6ec8eaedc0d82a2a87b144c9002f69a1.png

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

20f738a471110029b3e8ca4a30a8e2c6.png

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

2d4395dd8efb5bd4bc6b764bcfe23a53.png

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

2a28dea966cda0025beb5d7e83783eb4.png

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

8c89871b606fe484583bf8e9a63bdfa0.png

2实战分析及过掉签名校验

以霸哥磁力为例。

1.安装程序霸哥磁力,直接拖进雷电模拟器,打开程序

b0262bcd8af86af4426dbdee7c62bf6b.png

2.打开androidkiller,对程序进行重新签名,工具位置

5a3190b90b8faf3922cd92ff2c73395e.png

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

4798c0fad872a664840c0ba6107fb359.png

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

fcd102eecf4fa6517395b79a125d53e2.png

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

6f5bed87ac4fc35e07330c3050d532b1.png

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

1ea143e01b22a7d1675e7be763eb17fc.png

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

c86724536f1a479913267460617b4981.png

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

bd6c07fd2f1398b0e297dec52262bf7a.png

9.找到Oncreate方法和onclick方法

8a875e5e631243c52a3a56e9972f6ba0.png

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

1f9c2e6600fd98b7fb5fad75a29315d6.png

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

9c13714af05283f66f10df4327b54b75.png

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

29f566c42afee8f1e2c13a0c112f07b6.png

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

842a7c8937006a3eaf7cc770788fe0ba.png

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

d0d6c901b3417649f3ef4ae48302819b.png

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

df57e919277b7162d6c6c9888ec1b6f1.png

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

0ab457c91c0765bc4ce68e61549aacb9.png

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

b2d9f090c7a74fd9239241d7c7274bec.png

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

559109b52e88dc0493a01bf2cef83734.png

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

5ccc0d6acb49946ead0a953b70114007.png

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

db5b07629654d20b4d06dad35f3ce392.png

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

6d92ba3afeee3ba611633b62f2c795e6.png

22.隐藏类型

deea976eb9bb13fe0e0987cf6fdf83e4.png

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

fbe2cf77635e5afaeb9e311865f197f8.png

通过一个案例,从java到so层,先分析动态注册和静态分册,再找到逻辑代码,找有签名三兄弟的函数,找到后分析这个函数的引用,进而可以采取手段过掉签名验证。上面的apk和安卓逆向工具包有需要的可以加v:13140310004获取,自己也可以尝试动手分析一下,掌握原理,遇上别的apk也能过掉签名

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值