孤云 发表于 2018-7-7 15:11

Root锁机破解教程,新手也能学会破解加密算法的锁机

本帖最后由 孤云 于 2018-7-7 16:00 编辑

经过上一次分析失败的我又回来了,由于我不是专业搞逆向的,就不解说那么详细了。
先说下这次的主要思路:主要就是把锁机的dex提取出来转成jar包,然后直接调用里面的方法就能算出密码了。
下面开始教程:
首先把锁机提取出来(怎么提取就不说了,上一篇有教程),接着拖进Android Killer,找入口

跟进去看看,

申明了几个全局变量,让后在下面进行赋值

这里就是一系列运算然后加密,就是解锁密码了
int i = (int)(Math.random() * 1000000) + 4;//生成一个6位的随机数然后+4
    int j = (int)(Math.random() * 1000000) + 5;//生成一个6位的随机数然后+5
    int k = (int)(Math.random() * 1000000) + 6;//生成一个6位的随机数然后+6
    this.a6 = mx6.Jem(mx6.Jem(mx6.Jem("СвОгСвПдСвкбСвПзСвОгСвПдСвкбСвПжСвОгСвПдСвкбСвПзСвОгСвПдСвкбСвПж")));//调用mx6里的Jem方法解密
    this.a7 = mx6.Jem(mx6.Jem(mx6.Jem("СвОгСвПдСвкбСвПзСвОгСвПдСвкбСгкгСвОгСвПдСвкбСвПзСвОгСвПдСвкбСгкг")));
    this.a8 = mx6.Jem(mx6.Jem(mx6.Jem("СвОгСвПдСвкбСвПзСвОгСвПдСвкбСвПзСвОгСвПдСвкбСвПзСвОгСвПдСвкбСвПз")));
    int m = 41779 + 46148 + 50517 - 59255 + 161 >> 2;//申明一个int类型的变量,然后经过一系列的运算后赋值给m
    int n = 41779 + 54886 + 46148 + 50517 + 178 >> 2;
    int i4 = 41779 + 46148 + 50517 + 195 >> 2;
    int i1 = 41779 + 46148 + 50517 + 212 >> 2;
    int i2 = 41779 + 46148 + 50517 + 229 >> 2;
    int i3 = (m - 6 - 4 - 5 - 4 + i4 + i1 + i2) * 2 * 3 * 4 * 5 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11;
    i4 = n + i1 - 6 + 4 + m + i4 + i2 ^ 0x0;
    int i5 = 4928 + i3 + i4 >> 9;
    long l1 = i3 + 46148 + 54886 + i2 + m + (i3 + i5 + i4 >> 2 ^ 0x9) ^ i;
    long l2 = i5 + n + i2 + 59255 + 50517 + 54886 ^ j;
    long l3 = i4 + i5 + i1 + m + 54886 + 59255 + 50517 + 41779 ^ k;
    this.a9 = (this.a6 + l1);//调用申明的成员属性然后加上l1在赋值给a9
    this.a10 = (this.a7 + l2);
    this.a11 = (this.a8 + l3);

这里就是判断然后进入下一层什么的
这里说明下this.val$梦想爸爸 = l1 ,this.val$破解者梦想操你妈 = l2 ,this.val$葫芦侠梦想草你妹 = l3,这里掉坑里去了,找半天没看到哪里赋值的,结果Android Killer 反编译的时候那些代码不见了,最后用手机MT管理器看到的...
if (this.val$crk.getText().toString().equals(String.valueOf(mx5.梦想66("" + this.val$梦想爸爸)))) //获取输入框的值 ,然后判断mx5.梦想66加密后的this.val$梦想爸爸如果相等就进入下一层
          {
            this.val$h.setText("当前层数:最后一层");//下一层显示的文字
            this.val$hh.setText("解锁30元");
            this.val$xlh.setText(mx3.jm("" + this.val$xlh1));
            this.val$Lt1.setBackgroundColor(-7829368);
            return;
          }
          if (this.val$crk.getText().toString().equals(String.valueOf(mx5.梦想6("" + this.val$破解者梦想操你妈))))
          {
            this.val$h.setText("最后一层,信不信由你");
            this.val$hh.setText("解锁50元");
            this.val$hhhh.setText("解开这一层手机就可以使用了");
            this.val$xlh.setText(mx3.jm("" + this.val$xlh2));
            this.val$Lt1.setBackgroundColor(-16776961);
            return;
          }
      } while (!this.val$crk.getText().toString().equals(String.valueOf(mx5.梦想6666("" + this.val$葫芦侠梦想草你妹))));


这是加密类,复制进eclipse报错,还要修复。这里就是采取的另一个方式了,把apk后缀改为zip然后解压,找到classes.dex然后用dex2jar把dex转换成jar文件。

dex2jar 链接:https://pan.baidu.com/s/1guW34V6yVHxHzInZyIYt6Q 密码:g7mv

接下来就好办了,把那些运算代码复制粘贴到eclipse里,在导入上面转的jar包,改一下代码运行就能算出密码了(代码写的查凑合着看吧)。
下面附上代码
public class Test{
          private String a10;
          private String a11;
          private String a6;
          private String a7;
          private String a8;
          private String a9;
      
      public static void main(String[] args) {
      String b[] = {"&","①","÷","∷","●","©","®","★","※","/"};//这个没啥用我就是拿来复制的
                Test t = new Test();
                String str = "①★/&①®";//这里是我测试的解密
                t.getPassword(str);
      }
      
