A. 用什麼工具反編譯或者解壓縮 linux 下的 bin 文件
objmp -sd 文件
B. linuxclass鍙嶇紪璇憀inuxclass
so鏄浠涔堟枃浠訛紵
so鏂囦歡鏄疞inux涓嬬殑紼嬪簭鍑芥暟搴,鍗崇紪璇戝ソ鐨勫彲浠ヤ緵鍏朵粬紼嬪簭浣跨敤鐨勪唬鐮佸拰鏁版嵁銆
1銆乻o鏂囦歡灝辮窡.dll鏂囦歡宸涓嶅氥
2銆佷竴鑸鏉ヨ達紝so鏂囦歡灝辨槸甯歌寸殑鍔ㄦ侀摼鎺ュ簱,閮芥槸C鎴朇++緙栬瘧鍑烘潵鐨勩備笌Java姣旇緝瀹冮氬父鏄鐢ㄧ殑Class鏂囦歡錛堝瓧鑺傜爜錛夈
3銆丩inux涓嬬殑so鏂囦歡鏃朵笉鑳界洿鎺ヨ繍琛岀殑,涓鑸鏉ヨ,.so鏂囦歡縐頒負鍏變韓搴撱
4銆乻o鏂囦歡浣跨敤鏂規硶
(1)鍔ㄦ佸簱鐨勭紪璇戙傝繖閲屾湁涓涓澶存枃浠訛細so_test.h錛屼笁涓.c鏂囦歡錛歵est_a.c銆乼est_b.c銆乼est_c.c錛屾垜浠灝嗚繖鍑犱釜鏂囦歡緙栬瘧鎴愪竴涓鍔ㄦ佸簱錛歭ibtest.so銆
鍛戒護錛$gcctest_a.ctest_b.ctest_c.c-fPIC-shared-olibtest.so涓嶇敤璇ユ爣蹇楀栭儴紼嬪簭鏃犳硶榪炴帴銆傜浉褰撲簬涓涓鍙鎵ц屾枃浠躲
(2)鍔ㄦ佸簱鐨勯摼鎺
榪欓噷鏈変釜紼嬪簭婧愭枃浠秚est.c涓庡姩鎬佸簱libtest.so閾炬帴鐢熸垚鎵ц屾枃浠秚est錛
鍛戒護錛$gcctest.c-L.-ltest-otest
鍛戒護錛$lddtest鎵ц宼est錛屽彲浠ョ湅鍒板畠鏄濡備綍璋冪敤鍔ㄦ佸簱涓鐨勫嚱鏁扮殑銆
linux涓嬫庝箞鐪媤wn錛
/sys/class/fc_host/涓嬫湁HBA鍗″悕瀛楃殑鐩褰曪紝姣忎釜鐩褰曢噷鐨刾ort_name鏂囦歡灝辨槸WWN錛屾瘮濡傦細cd/sys/class/fc_host/host2catportname浣庣増鏈鐨凩inux鍙浠ユ煡鐪嬫枃浠訛細/proc/scsi/qla2xxx/1(1,2,3,..N)
C. Android/Linux so動態庫分析和反編譯
開發環境的搭建涉及友善smart-210開發板作為平台。在進行so動態庫文件頭分析時,需明確其本質為ELF文件,且利用Elf32_Ehdr結構體定義ELF32頭文件。將armeabi-v7a類型的so動態庫文件放置於Linux系統路徑中,然後在Linux終端進入文件目錄,執行"readelf -h xxxx.so"命令,以查看文件頭部信息。
文件頭部信息包括Magic/e_ident[]用於標識ELF目標文件,Class標記文件類型為32位ELF格式,Data指示數據組織格式為小端格式,Version為當前文件頭版本號1。OS/ABI描述操作系統類,ABI Version為ABI版本號0。Type/e_type指明文件類型,這里是共享庫(Shared Library)。Machine/e_machine顯示機器平台類型為ARM類型,Version/e_version為當前目標文件版本號0x01。Entry point address/e_entry表示程序入口地址,Stars of program headers/e_phoff記錄程序頭表文件偏移,Stars of section headers/e_shoff記錄節區頭文件偏移。Flasgs/e_flags為處理器相關標識,Size of this header/e_ehsize表示ELF頭文件大小,Size of program headers/e_phentsize表示程序頭表頭目大小。Number of program headers/e_phnum表示程序頭表條目數量,Size of section headers/shentsize表示節區頭表條目大小,Number of section headers/e_shnum為節區頭表條目數量。節區頭字元表索引/e_shstrndx。
程序頭表通過Elf32_Phdr結構體描述,此表為數組,數組元素存儲程序頭表條目,描述段或其它信息以准備程序運行。文件段包含多個節區,程序頭表僅在可執行文件或共享對象文件中有意義。
反編譯so動態庫方法採用IDA軟體。首先解壓安裝包,安裝時注意避免中文路徑,隨後根據ReadMe文檔獲取密鑰。安裝完成後,打開軟體並點擊「GO」按鈕,拖拽so動態庫文件至工作區,點擊「OK」按鈕等待反編譯完成。反編譯後,工作區顯示包含機器碼的Hex View-1窗口、匯編代碼的IDA View-A窗口以及保存函數名的Function window窗口。通過雙擊函數名定位到對應函數的匯編代碼。使用Ctrl+F搜索特定函數名,雙擊函數名查看匯編代碼,按下F5即可轉換為C代碼。