本文為看雪論壇優秀文章
看雪論壇作者ID:無造
前言這裡是2W班5月的習題。題目中對一個native函數進行了加密,導緻IDA無法看到運作時的代碼。加密方式來自于論壇比較久的文章ThomasKing大佬的簡單粗暴的so加解密實作 。照搬了大佬的代碼,然後修改了一下加密方式即可完成解密。
通過本題學習到了so檔案的格式解析,基礎的加解密思路。
解題過程
步驟1:嘗試用Fart脫殼
順利完成,查找相關dex
sailfish:/data/data/com.kanxue.test # grep -ril "MainActivity" ./*.txt
./2203744_classlist.txt
./2203744_classlist_execute.txt
拷貝出2203744大小的dex
步驟2:檢視Java層代碼OnCreate去綁定事件,test函數進行的字元串比較
步驟3:檢視so檔案中test的代碼addr_RegisterNatives: test
addr_RegisterNatives: (Ljava/lang/Object;)Z
addr_RegisterNatives func: 0x8dc5
test是動态注冊的,注冊位址是0x8dc5
反彙編代碼比較奇怪
檢視下sub_8930
這裡擷取so位址,然後查找ooxx函數的偏移
查找libnative-lib.so 記憶體中位址
看這段代碼和so檔案加密文章(https://bbs.pediy.com/thread-191649.htm)給出的demo非常像,隻是函數加密的方式不一樣,具體思路可以直接去檢視原帖。
步驟4:解密so檔案加密是找到函數偏移和長度,進行位運算,是以解密也就按照一樣的方式還原即可。
下圖是運作效果
解密後再次反編譯,解密方法參考文章給出的代碼,代碼在windows下讀取so檔案會出現讀取不準确,不知道為什麼。最終在ubuntu下運作正常。
直接比對的,沒加密。使用frida檢視1C04C就是kanxuetest。
輸入效驗正确。