先直接看這個(gè)so庫:
拖入IDA靜態(tài)看一下:發(fā)現(xiàn)看不到什么信息粪薛,原因很簡單悴了,因?yàn)楸惶幚砹耍?/p>
怎么辦呢?通過010進(jìn)行對so簡單修改:
拖入IDA违寿,使用ELF.b進(jìn)行識別:
識別效果:
頭里面描述了有關(guān)節(jié)的信息:
先修改節(jié)的偏移:
這個(gè)三個(gè):
保存之后湃交,然后繼續(xù)拖入IDA:發(fā)現(xiàn)沒報(bào)異常,可以識別一些東西:
為什么這樣就能成功呢藤巢?因?yàn)槲覀儼压?jié)有關(guān)的信息去除之后搞莺,他開始解析段的信息;
看導(dǎo)出函數(shù)列表菌瘪,發(fā)現(xiàn)函數(shù)名稱也是被處理過的腮敌,但是JNI_Load還是可以看到的:
雙擊過來,還是可以看到一些信息的俏扩;
ctrl+S ,來到這里糜工,看一下:
點(diǎn)擊sub_1AD8:發(fā)現(xiàn)也沒什么信息~
直接F5,看JNI_Load的信息:
修改一下參數(shù):
點(diǎn)進(jìn)去看一下下面的那個(gè)函數(shù)也看不出來什么录淡;
回到匯編窗口:
雙擊進(jìn)去后:
繼續(xù)跟:
過來后:
發(fā)現(xiàn)是一個(gè)switch循環(huán)捌木;
F5一下:
分支挺長的,看不出來啥嫉戚;直接動態(tài)分析刨裆;
這個(gè)函數(shù)的分析澈圈,同樣的在open函數(shù)下斷:
F9之后,加載進(jìn)來這個(gè)so:
linker處下斷:
libdvm下斷:
F9后帆啃,linker處斷下:
F7進(jìn)去瞬女,發(fā)現(xiàn)沒什么;
繼續(xù)F9linker斷下努潘,然后F7:
F7往下走诽偷,發(fā)現(xiàn)有個(gè)函數(shù):
進(jìn)入后來到libdvm.so,與getenv有關(guān)疯坤;
回來后报慕,繼續(xù)F7,這里有個(gè)函數(shù):
F7進(jìn)去:往下跟:
過來后:
F7往下压怠,這里有個(gè)函數(shù)眠冈,
進(jìn)去:F7往下,發(fā)現(xiàn)這里是一個(gè)循環(huán):一直比較R2和R3的值菌瘫;
F4后F7往下走蜗顽,來到了跳轉(zhuǎn)表這里:
繼續(xù)F7往下,來到了case26分支:
一路F7往下突梦,這里有一個(gè)BLX函數(shù):
F7往下诫舅,同步R1寄存器;發(fā)現(xiàn)有關(guān)鍵字眼宫患;
再往下是一個(gè)循環(huán)刊懈,同時(shí)同步R3寄存器,是在解密字符串:
再往下娃闲,又一個(gè)亦或循環(huán):通過R2寄存器
繼續(xù)F7虚汛,
繼續(xù)F8往下:來到這里:
繼續(xù)F7往下;這里是一個(gè)循環(huán)皇帮,一直在讀取卷哩,然后一直比較R0的值;
如果這里BEQ相等的話属拾,就會直接跳到這里:
上面的是從linker到JNI_Load将谊,說明在linker里面沒有進(jìn)行操作,所以渐白,可以換一種尊浓,直接在libdvm哪里找到JNI_onload也行;
重新使用一種方法纯衍,使用open函數(shù)栋齿,往上回溯;
跳到open函數(shù),?然后F2下斷瓦堵,然后F9運(yùn)行基协,然后Ctrl+F7回溯:
同步R0窗口,出現(xiàn)這個(gè)菇用,說明在遍歷tracepid澜驮,
繼續(xù)回溯:
繼續(xù)回溯:
為什么之前又一次運(yùn)行道這里程序就崩潰了?
原因是程序此時(shí)R1寄存器的值:
這個(gè)值什么意思惋鸥?
我們先把4A24轉(zhuǎn)化成10進(jìn)制:18980
執(zhí)行一個(gè)adb命令:這個(gè)就是當(dāng)前as的進(jìn)程泉唁;說明他當(dāng)前已經(jīng)檢測到我們在調(diào)試該程序;
所以我們需要把這個(gè)反調(diào)試干掉:
也就是說揩慕,case26就是反調(diào)試的分支;
改了之后繼續(xù)往上回溯:
繼續(xù)回溯扮休,此時(shí)來到這個(gè)位置迎卤;
繼續(xù)?往上回溯:
此時(shí)R0和0進(jìn)行比較,此時(shí)R0的值依然是as的進(jìn)程號玷坠;
如果不相等蜗搔,就跳轉(zhuǎn)到這里
點(diǎn)進(jìn)去,發(fā)現(xiàn)是kill:
會來八堡,往上p一下樟凄,是一個(gè)函數(shù),
進(jìn)去:p一下:
明顯和這個(gè)就是反調(diào)試的邏輯兄渺,這個(gè)分支代碼比較多缝龄;
我們怎么修改呢,只需要讓這個(gè)函數(shù)返回固定的值即可挂谍;
修改代碼之前叔壤,先把這里置零;
同步一下反匯編窗口口叙,點(diǎn)擊前面的這里會顯示下面對應(yīng)的十六進(jìn)制:
這個(gè)是arm指令炼绘,
執(zhí)修改指令:第一條:
選取后8位,F(xiàn)2進(jìn)行修改:
繼續(xù)修改第二條:
修改后效果:
過掉反調(diào)試后妄田,在mmap處下斷:mmap尾部處也下一個(gè)斷點(diǎn)俺亮;
好,F(xiàn)9運(yùn)行程序:使其在mmap處函數(shù)段下來疟呐;
這里mmap如何查看呢脚曾?至二級F9運(yùn)行到mmap函數(shù)尾部,然后F7進(jìn)去下一步萨醒,就是不同的函數(shù)調(diào)用的地方斟珊、遇到libdvm.so的不用管,h直接F9繼續(xù)在mmap處蹲下,只觀察jiagu.so;
注意在mmap處的操作:不能直接F9從頭部執(zhí)行尾部斷下,要單步跟一下囤踩,即將進(jìn)去的so也要單步跟一半旨椒,然后在F9;
繼續(xù)執(zhí)行上面操作首先會在這里出現(xiàn)apk信息:
繼續(xù)操作堵漱,出現(xiàn)了這個(gè):
繼續(xù):下面R0窗口出現(xiàn)了dey036;
繼續(xù)操作综慎,這里出現(xiàn)了與dex有關(guān)的信息:
看他地址,我們來到他的區(qū)間:
過來后勤庐,這幾就是他解密后的dex
這里是這個(gè)dex文件的大惺揪:
知道起始地址和大小后,使用腳本:
dump可能需要時(shí)間愉镰;
也就是說米罚,出現(xiàn)相關(guān)dex文件的時(shí)候,如果沒有出現(xiàn)太多信息丈探,我們可以ctrl+s查看模塊信息录择,一般他會把dex相關(guān)信息放到其他區(qū)域;
一般會把解密后的dex放到內(nèi)存里面碗降,比如這個(gè)是放在debug里面:
好隘竭,找到dump出來的文件;
拖入jdax讼渊,這就是一些相關(guān)的代碼动看;
點(diǎn)看看一下相關(guān)的邏輯,發(fā)現(xiàn)都有爪幻,說明脫殼挺成功的
轉(zhuǎn)載請注明出處菱皆,或+3526762131