整理资料,发现上次MSC第四题没爆,那就爆一下吧。
-----------------------------------------------------------------------
0x01 脱壳:
脱壳方法差不多,不过脱壳出来直接baksmali发现有错误,是StubRuntimeException annotation有误。
既然是StubRuntimeException有问题,那么直接赋值一个脱壳之前的StubRuntimeException.smali过来。重建dex成功。
0x02 分析:
从mann入口,btn设置e方法:
public void onClick(View arg8) {
bKn.b(bKn.a());//垃圾方法
this.b.b.setEnabled(false);
try {
this.b.a.setText("");
}
catch(Exception v0) {
goto label_26;
}
try {
this.b.c.setText(2130968577); // Tv赋值btn
}
catch(Exception v0) {
try {
new Timer().schedule(new f(this, this.a.getText().toString()), 2000);//开始检测。
}
catch(Exception v0) {
label_26:
throw new RuntimeException();
}
}
}
public void run() {
bKn.b(bKn.a());
try {
if(Build$VERSION.SDK_INT >= 10) {
if(!Debug.isDebuggerConnected()) { //检测调试状态,直接patch
goto label_13;
}
Main.a(this.b.b).sendEmptyMessage(1);
}
else {
label_13:
ali$a.M$j(this.a.getBytes("utf-8"), 48, Main.a(this.b.b)); //根据参数,猜测其直接发送message返回结果。
}
return;
}
catch(Exception v0) {
throw new RuntimeException();
}
}
动态跟踪M$j方法,发现其通过load pc 跳转到:0x80C562A0,真正入口点。
代码也跟之前写的第四题混淆类似。
....
跟踪发现其反射调用bh的a方法:
public static byte[] a(byte[] arg4, int arg5) { // 直接传入参数
bKn.b(bKn.a());
int v0 = arg5 + 1;
int v2 = v0 + 1;
int v1 = v2 - 1;
byte[] v0_1 = x.a(p.a(cC.a(cd.a(arg4, arg5), v0), v2), v1);
v2 = v1 - 1; // v2 = arg5
v0_1 = ali$a.M$d(v0_1, v1); // v1 = arg5 + 1
v1 = v2 + 1;
v0_1 = x.a(aS.a(v0_1, v2), v1); // // v1 = arg5 + 1
v2 = v1 + 1;
return cC.a(cd.a(ali$a.M$z(v0_1, v1), v2), v2 + 1);
}
跟踪M$d方法,同样混淆,其结果是:arg2[3] += 8;
之后跟踪M$z,发现其根本修改byte[]数据,仅仅跟一个"aJTCZnf6NyBPYJfbrBuLu0wOhRFbPtvqpYjiby5J81M=" 比较,然后设置了一个变量的值。
猜测即为返回值。故直接全速运行,得到正确结果,证明了猜想。 cd.a和cC.a方法根本没用。
编写解码算法,得到结果:alibaba2345ba