逆向学习笔记: APK过签名包java校验(一)

发布于:2023-02-16 ⋅ 阅读:(915) ⋅ 点赞:(0)

什么是签名包校验?

签名包校验就是重新打包apk以后,签名会发生变化。原始apk安装到手机上可以正常打开,通过androidkiller重新打包成apk以后,无法打开。

使用到的apk:

链接:https://pan.baidu.com/s/1IOqySzBazEgqpejzIzFDDA 
提取码:z6tt 
--来自百度网盘超级会员V1的分享

 

 

如何破解java层签名包校验?

Step 1: 搜索关键字

一般来说定位方法是搜索以下关键字:

1.  signatures (结果最多)

2. getPackageManager (结果较多)

3.getPackageInfo (结果较多)

4.killProcess  (最少)

Step 2:插入print trace

通过比较结果,kill process最少,可以逐个查看逻辑,当然最简单的方法是插入print trace

new-instance v0, Ljava/lang/Exception;

const-string v1, "print trace"

invoke-direct {v0, v1}, Ljava/lang/Exception;-><init>(Ljava/lang/String;)V

invoke-virtual {v0}, Ljava/lang/Exception;->printStackTrace()V

找到每个kill process所处的函数,在函数定义的.prologue后面添加如print trace代码,比较多,耐心的都添加上。

 Step 3: 重新打包apk,在手机上运行查看apk日志

在手机上apk如约崩溃,ddms上打印的log,找到最后一个print trace, 可以看到, 最后调用killprocess的是shuqi.app.ShuqiApplication$3.handleToken.

 

 Step 4: 分析该函数逻辑

从函数中我们看到了其他要搜索的内容,因此佐证保护逻辑一定在这个函数中。

invoke-virtual {v1}, Landroid/content/Context;->getPackageName()Ljava/lang/String;

.invoke-virtual {v0}, Landroid/content/Context;->getPackageManager()Landroid/content/pm/PackageManager;

invoke-virtual {v0, v1, v2}, Landroid/content/pm/PackageManager;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo

iget-object v0, v0, Landroid/content/pm/PackageInfo;->signatures:[Landroid/content/pm/Signature;

smali中的判断主要有以下几种: 

if-eq, if-ne,if-lt, if-ge,if-gt... 我就不一一解释了,基本看到了就知道啥意思,g是great, l是less

"if-eq vA, vB, :cond_" 如果vA等于vB则跳转到:cond_
"if-ne vA, vB, :cond_" 如果vA不等于vB则跳转到:cond_
"if-lt vA, vB, :cond_" 如果vA小于vB则跳转到:cond_
"if-ge vA, vB, :cond_" 如果vA大于等于vB则跳转到:cond_
"if-gt vA, vB, :cond_" 如果vA大于vB则跳转到:cond_
"if-le vA, vB, :cond_" 如果vA小于等于vB则跳转到:cond_
"if-eqz vA, :cond_" 如果vA等于0则跳转到:cond_
"if-nez vA, :cond_" 如果vA不等于0则跳转到:cond_
"if-ltz vA, :cond_" 如果vA小于0则跳转到:cond_
"if-gez vA, :cond_" 如果vA大于等于0则跳转到:cond_
"if-gtz vA, :cond_" 如果vA大于0则跳转到:cond_
"if-lez vA, :cond_" 如果vA小于等于0则跳转到:cond_



作者:WilburLi
链接:https://www.jianshu.com/p/2f2fa49c1f53
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

killProcess前面有一个判断,现在v1中写了一个值,这个值就是签名的值,比较v1 与v0,如果相同跳到cond_0. 如果不同就继续执行到killprocess。

Step 5:破解逻辑

基于Step 4的分析,只要将eq改成ne就行,这样就不会跳到kill了,因为我们肯定会改变签名。

 Step 6: 大功告成,感谢!

重新打包,安装,程序并没有因为重签名崩溃。完结,撒花!


网站公告

今日签到

点亮在社区的每一天
去签到