爬蟲工程師的unidbg入門教程
- 現在很多的app使用了so加密,以後會越來越多。爬蟲工程師可能會直接逆向app,看java程式碼,完成java層的演算法破解,但是如果遇到so該怎麼辦呢?可能你會直接破解so,但是真的會有很多爬蟲工程師會去並且會破解so嗎?有時候我們可以不用破解so,利用很多大佬寫好的輪子即可完成so的呼叫。
- 說到呼叫,就有很多方法了,比如用frida的rpc、xposed+andserver、再者就是unicorn+web框架等等,今天要說的並不是這些,而是unidbg,這框架有什麼好的地方呢?看看介紹。
介紹(來自逸飛)
unidbg 是一個基於 unicorn 的逆向工具,可以黑盒呼叫安卓和 iOS 中的 so 檔案。unidbg 是一個標準的 java 專案。
由於現在的大多數 app 把簽名演算法已經放到了 so 檔案中,所以要想破解簽名演算法,必須能夠破解 so 檔案。但是我們知道,C++ 的逆向遠比 Java 的逆向要難得多了,所以好多時候是沒法破解的,那麼這個時候還可以採用 hook 的方法,直接讀取程式中算出來的簽名,但是這樣的話,需要實際執行這個應用,需要模擬器或者真機,效率又不是很高。
unidbg 就是一個很巧妙地解決方案,他不需要直接執行 app,也無需逆向 so 檔案,而是通過在 app 中找到對應的 JNI 介面,然後用 unicorn 引擎直接執行這個 so 檔案,所以效率也比較高。
- 這裡重要的是目前利用unidbg+springboot做成了web服務。
食用
案例來自JXU2QkQyYXBwJTIwdjQuMTYuMA==
對於該app而言,是非常適合入門的一個app,未加固、演算法簡單、很容易找到so的jni。
先去凱神的github上下載https://github.com/zhkl0228/unidbg
下載完畢用idea開啟,等待maven下載完畢。我這裡已經建立好du的檔案。
上個程式碼看著比較方便,程式碼中有很多註釋
public class du extends AbstractJni {
//ARM模擬器
private final ARMEmulator emulator;
//vm
private final VM vm;
//載入的模組
private final Module module;
private final DvmClass TTEncryptUtils;
//初始化
public du() throws IOException {
//建立app程式,這裡其實可以不用寫的,我這裡是隨便寫的,使用app本身的程式就可以繞過程式檢測
emulator = new AndroidARMEmulator("com.du.du");
Memory memory = emulator.getMemory();
//作者支援19和23兩個sdk
memory.setLibraryResolver(new AndroidResolver(23));
memory.setCallInitFunction();
//建立DalvikVM,利用apk本身,可以為null
//如果用apk檔案載入so的話,會自動處理簽名方面的jni,具體可看AbstractJni,利用apk載入的好處,
// vm = emulator.createDalvikVM(new File("src/test/resources/du/du4160.apk"));
我這裡沒有用到apk,主要是沒有檢測其他因素。
vm = emulator.createDalvikVM(null);
//載入so,使用armv8-64速度會快很多,這裡是so的檔案路徑,其實也可以利用apk自身的。
DalvikModule dm = vm.loadLibrary(new File("src/test/resources/du/libJNIEncrypt.so"), false);
//呼叫jni
dm.callJNI_OnLoad(emulator);
module = dm.getModule();
//載入so的那個類
TTEncryptUtils = vm.resolveClass("com/duapp/aesjni/AESEncrypt");
}
//關閉模擬器
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() {
//除錯
// 這裡還支援gdb除錯,
//emulator.attach(DebuggerType.GDB_SERVER);
//附加偵錯程式
// emulator.attach(DebuggerType.SIMPLE);
// emulator.traceCode();
//這裡是打斷點,原地址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;",
//傳參,這裡需要兩個字串,所以就傳入兩個引數
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的類是哪一個需要知道,就是下面這個類,這個其實是和載入so有關係的。
TTEncryptUtils = vm.resolveClass("com/*/aesjni/AESEncrypt");
我們需要逆向app,這裡不細說如何在app中尋找載入so的類。如下圖,encodeByte是該app呼叫native層加密的入口,loadLibrary是java載入so的方法,這個類就是上述程式碼中填寫的。
然後再看"encodeByte(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;"
這裡,這是smali寫法,不補基礎,後面跟上需要傳的引數,
getByteValues
這個方法是毒獲取的一個01字串,並且在java層進行了處理,然後再傳進encodeByte
裡面,encodeByte
這個方法最後獲取的其實並不是最終需要的,需要md5才是最後的newSign。可以驗證一下下。
測試結果通過。
最後
啟動java檔案時候注意這個改成自己的平臺!!!
VM options: -Djava.library.path=prebuilt/os -Djna.library.path=prebuilt/os
Where os may: linux64, win32, win64, osx64
最後這個檔案放在https://github.com/zhaoboy9692/dailyanalysis喜歡的可以star,謝謝。
相關文章
- 爬蟲工程師的入門簡介爬蟲工程師
- scrapy入門教程()部署爬蟲專案爬蟲
- 爬蟲入門爬蟲
- Python爬蟲入門教程導航帖Python爬蟲
- Node 爬蟲入門爬蟲
- Python 從入門到爬蟲極簡教程Python爬蟲
- Python爬蟲入門Python爬蟲
- 【爬蟲】python爬蟲從入門到放棄爬蟲Python
- 爬蟲(1) - 爬蟲基礎入門理論篇爬蟲
- 爬蟲入門(字串相關)爬蟲字串
- 如何入門 Python 爬蟲?Python爬蟲
- python-爬蟲入門Python爬蟲
- Python爬蟲入門教程 50-100 Python3爬蟲爬取VIP視訊-Python爬蟲6操作Python爬蟲
- Python爬蟲入門(2):爬蟲基礎瞭解Python爬蟲
- Python爬蟲入門教程 61-100 寫個爬蟲碰到反爬了,動手破壞它!Python爬蟲
- Python爬蟲入門,8個常用爬蟲技巧盤點Python爬蟲
- Python爬蟲五大零基礎入門教程Python爬蟲
- Python爬蟲入門教程 4-100 美空網未登入圖片爬取Python爬蟲
- 爬蟲入門基礎-Python爬蟲Python
- 三分鐘爬蟲入門爬蟲
- python3 爬蟲入門Python爬蟲
- 爬蟲入門(HTTP和HTTPS)爬蟲HTTP
- 爬蟲0060:scrapy快速入門爬蟲
- Python爬蟲入門指導Python爬蟲
- Python爬蟲入門專案Python爬蟲
- 爬蟲快速入門——Get請求的使用爬蟲
- Python爬蟲入門教程 2-100 妹子圖網站爬取Python爬蟲網站
- 什麼是Python爬蟲?python爬蟲入門難嗎?Python爬蟲
- 一名爬蟲工程師的運維入門之路:IPy學習筆記爬蟲工程師運維筆記
- 學渣講爬蟲之Python爬蟲從入門到出門(第三講)爬蟲Python
- python爬蟲 之 BeautifulSoup庫入門Python爬蟲
- 爬蟲程式十分鐘入門爬蟲
- 5 行程式碼就能入門爬蟲?行程爬蟲
- Python3爬蟲入門(一)Python爬蟲
- Scrapy使用入門及爬蟲代理配置爬蟲
- 爬蟲入門第一章爬蟲
- 爬蟲入門學習筆記3爬蟲筆記
- Python爬蟲入門(1):綜述Python爬蟲