GuXing 发表于 2021-7-20 17:03

简单分析全局负一屏解锁高级版功能


> 这是一个可以在任何应用界面打开的负一屏工具,你可以添加常用的应用,快捷方式,网址,图片,联系人以及小工具,当然你也可以从你的系统小部件中选择你想要的任何部件添加上去,只需轻轻一滑,一切尽在眼前

---


前段时间上论坛发现我的帖子和头像都不见了,当时也没太在意,最近看到说头像不见了是因为一级用户不允许上传头像,升级又需要积分,只好发俩帖子来混混积分了

---



### 0、用到的工具:

androidKiller

jadx-gui

DDMS

ida



如果本篇帖子中有什么错误、不足、需要指正的、或者遗漏的地方,热烈欢迎大家,在评论区留言

---

先把软件签名打开看看有没有什么问题,发现启动后负一屏界面不显示东西,也添加不了东西


### 1、过签名

在dex搜索`signatures`,获取签名但没有任何判断,猜测可能在so文件中做校验


IDA加载`libbase.so`文件,`shift+f12`打开字符串窗口,搜索`signatures`


双击进入查看引用函数


`f5`查看伪代码,但这伪代码看的有些许难受



我们找到函数第一个形参,按`y`,把数据类型修改为`JNIEnv*`,这样看起来就舒服多了



简单看了一下,发现函数最终返回一个`bool`型变量`v40`,`v40`在函数开头和判断完赋值,我们可以把开头的`v40`赋值为1,然后不让他判断了




`ctrl+alt+k`打开`keypatch`修改汇编保存;




当然也可以简单的修改为

```
MOV.W        R0, #1
BX        LR
```

---

把so文件塞回apk,测试可用

点击付费,提示:`您还没有激活高级版,请到【关于】中点击获取`


### 2、解锁付费功能

那我们到`Androidkiller`中所搜这个字符串,什么都没有,字符串似乎被加密或者放在so中了,用DDMS分析一下,toast是`Oo00O0oo.onClick`调用`O0oOOo0o.Oo0O00Oo`弹出的




进入`Oo00O0oo.onClick`,这个弹窗是根据`this.Ooo00OOO`判断的,按住`ctrl`跟进去,发现`this.Ooo00OOO`是由`Ooo00OO0.Ooo000Oo()`的值确定的,再次跟进去,把这个函数的返回值改为返回`true`





再次打包,其他的都能使用了,但还有一个问题,就是选择`新建页面`的时候没有任何反应


那就找一下这个点击事件,分析一下

DDMS分析所得点击事件在`com.example.xf.negativeonescreen.pro.O0OOOo00`类中,根据传入参数类型找到调用的方法在`com.example.xf.negativeonescreen.pro.O0OOOo0o`类,又是调用方法,继续跟进






最终到达这个地方,可以看出调用函数判断,不为true则什么都不干,问题可能就出现在这里,跟进判断的函数


发现是native层的函数,看了下调用这个函数有几处,直接改so文件吧


再次载入`libbase.so`文件,发现输出函数并没有我们的这个函数,可能是动态注册,找到`JNI_OnLoad`函数




根据java方法名我们找到`isActivated`,进去,这个函数在这里做各种验证

```
int __fastcall isActivated(JNIEnv *a1, int a2, int a3)
v12 = 1;
v11 = (*a1)->NewStringUTF(a1, "sign");
v10 = 0;
v9 = 0;
v8 = (void *)j_getLocalDeviceId(a1, a2, a3);
if ( j_isEmpty(a1, v8) )
{
    v12 = 0;
}
else
{
    v9 = (void *)j_getStringPreference(a1, a3, v11);
    if ( j_isEmpty(a1, v9) )
    {
      v12 = 0;
    }
    else
    {
      v10 = (void *)j_makeMD5(a1, v8);
      if ( j_equals(a1, v10, v9) )
      {
      v7 = (*a1)->NewStringUTF(a1, "info");
      v6 = (void *)j_getStringPreference(a1, a3, v7);
      v5 = (void *)j_getDeviceInfo(a1);
      if ( !j_equals(a1, v6, v5) )
      {
          v4 = (*a1)->NewStringUTF(a1, "nos_count");
          j_putStringPreference(a1, a3, v4);
          v12 = 0;
          (*a1)->DeleteLocalRef(a1, v4);
      }
      (*a1)->DeleteLocalRef(a1, v7);
      (*a1)->DeleteLocalRef(a1, v6);
      (*a1)->DeleteLocalRef(a1, v5);
      }
      else
      {
      v12 = 0;
      }
    }
}
(*a1)->DeleteLocalRef(a1, v11);
(*a1)->DeleteLocalRef(a1, v8);
(*a1)->DeleteLocalRef(a1, v10);
(*a1)->DeleteLocalRef(a1, v9);
return v12;
```

最后还是返回`bool`型,我们简单的改为上面讲的

```
MOV.W        R0, #1
BX        LR
```



---



塞回去,打包,测试,可用

GuXing 发表于 2021-8-24 21:08

17628635215 发表于 2021-8-24 18:18
还有一个问题,我就差最后一步了,你最后的那个返回值为1的代码是怎么做修改的

用keypatch修改成:
mov r0,0x1
bx lr

用16进制修改为:
4FF00100
7047

GuXing 发表于 2021-8-12 21:56

陈子墨M 发表于 2021-8-11 15:58
可以分享一个成品吗   大佬

我看以前的成品分享都被删了,估计是不让分享成品了,想用的话自己跟着教程走一遍吧。

GuXing 发表于 2021-7-21 14:59

看完可以点个免费评分吗,多谢{:1_893:}

秋神紫羽 发表于 2021-7-21 19:45

GuXing 发表于 2021-7-21 14:59
看完可以点个免费评分吗,多谢

应该是不要诱导评分{:1_905:}

正己 发表于 2021-7-21 20:42

多出点教程,吾爱破解论坛有你更精彩!{:17_1068:}

芽衣 发表于 2021-7-21 21:02

这个软件是什么来着??我之前好像用过。

GuXing 发表于 2021-7-21 21:36

秋神紫羽 发表于 2021-7-21 19:45
应该是不要诱导评分

我这不算诱导吧,评不评全靠自愿,也没说评完怎样怎样{:1_904:}

GuXing 发表于 2021-7-21 21:42

芽衣 发表于 2021-7-21 21:02
这个软件是什么来着??我之前好像用过。

可以随时调出来一个负一屏的软件,有时候挺方便的

GuXing 发表于 2021-7-21 21:43

正己 发表于 2021-7-21 20:42
多出点教程,吾爱破解论坛有你更精彩!

搞来搞去感觉也没啥可发的:rggrg

正己 发表于 2021-7-21 22:52

GuXing 发表于 2021-7-21 21:43
搞来搞去感觉也没啥可发的

来点协议分析{:17_1061:}

bjxiaoyao 发表于 2021-7-21 23:05

内容精彩,感谢分享。
页: [1] 2 3
查看完整版本: 简单分析全局负一屏解锁高级版功能