      /**
         * 获取密码
         * @param str
         * @return
         */
      public void getPassword(String str){
            int i = Integer.valueOf(set(str));//第一层,把随机数改为序列号
            int j = Integer.valueOf(set(str));//第二层
            int k = Integer.valueOf(set(str));//第三层
            this.a6 = mx6.Jem(mx6.Jem(mx6.Jem("СвОгСвПдСвкбСвПзСвОгСвПдСвкбСвПжСвОгСвПдСвкбСвПзСвОгСвПдСвкбСвПж")));//11
            this.a7 = mx6.Jem(mx6.Jem(mx6.Jem("СвОгСвПдСвкбСвПзСвОгСвПдСвкбСгкгСвОгСвПдСвкбСвПзСвОгСвПдСвкбСгкг")));//22
            this.a8 = mx6.Jem(mx6.Jem(mx6.Jem("СвОгСвПдСвкбСвПзСвОгСвПдСвкбСвПзСвОгСвПдСвкбСвПзСвОгСвПдСвкбСвПз")));//33
            int m = 41779 + 46148 + 50517 - 59255 + 161 >> 2;
            int n = 41779 + 54886 + 46148 + 50517 + 178 >> 2;
            int i4 = 41779 + 46148 + 50517 + 195 >> 2;
            int i1 = 41779 + 46148 + 50517 + 212 >> 2;
            int i2 = 41779 + 46148 + 50517 + 229 >> 2;
            int i3 = (m - 6 - 4 - 5 - 4 + i4 + i1 + i2) * 2 * 3 * 4 * 5 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11;
            i4 = n + i1 - 6 + 4 + m + i4 + i2 ^ 0x0;
            int i5 = 4928 + i3 + i4 >> 9;
            long l1 = i3 + 46148 + 54886 + i2 + m + (i3 + i5 + i4 >> 2 ^ 0x9) ^ i;
            long l2 = i5 + n + i2 + 59255 + 50517 + 54886 ^ j;
            long l3 = i4 + i5 + i1 + m + 54886 + 59255 + 50517 + 41779 ^ k;
            this.a9 = (this.a6 + l1);
            this.a10 = (this.a7 + l2);
            this.a11 = (this.a8 + l3);
            String s = String.valueOf(mx5.梦想66("" + l1));//调用的jar包的方法
            System.out.println("第一层密码:" + s);
            String s2 = String.valueOf(mx5.梦想6("" + l2));
            System.out.println("第二层密码:" + s2);
            String s3 = String.valueOf(mx5.梦想6666("" + l3));
            System.out.println("第三层密码:" + s3);
      }
      
      /**
         * 序列号替换
         * @param s
         * @return
         */
      public static String set(String s)
    {
      String[] a=         {"0","1","2","3","4","5","6","7","8","9"};
      String b[] = {"&","①","÷","∷","●","©","®","★","※","/"};
                String sss=s;
      for(int i=0;i<10;i++)
      {
            sss=sss.replaceAll(b,a).toString();
      }
      StringBuffer sb=new StringBuffer(sss);
      String ss=sb.toString();
      return new String(ss);
    }      
      
}
解说的有点不清晰,有什么不懂的地方可以问我,哪里说得不对也可以指出。
下面是我的测试截图,这样就解开了。

轻描淡写9714 发表于 2018-7-8 08:23

孤云 发表于 2018-7-7 20:02
说一下哪里不明白,我在仔细解释下

this.a6 = mx6.Jem(mx6.Jem(mx6.Jem("СвОгСвПдСвкбСвПзСвОгСвПдСвкбСвПжСвОгСвПдСвкбСвПзСвОгСвПдСвкбСвПж")));//11
            this.a7 = mx6.Jem(mx6.Jem(mx6.Jem("СвОгСвПдСвкбСвПзСвОгСвПдСвкбСгкгСвОгСвПдСвкбСвПзСвОгСвПдСвкбСгкг")));//22
            this.a8 = mx6.Jem(mx6.Jem(mx6.Jem("СвОгСвПдСвкбСвПзСвОгСвПдСвкбСвПзСвОгСвПдСвкбСвПзСвОгСвПдСвкбСвПз")));//33
就这三行代码,不知道是要做什么功能用,没有接触过这种类型,能解释一下么?

debug_cat 发表于 2018-8-16 10:31

牛逼啊,这样分析很到位,如果作者把加解密的东西放so里面用native来做,估计难度就很高,不过这个能破解已经很厉害了。牛逼,楼主有没有兴趣破解另一个锁机软件啊。我昨天手机版被锁,但我用adb shell su进入把apk删除了,成功解锁,但是我想通过破解他加密算法来破解,就像本文一样,但是目前破解过程遇到困难,好无头绪了。链接: https://pan.baidu.com/s/1qIDQkmiP5ezQjZOZhBTUlQ 密码: wj77;如果有进展记得发帖分享哦;千万别用真机,无root也能锁住

孤云 发表于 2018-7-7 15:23

正在继续编辑,稍等

MYLQG2ZHX 发表于 2018-7-7 15:36

不明觉厉

Ocean老班长 发表于 2018-7-7 15:46

我们这些小白看不懂哇   暴力解锁吗?

eilljs 发表于 2018-7-7 15:49

一直不懂锁别人手机的是什么想法

孤云 发表于 2018-7-7 15:52

Ocean老班长 发表于 2018-7-7 15:46
我们这些小白看不懂哇   暴力解锁吗?

很简单的,会Java基础都能学会破解

天道法海 发表于 2018-7-7 16:07

- -大佬下次能不能出个教程啊?这图文。。。。没看明白。。。。。

kumwingchiu 发表于 2018-7-7 16:46

先学习一下吧!应该学不会

emin199 发表于 2018-7-7 16:48

没看明白!!!

湫兮如风丶 发表于 2018-7-7 16:51

2333葫芦侠的锁机软件吗
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: Root锁机破解教程,新手也能学会破解加密算法的锁机