一、目標
今天我們的目標是某問答社區App的 x-zse-96
main.png
1:main
版本: v8.21.1
二、步驟
搜x-zse-96
常規做法是jadx打開apk,然后搜索x-zse-96。
神奇的是,居然沒有結果,這就有點意思了,App給我們加戲了,把一些明顯的字符串做了加密隱藏。
觀察共性
觀察一下,簽名有兩個共性
1、 都是 1.0_ 開頭
2、 后面接著的很像Base64
那就先從hook開頭開始吧。繼續用大海撈針法來撈開頭。
// 靠字符串去定位
var strCls = Java.use("java.lang.StringBuilder");
strCls.toString.implementation = function(){
var result = this.toString();
// console.log(result.toString());
if(result.toString().indexOf("1.0_") >= 0 )
{
console.log(result.toString());
var stack = threadinstance.currentThread().getStackTrace();
console.log("Rc Full call stack:" + Where(stack));
}
return result;
}
來跑一下。
show1.png
幸運的是,我們這次猜對了開頭,也猜對了結果。
下面的目標就是這個 com.zxxxu.android.net.d.i.e 了
show2.png
點這個encryp函數進去
public interface b {
byte[] encrypt(byte[] bArr);
}
發現b變量是個接口類型,所以我們還得知道它實際被賦值的變量是什么類型才可以。
打印類成員變量
這個我們會 http://91fans.com.cn/post/idlesignone/ 以前介紹過打印類的成員變量。
var requestCls = Java.use("com.zxxxu.android.net.d.i");
requestCls.e.implementation = function(a){
console.log(" ========== ");
var fields = Java.cast(this.getClass(),Java.use('java.lang.Class')).getDeclaredFields();
//console.log(fields);
for (var i = 0; i < fields.length; i++) {
var field = fields[i];
field.setAccessible(true);
var name = field.getName();
var value =field.get(this)
console.log("name:"+name+"\tvalue:"+value);
}
console.log(" ========== ");
var result = this.e(a);
return result;
}
結果出來了
rc1.png
1:rc1
這個類名出來了 -$$Lambda$AshC3KZBWneDDB5y10Ccx5ghIWw 看上去還是比較復雜的
rc2.png
這個 a.a 函數繼續往下找,最后就找到這里了
rc3.png
可以寫代碼去hook了, 從名稱上看大概率是 aes算法。而且除了明文還有兩個參數,那么大概率是key和iv了。
三、總結
App開始狡猾了,明顯的字符串做了加密,我們找起來就沒那么方便了。
關鍵點還是共性,只要有共性,就有線索了。
com.secneo.apkwrapper.H.d 這個函數大家可以分析下,它應該就是加密那個明顯字符串的。從它可以暴露出x-zse-96。
ffshow.jpeg
無人與問,但濁酒相呼,疏簾自卷,微月照清飲。