本帖最后由 孤云 于 2018-7-7 16:00 编辑
经过上一次分析失败的我又回来了,由于我不是专业搞逆向的,就不解说那么详细了。
先说下这次的主要思路:主要就是把锁机的dex提取出来转成jar包,然后直接调用里面的方法就能算出密码了。
下面开始教程:
首先把锁机提取出来(怎么提取就不说了,上一篇有教程),接着拖进Android Killer,找入口
跟进去看看,
申明了几个全局变量,让后在下面进行赋值
这里就是一系列运算然后加密,就是解锁密码了
[Java] 纯文本查看 复制代码 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管理器看到的...
[Java] 纯文本查看 复制代码 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包,改一下代码运行就能算出密码了(代码写的查凑合着看吧)。
下面附上代码
[Java] 纯文本查看 复制代码 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[i],a[i]).toString();
}
StringBuffer sb=new StringBuffer(sss);
String ss=sb.toString();
return new String(ss);
}
}
解说的有点不清晰,有什么不懂的地方可以问我,哪里说得不对也可以指出。
下面是我的测试截图,这样就解开了。
|