天天看點

.so檔案反編譯_初試so檔案解密

本文為看雪論壇優秀文章

看雪論壇作者ID:無造

前言

這裡是2W班5月的習題。題目中對一個native函數進行了加密,導緻IDA無法看到運作時的代碼。加密方式來自于論壇比較久的文章ThomasKing大佬的簡單粗暴的so加解密實作 。照搬了大佬的代碼,然後修改了一下加密方式即可完成解密。

通過本題學習到了so檔案的格式解析,基礎的加解密思路。

解題過程

步驟1:嘗試用Fart脫殼
.so檔案反編譯_初試so檔案解密

順利完成,查找相關dex

sailfish:/data/data/com.kanxue.test # grep -ril "MainActivity" ./*.txt

./2203744_classlist.txt

./2203744_classlist_execute.txt

拷貝出2203744大小的dex

步驟2:檢視Java層代碼
.so檔案反編譯_初試so檔案解密

OnCreate去綁定事件,test函數進行的字元串比較

步驟3:檢視so檔案中test的代碼

addr_RegisterNatives: test

addr_RegisterNatives: (Ljava/lang/Object;)Z

addr_RegisterNatives func: 0x8dc5

test是動态注冊的,注冊位址是0x8dc5

.so檔案反編譯_初試so檔案解密

反彙編代碼比較奇怪

檢視下sub_8930

.so檔案反編譯_初試so檔案解密

這裡擷取so位址,然後查找ooxx函數的偏移

.so檔案反編譯_初試so檔案解密

查找libnative-lib.so 記憶體中位址

.so檔案反編譯_初試so檔案解密

看這段代碼和so檔案加密文章(https://bbs.pediy.com/thread-191649.htm)給出的demo非常像,隻是函數加密的方式不一樣,具體思路可以直接去檢視原帖。

步驟4:解密so檔案

加密是找到函數偏移和長度,進行位運算,是以解密也就按照一樣的方式還原即可。

下圖是運作效果

.so檔案反編譯_初試so檔案解密

解密後再次反編譯,解密方法參考文章給出的代碼,代碼在windows下讀取so檔案會出現讀取不準确,不知道為什麼。最終在ubuntu下運作正常。

.so檔案反編譯_初試so檔案解密

直接比對的,沒加密。使用frida檢視1C04C就是kanxuetest。

輸入效驗正确。