vmp
vmp調用api的時,會跳出vm,所以可以不關注vm邏輯運算,直接追蹤vm調用用了哪些api,從而分析殼,從jni_onload中一步步跟進在_Z10__fun_a_18Pcj中文件偏移0x0000FF00和0x00010060 處是vm函數調用,在此下斷。
軟中斷
由於api有可能會被下斷,所以可以採取軟中斷方式實現系統調用,arm下是svc,等ida解析完成so,搜索這條指令,會發現有open、mprotect還有個syscall。
反調試
tracerid
0x6850 打開/proc/self/status文件,獲取tracerid,修改讀取的內容,在讀到tracerid時修改爲0
時間檢測
0x6C9C 時間差大於3,則退出
rtld_db_dlactivity
0x00024F4 rtld_db_dlactivity這個函數默認情況下爲空函數,這裏的值應該爲0,而當有調試器時,這裏會被改爲斷點指令,所以可以被用來做反調試。在函數sub_24F4中,libjiagu.so查找rtld_db_dlactivity函數的地址的,獲取到rtld_db_dlactivity的地址,將其修改爲nop指令0x46C0。
so動態加載
so從內存中加載,肯定需要mprotect賦予執行權限,之前已經分析過svc實現mprotect,所以在mprotect時找到代碼段,從內存中dump出以下二進制文件如下。
對比正常的elf頭
發現出現很多0x4f,嘗試與0x4f異或,可以直接解出elf頭,用010editor 解析出錯,說明dump的尚不完整,於是在沿着內存dump下去,直至能夠成功解析。
ida打開完整的so,沒有報錯。
jni動態註冊,都在第二個so中,後面的動態加載dex文件基本上沒什麼區別。