风绕柳絮轻敲雪 发表于 2019-12-7 15:43

破解某XX全能王的本地功能

本帖最后由 风绕柳絮轻敲雪 于 2019-12-9 12:14 编辑

1.直接签名安装,出现了如图所示的盗版提示



2.尝试在字符串中搜索该盗版提示,找到一个,复制其ID



3.DEX++编辑器里搜索该ID,找到其引用的地方,有两处(第三个在R类中,自动排除



4.分别点进去,都是调用了j这个方法来判断,为true也就是1就执行盗版提示


public static void a(@NonNull Context context) {
      if (g.j()) {
            Toast.makeText(context, context.getResources().getString(R.string.a_msg_pirate_app_prompt), 1).show();
      }
    }


5.跳转到j这个方法,修改如下,全都返回为零就行了,当然如果你有闲心你也可以关注一下b这个变量,它的值最终来源于scannercs这个so文件里的initEngine,进去看了一哈,原来是签名验证在so上,不过这里貌似不影响使用,就不用关注它了

public static boolean j() {
      return (b == 0 || b == -3) ? false : true;
    }

修改如下

sget v0, Lcom/intsig/camscanner/b/g;->b:I

if-eqz v0, :cond_b

sget v0, Lcom/intsig/camscanner/b/g;->b:I

const/4 v1, -0x3

if-eq v0, v1, :cond_b

const/4 v0, 0x0

return v0

:cond_b
const/4 v0, 0x0

return v0


6.点击升级按钮,它会跳转到升级到高级账户这个页面,我们依旧搜这个字符串



7.重复步骤二步骤三,找到几处引用的地方,主要看最后一处,看一下代码,最终是返回一个字符串对象


private static String a(Context context) {
      if (!u.d()) {
            return context.getResources().getString(R.string.a_label_upgrade_to_premium);
      }
      if (u.f()) {
            return context.getResources().getString(R.string.a_super_vip_desc);
      }
      return context.getResources().getString(R.string.a_label_premium_description);
    }


8.看一下f方法的代码,其实修改这个条件就够了,因为他要满足第一个

f方法

public static boolean f() {
      if (!d()) {
            return false;
      }
      Object obj = 1 == w.g() ? 1 : null;
      long h = w.h();
      Calendar instance = Calendar.getInstance();
      instance.set(2100, 1, 1);
      long timeInMillis = instance.getTimeInMillis() / 1000;
      if (obj == null || h <= timeInMillis) {                // w.g()为1或者h大于4102416000就为true      
            return false;
      }
      return true;
    }


9.跳转到d看看,出现了两种状况,去e看看,emmm,继续跳到f看看,f这代码有点熟悉,继续跳到b看看,再看看h方法

d方法

public static boolean d() {
      if (e() || 1 == w.g()) {
            return true;
      }
      return false;
    }

g方法

public static long g() {
      return y.a().b("qp3sdjd79xhdas02sd", 2);
    }

e方法

public static boolean e() {
      return 0 == w.f();
    }

f方法


    public static long f() {
      return y.a().b("tafdseddfeasfeafaewf", -1);
    }

h方法

public static long h() {
      return y.a().b("tkreds3sdvv22ccsx3xd3", 0);
    }

b方法

public final long b(String str, long j) {
      e();
      return this.b.getLong(str, j);
    }


10.这里区别开来和不区别开来也行,这样改满足了两个条件了,改的时候其实满足一个就行了,最后一个超级会员满不满足都行了,反正就是图个好看


public final long b(String str, long j) {
      if(str.equals("afdseddfeasfeafaewf"){
      return 0;
}
   if(str.equals("qp3sdjd79xhdas02sd"){
      return 1;
}
   else{
      e();
      return this.b.getLong(str, j);
}
    }
修改如下

invoke-direct {p0}, Lcom/intsig/utils/y;->e()V

   .line 166
   iget-object v0, p0, Lcom/intsig/utils/y;->b:Landroid/content/SharedPreferences;

   invoke-interface {v0, p1, p2, p3}, Landroid/content/SharedPreferences;->getLong(Ljava/lang/String;J)J

   move-result-wide p1

   const-wide/16 p1, 0x1//这里改为0或1都行,0就是高级会员,1就是超级会员

   return-wide p1

11.打包安装完事,当然某些联网功能是无效的,所以说是本地破解,仅限娱乐,没测试破解功能,自己动手自己去测试吧



由于论坛规定,所以不提供成品.......

x34178148 发表于 2019-12-7 21:38

风绕柳絮轻敲雪 发表于 2019-12-7 15:48
没试过 应该不能

扫出的照片弄到相册就可以分享了,不出QQ还是要绕步吧。

fengziliu0519 发表于 2019-12-12 22:20

夜郎国 发表于 2019-12-11 15:25
要是能分享到成品就好了

哈哈,如果放出成品,就失去了技术探索的过程呀。

peplu 发表于 2019-12-7 15:45

嗯,下载看看

xuanqi521 发表于 2019-12-7 15:45

请问扫描的照片用微信分享可以吗?有试过吗

风绕柳絮轻敲雪 发表于 2019-12-7 15:48

xuanqi521 发表于 2019-12-7 15:45
请问扫描的照片用微信分享可以吗?有试过吗

没试过 应该不能

xdans0n 发表于 2019-12-7 16:01

很好,赞一个

九眼莲 发表于 2019-12-7 16:07

则么没有下载链接?

li831203 发表于 2019-12-7 16:07

这个破解在线的功能有点不现实了,想用得爽估计还是得买

Lime 发表于 2019-12-7 16:26

链接呢 大大

入魔兔 发表于 2019-12-7 16:35

之前用的全能王水印是真的不舒服

kk1212 发表于 2019-12-7 16:55

楼主给个成品链接试试
页: [1] 2 3 4 5 6 7
查看完整版本: 破解某XX全能王的本地功能