感謝UPX的維護者們.最近在讀UPX源碼,目的是爲.so文件加殼玩.
在此以前閱讀了大部分我能搜到的中文相關內容.不少語焉不詳,因此綜合了一下,編譯出了Linux下的版本.
本文簡單說明了如下內容:算法
你能夠參考這裏,step by step.Android NDK UPX加固做者:fallrainwindows
UPX最新版d9e7cb4b5485用VS編譯會報錯-沒法識別的導出符號.另外還有一些問題,動態結構體數組不能直接聲明.須要動態申請.這都是小問題,根據報錯信息很容易解決.真正的關鍵在於對於加殼.so動態連接庫會提示沒法識別的文件格式.當前我尚未在windows平臺編譯成功最新版.數組
源代碼若是跨平臺,經過不一樣的編譯選項能夠編譯成不一樣平臺的程序.
功能不變.markdown
我編譯成功UPX的Linux版後,發現加殼Android上的.so動態連接庫文件會報「未知文件格式」.在使用必定數量的不一樣類型.so後.認爲要麼UPX壓縮.so的傳言爲虛,要麼咱們的.so文件通通有問題..init多篇網文反覆提到UPX只能壓縮具備該」區段」的內容.函數
壓縮可執行程序確定不能像壓縮軟件那樣直接一套通用算法就能搞定,得針對不一樣格式作出相應安排,UPX是如何區分文件格式的呢?
它是先肯定大體可執行文件類型,而後挨個格式試驗canPack,一旦發現格式不對,不符合此種格式的標準就拋異常.
最後一個canPack也不符合就告訴你們這個文件」未知文件格式」.spa
據說必需要有.init段才能運行時解壓縮,手頭的.so文件都沒有.init段.那是否是隨便找個段添加進去就能夠了呢?仍是找個段改個名字?咱們調試一下,它是在何時pass咱們的..net
UPX支持的格式果真不少,而後各類很差找.最終找到.so文件判斷過程的過程在p_lx_elf.cpp
中調試
if (/*jni_onload_sym ||*/ elf_find_dynamic(Elf32_Dyn::DT_INIT)) { ......
DT_INIT不存在就會跳過.DT_INIT是什麼東東?查看ELF格式的解析,好像是北大軟件學院作的.裏面有一句說:dynamic區段中標誌爲0xC的內容爲init,即後面的值指向初始化地址.code
通過驗證:若是你的.so文件有_init段,區段dynamic中就會有一個標誌等於0xC,其地址指向初始化區段文件偏移地址.
另外_init並不是區段,只是一個導出函數.NDK會生成對應的區段並融合在某個大區段中,因此你從區段表看不到它.至於它的做用如何網文介紹不少,再也不贅述.blog
最終我完成了它的Linux版編譯和.so加殼.
書寫2016年1月28日 21:59:07 修訂2016年2月4日 23:39:40