整理資料,發現上次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