|
|
免责声明:本文章仅供学习和研究用途,旨在学习安卓逆向工程的基本技术和操作流程,以提升个人技术能力。文章中的案例仅作为技术演示,所使用的任何具体应用软件均未透露关键信息,仅为学习目的选取。如有侵权,请联系本人或管理员处理
请回复查看,pdf文档免费送
pdf文档:https://sb-baidu-sb.lanzout.com/iM1bv2fs12ba
记录正文
直接签名后进入软件,跳出提示
dex直接搜字符串进行定位。Java代码如下
- private boolean nc() {
- ConfirmDialog confirmDialog;
- m mVar = new m(this, "SHA1");
- if (!mVar.b() && ((confirmDialog = this.j1) == null || !confirmDialog.Fb())) {
- ConfirmDialog c = e.c(this, "温馨提示", "您当前的安装包异常\n请重新下载官方版本", "我知道了", new d(this));
- this.j1 = c;
- if (c != null) {
- c.Ob(false, false).Sb(17, 17).Yb(Float.valueOf(18.0f), Float.valueOf(16.0f), Float.valueOf(17.0f), Float.valueOf(17.0f)).Ub((Float) null, Float.valueOf(8.0f));
- }
- }
- return mVar.b();
- }
复制代码 关键在b方法
- public final boolean b() {
- this.c = c();
- if (!TextUtils.equals(this.b, "SHA1") || !l0.g(this.c, this.d)) {
- if ((TextUtils.equals(this.b, "MD5") && l0.g(this.c, this.e)) || TextUtils.isEmpty(this.c)) {
- return true;
- }
- return false;
- }
- return true;
- }
复制代码
结合m类初始化的代码可以简单分析得出b字段用于存储签名对比的算法类型(MD5或SHA1),g方法是直接比较两个字符串是否相等。因此这里直接对b方法返回true
保存,安装测试
软件崩溃,logcat抓日志抓到信息如下
明显在lib...-security.so里面有签名验证,此外在java层被调用了getMD5Sign的native方法
一开始我直接在java层给调用getMD5Sign方法的地方直接传入MD5签名的字符串,结果还是崩溃,显示一个native方法出问题了,应该是so层有校验没通过
那就在so层看一下getMD5Sign方法
把lib...-security.so方法拖到ida里
搜字符串"getMD5Sign"看到了结果
两次交叉引用(ctrl+x)
进来后转伪c(F5)
关键在于v7,用来比较当前签名和存储的签名是否一致。当两个相同时,strcmp函数返回0,即v7为0。!v7就为1,就执行if里的代码,返回的就是v3而不是-1
因此此处直接force jump(强制跳转,等价于判断结果恒为真)到loc_4333c
hex变成了13 00 00 14,地址是432F0
打开MT进行16进制修改
保存,安装测试可以正常运行,不再崩溃
但有开屏广告
打开activity记录,发现先进入的splashactivity再进的mainactivity,我这里使用修改dex方式跳过splashactivity
因为先进入splashactivity,所以试着在com.Kingdee.Express.module.splash.SplashActivity搜代码mainactivity,发现没有结果
于是再退到com.Kingdee.Express.module.splash下搜,发现两个结果
进第一个
直接查找e字段的get调用,把全部改为true
进第二个
直接查找b字段的get调用,把全部改为false
d字段先不管,如果不可用的话再修改
保存,安装测试。发现进入主页面神速,直接跳过广告
完
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
-
查看全部评分
总评分:好评 +5
金币 +6
|