先直接看這個so庫:
拖入IDA靜態(tài)看一下:發(fā)現(xiàn)看不到什么信息,原因很簡單,因為被處理了;
怎么辦呢?通過010進行對so簡單修改:
拖入IDA,使用ELF.b進行識別:
識別效果:
頭里面描述了有關(guān)節(jié)的信息:
先修改節(jié)的偏移:
這個三個:
保存之后,然后繼續(xù)拖入IDA:發(fā)現(xiàn)沒報異常,可以識別一些東西:
為什么這樣就能成功呢?因為我們把節(jié)有關(guān)的信息去除之后,他開始解析段的信息;
看導(dǎo)出函數(shù)列表,發(fā)現(xiàn)函數(shù)名稱也是被處理過的,但是JNI_Load還是可以看到的:
雙擊過來,還是可以看到一些信息的;
ctrl+S ,來到這里,看一下:
點擊sub_1AD8:發(fā)現(xiàn)也沒什么信息~
直接F5,看JNI_Load的信息:
修改一下參數(shù):
點進去看一下下面的那個函數(shù)也看不出來什么;
回到匯編窗口:
雙擊進去后:
繼續(xù)跟:
過來后:
發(fā)現(xiàn)是一個switch循環(huán);
F5一下:
分支挺長的,看不出來啥;直接動態(tài)分析;
這個函數(shù)的分析,同樣的在open函數(shù)下斷:
F9之后,加載進來這個so:
linker處下斷:
libdvm下斷:
F9后,linker處斷下:
F7進去,發(fā)現(xiàn)沒什么;
繼續(xù)F9linker斷下,然后F7:
F7往下走,發(fā)現(xiàn)有個函數(shù):
進入后來到libdvm.so,與getenv有關(guān);
回來后,繼續(xù)F7,這里有個函數(shù):
F7進去:往下跟:
過來后:
F7往下,這里有個函數(shù),
進去:F7往下,發(fā)現(xiàn)這里是一個循環(huán):一直比較R2和R3的值;
F4后F7往下走,來到了跳轉(zhuǎn)表這里:
繼續(xù)F7往下,來到了case26分支:
一路F7往下,這里有一個BLX函數(shù):
F7往下,同步R1寄存器;發(fā)現(xiàn)有關(guān)鍵字眼;
再往下是一個循環(huán),同時同步R3寄存器,是在解密字符串:
再往下,又一個亦或循環(huán):通過R2寄存器
繼續(xù)F7,
繼續(xù)F8往下:來到這里:
繼續(xù)F7往下;這里是一個循環(huán),一直在讀取,然后一直比較R0的值;
如果這里BEQ相等的話,就會直接跳到這里:
上面的是從linker到JNI_Load,說明在linker里面沒有進行操作,所以,可以換一種,直接在libdvm哪里找到JNI_onload也行;
重新使用一種方法,使用open函數(shù),往上回溯;
跳到open函數(shù),?然后F2下斷,然后F9運行,然后Ctrl+F7回溯:
同步R0窗口,出現(xiàn)這個,說明在遍歷tracepid,
繼續(xù)回溯:
繼續(xù)回溯:
為什么之前又一次運行道這里程序就崩潰了?
原因是程序此時R1寄存器的值:
這個值什么意思?
我們先把4A24轉(zhuǎn)化成10進制:18980
執(zhí)行一個adb命令:這個就是當(dāng)前as的進程;說明他當(dāng)前已經(jīng)檢測到我們在調(diào)試該程序;
所以我們需要把這個反調(diào)試干掉:
也就是說,case26就是反調(diào)試的分支;
改了之后繼續(xù)往上回溯:
繼續(xù)回溯,此時來到這個位置;
繼續(xù)?往上回溯:
此時R0和0進行比較,此時R0的值依然是as的進程號;
如果不相等,就跳轉(zhuǎn)到這里
點進去,發(fā)現(xiàn)是kill:
會來,往上p一下,是一個函數(shù),
進去:p一下:
明顯和這個就是反調(diào)試的邏輯,這個分支代碼比較多;
我們怎么修改呢,只需要讓這個函數(shù)返回固定的值即可;
修改代碼之前,先把這里置零;
同步一下反匯編窗口,點擊前面的這里會顯示下面對應(yīng)的十六進制:
這個是arm指令,
執(zhí)修改指令:第一條:
選取后8位,F(xiàn)2進行修改:
繼續(xù)修改第二條:
修改后效果:
過掉反調(diào)試后,在mmap處下斷:mmap尾部處也下一個斷點;
好,F(xiàn)9運行程序:使其在mmap處函數(shù)段下來;
這里mmap如何查看呢?至二級F9運行到mmap函數(shù)尾部,然后F7進去下一步,就是不同的函數(shù)調(diào)用的地方、遇到libdvm.so的不用管,h直接F9繼續(xù)在mmap處蹲下,只觀察jiagu.so;
注意在mmap處的操作:不能直接F9從頭部執(zhí)行尾部斷下,要單步跟一下,即將進去的so也要單步跟一半,然后在F9;
繼續(xù)執(zhí)行上面操作首先會在這里出現(xiàn)apk信息:
繼續(xù)操作,出現(xiàn)了這個:
繼續(xù):下面R0窗口出現(xiàn)了dey036;
繼續(xù)操作,這里出現(xiàn)了與dex有關(guān)的信息:
看他地址,我們來到他的區(qū)間:
過來后,這幾就是他解密后的dex
這里是這個dex文件的大?。?/p>
知道起始地址和大小后,使用腳本:
dump可能需要時間;
也就是說,出現(xiàn)相關(guān)dex文件的時候,如果沒有出現(xiàn)太多信息,我們可以ctrl+s查看模塊信息,一般他會把dex相關(guān)信息放到其他區(qū)域;
一般會把解密后的dex放到內(nèi)存里面,比如這個是放在debug里面:
好,找到dump出來的文件;
拖入jdax,這就是一些相關(guān)的代碼;
點看看一下相關(guān)的邏輯,發(fā)現(xiàn)都有,說明脫殼挺成功的
轉(zhuǎn)載請注明出處,或+3526762131