將殼拖入AK中分析,入口點已經修改成了StubApplication
調用了方法attachBaseContext
這個方法比onCreate調用的更早,很多殼會在這個方法中對原始程序進行還原
除此之外還加載了mobisec.so,查看lib文件夾下的so文件可以找到這個so文件
用IDA打開libmobisec後找到Jni_Onload,導入jni.h中的結構體,F5後重新註釋Jni_Onload。
可以看到函數調用了FindClass方法,這個方法是在動態註冊時使用的,用於找到class
要找的class名爲com/ali/mobisecenance/StubApplication
有了class,就可以對其內部的方法進行註冊
static int registerNativeMethods(JNIEnv* env,
const char* className,
JNINativeMethod *gMethods,
int numMethods)
{
jclass clazz;
clazz = env->FindClass(className);
if(clazz == NULL) {
return JNI_FALSE;
}
if(env->RegisterNatives(clazz, gMethods, numMethods) < 0) {
return JNI_FALSE;
}
return JNI_TRUE;
}
在函數的後半段看到off_54010,跳轉過去查看
看到幾個jar,懷疑是原始文件數據,殼通過這幾個文件將原始程序在內存中進行還原
查看assets文件夾發現cls.jar和fak.jar
除此之外還看到了對attachBaseContext和onCreate進行了動態註冊
跳轉到sub_24d3c+1處查看attachBaseContext方法,主要函數有以下幾個:
1.init_classes函數主要對加載器等進行初始化,然後一堆存儲地址之類的操作
2.parse_dex是對dex文件進行解碼然後調用
內部會調用openWithHeader,並將cls.jar傳進去
openWithHeader內部主要是對dex文件進行解密操作
執行完以後,v53指向解密的dex文件
此時將這一塊內存dump出來就是解密的dex文件了
運行腳本
static main(void)
{
auto i,begin,end,len,fp;
fp = fopen("e:\\dump.dex","wb");
begin = 0xa98a3010;
len = 0x941fc;
end = begin + len;
for(i=begin;i<end;i++)
fputc(Byte(i),fp);
}
dump文件的長度通過dex文件格式可知,0xa98a3030處是fileSize
把dump出來的文件使用JEB打開,都沒有問題
如果發現dump出來的dex文件反編譯沒有代碼,只有函數聲明,說明沒有dump完整,碰到這種情況,通常是後面對dex文件進行了patch,也就是說需要dump的是後面解析出來的dex文件。如果dump出來發現dex文件無法識別,需要對dex進行修復,這種情況一般是dump的長度不夠,通過在IDA中ctrl+s找到dex後面的段,計算總長度重新dump即可。
將dex文件反編譯,覆蓋到反編譯後apk的smali文件夾下(原來的文件需要刪除),將AndroidManifest.xml中的殼入口刪除,重新編譯,即可運行。
可能是apk過於久遠,所以在加殼狀態下程序無法運行,可見加過殼的程序的穩定性是個問題,脫殼後重新編譯的apk可以正常運行。
樣本:
鏈接:https://pan.baidu.com/s/13cBpJ9pUo5Wc9yq4mwmmtg
提取碼:8r28