
文章插圖
現(xiàn)在很多的app使用了so加密,以后會(huì)越來越多 。爬蟲工程師可能會(huì)直接逆向app,看java代碼,完成java層的算法破解,但是如果遇到so該怎么辦呢?可能你會(huì)直接破解so,但是真的會(huì)有很多爬蟲工程師會(huì)去并且會(huì)破解so嗎?有時(shí)候我們可以不用破解so,利用很多大佬寫好的輪子即可完成so的調(diào)用 。說到調(diào)用,就有很多方法了,比如用frida的rpc、xposed+andserver、再者就是unicorn+web框架等等,今天要說的并不是這些,而是unidbg,這框架有什么好的地方呢?看看介紹 。
介紹(來自逸飛)unidbg 是一個(gè)基于 unicorn 的逆向工具,可以黑盒調(diào)用安卓和 iOS 中的 so 文件 。unidbg 是一個(gè)標(biāo)準(zhǔn)的 java 項(xiàng)目 。
由于現(xiàn)在的大多數(shù) app 把簽名算法已經(jīng)放到了 so 文件中,所以要想破解簽名算法,必須能夠破解 so 文件 。但是我們知道,C++ 的逆向遠(yuǎn)比 Java 的逆向要難得多了,所以好多時(shí)候是沒法破解的,那么這個(gè)時(shí)候還可以采用 hook 的方法,直接讀取程序中算出來的簽名,但是這樣的話,需要實(shí)際運(yùn)行這個(gè)應(yīng)用,需要模擬器或者真機(jī),效率又不是很高 。
unidbg 就是一個(gè)很巧妙地解決方案,他不需要直接運(yùn)行 app,也無需逆向 so 文件,而是通過在 app 中找到對應(yīng)的 JNI 接口,然后用 unicorn 引擎直接執(zhí)行這個(gè) so 文件,所以效率也比較高 。
這里重要的是目前利用unidbg+springboot做成了web服務(wù) 。食用案例來自JXU2QkQyYXBwJTIwdjQuMTYuMA==對于該app而言,是非常適合入門的一個(gè)app,未加固、算法簡單、很容易找到so的jni 。先去凱神的github上下載https://github.com/zhkl0228/unidbg下載完畢用idea打開,等待maven下載完畢 。我這里已經(jīng)創(chuàng)建好du的文件 。上個(gè)代碼看著比較方便,代碼中有很多注釋
public class du extends AbstractJni {//ARM模擬器private final ARMEmulator emulator;//vmprivate final VM vm;//載入的模塊private final Module module;private final DvmClass TTEncryptUtils;//初始化public du() throws IOException {//創(chuàng)建app進(jìn)程,這里其實(shí)可以不用寫的,我這里是隨便寫的,使用app本身的進(jìn)程就可以繞過進(jìn)程檢測emulator = new AndroidARMEmulator("com.du.du");Memory memory = emulator.getMemory();//作者支持19和23兩個(gè)sdkmemory.setLibraryResolver(new AndroidResolver(23));memory.setCallInitFunction();//創(chuàng)建DalvikVM,利用apk本身,可以為null//如果用apk文件加載so的話,會(huì)自動(dòng)處理簽名方面的jni,具體可看AbstractJni,利用apk加載的好處,//vm = emulator.createDalvikVM(new File("src/test/resources/du/du4160.apk"));我這里沒有用到apk,主要是沒有檢測其他因素 。vm = emulator.createDalvikVM(null);//加載so,使用armv8-64速度會(huì)快很多,這里是so的文件路徑,其實(shí)也可以利用apk自身的 。DalvikModule dm = vm.loadLibrary(new File("src/test/resources/du/libJNIEncrypt.so"), false);//調(diào)用jnidm.callJNI_OnLoad(emulator);module = dm.getModule();//加載so的那個(gè)類TTEncryptUtils = vm.resolveClass("com/duapp/aesjni/AESEncrypt");}//關(guān)閉模擬器private void destroy() throws IOException {emulator.close();System.out.println("destroy");}public static void main(String[] args) throws IOException {du t = new du();t.encodeByte();t.destroy();}private String encodeByte() {//調(diào)試// 這里還支持gdb調(diào)試,//emulator.attach(DebuggerType.GDB_SERVER);//附加調(diào)試器//emulator.attach(DebuggerType.SIMPLE);//emulator.traceCode();//這里是打斷點(diǎn),原地址0x00005028->新地址0x40005028 新地址需要改成0x4 //emulator.attach().addBreakPoint(null, 0x40001188);//encode地址//emulator.attach().addBreakPoint(null, 0x40000D10);Number ret = TTEncryptUtils.callStaticJniMethod(emulator, "getByteValues()Ljava/lang/String;");long hash = ret.intValue() & 0xffffffffL;StringObject st1 = vm.getObject(hash);//*這里要處理下字符串String byteString = st1.getValue();StringBuilder builder = new StringBuilder(byteString.length());for (int i = 0; i < byteString.length(); i++) {if (byteString.charAt(i) == '0') {builder.append('1');} else {builder.append('0');}}//獲取encodeByte地址ret = TTEncryptUtils.callStaticJniMethod(emulator, "encodeByte(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;",//傳參,這里需要兩個(gè)字符串,所以就傳入兩個(gè)參數(shù)vm.addLocalObject(new StringObject(vm, "要加密的值")),vm.addLocalObject(new StringObject(vm, builder.toString())));//ret 返回的是地址,hash = ret.intValue() & 0xffffffffL;//獲得其值StringObject str = vm.getObject(hash);System.out.println(str.getValue());return str.getValue();}}上邊代碼有jni的類是哪一個(gè)需要知道,就是下面這個(gè)類,這個(gè)其實(shí)是和加載so有關(guān)系的 。
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請您及時(shí)就醫(yī)或請專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對您有所幫助:- 給大家安利怎么使用掌中拍預(yù)訂酒店更省錢 掌中拍可以訂酒店嗎
- 負(fù)離子空氣凈化器使用方法
- 西方龍頭盾折紙實(shí)拍教程(上篇 折紙西方龍頭盾圖解)
- 怎樣折紙菠蘿 菠蘿折紙教程
- 講解vivox9恢復(fù)出廠設(shè)置密碼 vivox9強(qiáng)制解鎖教程
- 中望cad和autocad的區(qū)別 中望cad2009激活教程
- 手機(jī)無服務(wù)查話費(fèi)教程 怎么查手機(jī)話費(fèi)扣費(fèi)記錄
- 新手macbook重置系統(tǒng)還原 macbook恢復(fù)出廠教程教學(xué)
- 許愿球折紙實(shí)拍教程 折紙?jiān)S愿瓶子
- 教你如何折睡蓮 折紙睡蓮教程大全
