⑴ Android軟體安全與逆向分析的書名
本書由淺入深、循序漸進地講解了Android 系統的軟體安全、逆向分析與加密解密技術。包括Android軟體逆向分析和系統安全方面的必備知識及概念、如何靜態分析Android 軟體、如何動態調試Android 軟體、Android 軟體的破解與反破解技術的探討,以及對典型Android 病毒的全面剖析。
本書適合所有Android 應用開發者、Android 系統開發工程師、Android 系統安全工作者閱讀學習。 豐生強(網名非蟲)
Android軟體安全專家。看雪論壇Android安全版版主;安卓巴士開發交流版版主。
對Android軟體與系統安全有狂熱的愛好和獨到的見解,對Android系統的全部源代碼進行過深入地研究和分析。逆向分析實戰經驗豐富。
在國內信息安全雜志上發表過多篇有價值的軟體安全文章,目前就職於國內某Android開發企業,常年混跡於看雪論壇(ID非蟲)。
作者郵箱:[email protected]
願與國內安全愛好者共同交流與探討安全技術。 第1章 Android程序分析環境搭建11.1 Windows分析環境搭建11.1.1 安裝JDK11.1.2 安裝Android SDK31.1.3 安裝Android NDK51.1.4 Eclipse集成開發環境61.1.5 安裝CDT、ADT插件61.1.6 創建Android Virtual Device81.1.7 使用到的工具91.2 linux分析環境搭建91.2.1 本書的Linux環境91.2.2 安裝JDK91.2.3 在Ubuntu上安裝Android SDK101.2.4 在Ubuntu上安裝Android NDK111.2.5 在Ubuntu上安裝Eclipse集成開發環境121.2.6 在Ubuntu上安裝CDT、ADT插件131.2.7 創建Android Virtual Device131.2.8 使用到的工具151.3 本章小結15第2章 如何分析Android程序162.1 編寫第一個Android程序162.1.1 使用Eclipse創建Android工程162.1.2 編譯生成APK文件192.2 破解第一個程序202.2.1 如何動手?202.2.2 反編譯APK文件202.2.3 分析APK文件212.2.4 修改Smali文件代碼262.2.5 重新編譯APK文件並簽名262.2.6 安裝測試272.3 本章小結28第3章 進入Android Dalvik虛擬機293.1 Dalvik虛擬機的特點——掌握Android程序的運行原理293.1.1 Dalvik虛擬機概述293.1.2 Dalvik虛擬機與Java虛擬機的區別293.1.3 Dalvik虛擬機是如何執行程序的343.1.4 關於Dalvik虛擬機JIT(即時編譯)363.2 Dalvik匯編語言基礎為分析Android程序做准備373.2.1 Dalvik指令格式373.2.2 DEX文件反匯編工具393.2.3 了解Dalvik寄存器403.2.4 兩種不同的寄存器表示方法——v命名法與p命名法423.2.5 Dalvik位元組碼的類型、方法與欄位表示方法433.3 Dalvik指令集443.3.1 指令特點453.3.2 空操作指令453.3.3 數據操作指令463.3.4 返回指令463.3.5 數據定義指令463.3.6 鎖指令473.3.7 實例操作指令473.3.8 數組操作指令483.3.9 異常指令483.3.10 跳轉指令483.3.11 比較指令493.3.12 欄位操作指令503.3.13 方法調用指令503.3.14 數據轉換指令513.3.15 數據運算指令513.4 Dalvik指令集練習——寫一個Dalvik版的Hello World523.4.1 編寫smali文件523.4.2 編譯smali文件543.4.3 測試運行543.5 本章小結55第4章 Android可執行文件564.1 Android程序的生成步驟564.2 Android程序的安裝流程594.3 dex文件格式664.3.1 dex文件中的數據結構664.3.2 dex文件整體結構684.3.3 dex文件結構分析714.4 odex文件格式804.4.1 如何生成odex文件804.4.2 odex文件整體結構814.4.3 odex文件結構分析834.5 dex文件的驗證與優化工具dexopt的工作過程884.6 Android應用程序另類破解方法914.7 本章小結93第5章 靜態分析Android程序945.1 什麼是靜態分析945.2 快速定位Android程序的關鍵代碼945.2.1 反編譯apk程序945.2.2 程序的主Activity955.2.3 需重點關注的Application類955.2.4 如何定位關鍵代碼——六種方法965.3 smali文件格式975.4 Android程序中的類1005.4.1 內部類1005.4.2 監聽器1025.4.3 註解類1055.4.4 自動生成的類1085.5 閱讀反編譯的smali代碼1105.5.1 循環語句1105.5.2 switch分支語句1155.5.3 try/catch語句1215.6 使用IDA Pro靜態分析Android程序1275.6.1 IDA Pro對Android的支持1275.6.2 如何操作1285.6.3 定位關鍵代碼——使用IDA Pro進行破解的實例1325.7 惡意軟體分析工具包——Androguard1355.7.1 Androguard的安裝與配置1355.7.2 Androguard的使用方法1375.7.3 使用Androguard配合Gephi進行靜態分析1445.7.4 使用androlyze.py進行靜態分析1485.8 其他靜態分析工具1525.9 閱讀反編譯的Java代碼1525.9.1 使用dex2jar生成jar文件1525.9.2 使用jd-gui查看jar文件的源碼1535.10 集成分析環境——santoku1545.11 本章小結156第6章 基於Android的ARM匯編語言基礎——逆向原生!1576.1 Android與ARM處理器1576.1.1 ARM處理器架構概述1576.1.2 ARM處理器家族1586.1.3 Android支持的處理器架構1596.2 原生程序與ARM匯編語言——逆向你的原生Hello ARM1606.2.1 原生程序逆向初步1606.2.2 原生程序的生成過程1626.2.3 必須了解的ARM知識1646.3 ARM匯編語言程序結構1666.3.1 完整的ARM匯編程序1666.3.2 處理器架構定義1676.3.3 段定義1686.3.4 注釋與標號1696.3.5 匯編器指令1696.3.6 子程序與參數傳遞1706.4 ARM處理器定址方式1706.4.1 立即定址1706.4.2 寄存器定址1716.4.3 寄存器移位定址1716.4.4 寄存器間接定址1716.4.5 基址定址1716.4.6 多寄存器定址1716.4.7 堆棧定址1726.4.8 塊拷貝定址1726.4.9 相對定址1726.5 ARM與Thumb指令集1736.5.1 指令格式1736.5.2 跳轉指令1746.5.3 存儲器訪問指令1756.5.4 數據處理指令1776.5.5 其他指令1846.6 用於多媒體編程與浮點計算的NEON與VFP指令集1856.7 本章小結186第7章 Android NDK程序逆向分析1877.1 Android中的原生程序1877.1.1 編寫一個例子程序1877.1.2 如何編譯原生程序1887.2 原生程序的啟動流程分析1947.2.1 原生程序的入口函數1947.2.2 main函數究竟何時被執行1987.3 原生文件格式1997.4 原生C程序逆向分析2007.4.1 原生程序的分析方法2007.4.2 for循環語句反匯編代碼的特點2047.4.3 if...else分支語句反匯編代碼的特點2087.4.4 while循環語句反匯編代碼的特點2117.4.5 switch分支語句反匯編代碼的特點2157.4.6 原生程序的編譯時優化2187.5 原生C++程序逆向分析2227.5.1 C++類的逆向2227.5.2 Android NDK對C++特性的支持2257.5.3 靜態鏈接STL與動態鏈接STL的代碼區別2277.6 Android NDK JNI API逆向分析2327.6.1 Android NDK提供了哪些函數2327.6.2 如何靜態分析Android NDK程序2337.7 本章小結235第8章 動態調試Android程序2368.1 Android動態調試支持2368.2 DDMS的使用2378.2.1 如何啟動DDMS2378.2.2 使用LogCat查看調試信息2388.3 定位關鍵代碼2408.3.1 代碼注入法——讓程序自己吐出注冊碼2408.3.2 棧跟蹤法2448.3.3 Method Profiling2478.4 使用AndBug調試Android程序2508.4.1 安裝AndBug2518.4.2 使用AndBug2518.5 使用IDA Pro調試Android原生程序2548.5.1 調試Android原生程序2558.5.2 調試Android原生動態鏈接庫2568.6 使用gdb調試Android原生程序2608.6.1 編譯gdb與gdbserver2608.6.2 如何調試2628.7 本章小結264第9章 Android軟體的破解技術2659.1 試用版軟體2659.1.1 試用版軟體的種類2659.1.2 實例破解——針對授權KEY方式的破解2659.2 序列號保護2719.3 網路驗證2729.3.1 網路驗證保護思路2729.3.2 實例破解——針對網路驗證方式的破解2739.4 In-app Billing(應用內付費)2779.4.1 In-app Billing原理2779.4.2 In-app Billing破解方法2809.5 Google Play License保護2819.5.1 Google Play License保護機制2819.5.2 實例破解——針對Google Play License方式的破解2839.6 重啟驗證2849.6.1 重啟驗證保護思路2859.6.2 實例破解——針對重啟驗證方式的破解2859.7 如何破解其他類型的Android程序2969.7.1 Mono for Android開發的程序及其破解方法2969.7.2 Qt for Android開發的程序及其破解方法3019.8 本章小結309第10章 Android程序的反破解技術31010.1 對抗反編譯31010.1.1 如何對抗反編譯工具31010.1.2 對抗dex2jar31110.2 對抗靜態分析31210.2.1 代碼混淆技術31210.2.2 NDK保護31510.2.3 外殼保護31610.3 對抗動態調試31610.3.1 檢測調試器31610.3.2 檢測模擬器31710.4 防止重編譯31810.4.1 檢查簽名31810.4.2 校驗保護31910.5 本章小結320第11章 Android系統攻擊與防範32111.1 Android系統安全概述32111.2 手機ROOT帶來的危害32111.2.1 為什麼要ROOT手機32111.2.2 手機ROOT後帶來的安全隱患32211.2.3 Android手機ROOT原理32211.3 Android許可權攻擊32911.3.1 Android許可權檢查機制32911.3.2 串謀許可權攻擊33311.3.3 許可權攻擊檢測33611.4 Android組件安全33911.4.1 Activity安全及Activity劫持演示34011.4.2 Broadcast Receiver 安全34311.4.3 Service安全34511.4.4 Content Provider安全34611.5 數據安全34711.5.1 外部存儲安全34711.5.2 內部存儲安全34811.5.3 數據通信安全35011.6 ROM安全35111.6.1 ROM的種類35211.6.2 ROM的定製過程35211.6.3 定製ROM的安全隱患35911.6.4 如何防範36011.7 本章小結361第12章 DroidKongFu變種病毒實例分析36212.1 DroidKongFu病毒介紹36212.2 配置病毒分析環境36312.3 病毒執行狀態分析36412.3.1 使用APIMonitor初步分析36512.3.2 使用DroidBox動態分析36912.3.3 其他動態分析工具37312.4 病毒代碼逆向分析37612.4.1 Java層啟動代碼分析37612.4.2 Native層啟動代碼分析38112.4.3 Native層病毒核心分析39312.5 DroidKongFu病毒框架總結40412.6 病毒防治40612.7 本章小結406
⑵ linuxso載入路徑linuxso載入
so是什麼文件?
so文件是Linux下的程序函數庫,即編譯好的可以供其他程序使用的代碼和數據。
1、so文件就跟.dll文件差不多。
2、一般來說,so文件就是常說的動態鏈接庫,都是C或C++編譯出來的。與Java比較它通常是用的Class文件(位元組碼)。
3、Linux下的so文件時不能直接運行的,一般來講,.so文件稱為共享庫。
4、so文件使用方法
(1)動態庫的編譯。這里有一個頭文件:so_test.h,三個.c文件:test_a.c、test_b.c、test_c.c,我們將這幾個文件編譯成一個動態庫:libtest.so。
命令:$gcctest_a.ctest_b.ctest_c.c-fPIC-shared-olibtest.so不用該標志外部程序無法連接。相當於一個可執行文件。
(2)動態庫的鏈接
這里有個程序源文件test.c與動態庫libtest.so鏈接生成執行文件test:
命令:$gcctest.c-L.-ltest-otest
命令:$lddtest執行test,可以看到它是如何調用動態庫中的函數的。
so格式文件是什麼文件?
SO文件格式即ELF文件格式,它是Linux下可執行文件,共享庫文件和目標文件的統一格式。根據看待ELF文件的不同方式,ELF文件可以分為鏈接視圖和裝載視圖。
鏈接視圖是鏈接器從鏈接的角度看待靜態的ELF文件。
從鏈接視圖看ELF文件,ELF文件由多個section組成,不同的section擁有不同的名稱,許可權。
而裝載視圖是操作系統從載入ELF文件到內存的角度看待動態的ELF文件。
從裝載視圖看ELF文件,ELF文件由多個segment,每一個segment都擁有不同的許可權,名稱。實際上,一個segment是對多個具有相同許可權的section的集合。
ubuntu下怎麼打包寫好的Qt程序?
你可以參考SQLiteStudio這個Qt寫的跨平台SQLite管理工具,它自己打包了依賴的Qt庫,可以做到解壓即用,兼容不同Linux發行版.道理其實跟Windows版Qt程序自帶Qt庫差不多.
編譯前給連接器傳一個參數:
說明:
-Wl表示告訴編譯器將後面的參數傳遞給鏈接器.
rpath是gcc的一個參數,當程序被載入時,會搜尋rpath目錄,尋找共享庫.
rpath添加的目錄信息保存在可執行文件中.
$ORIGIN表示可執行文件所在的目錄.
也就是運行時程序會先去自己所在的目錄的lib里去載入依賴庫,沒有的話再去系統庫里找.
如果你的程序在編譯時沒有傳遞rpath參數,那你也可以用patchelf來修改你程序的rpath:
注意:patchelf修改文件後再strip會導致文件損壞.
所以應該先用strip刪除符號表縮小二進制文件,然後再用patchelf設置rpath.
題外話,Android上既沒有glibc庫,也沒有庫鏈接器ld-linux.so.3.
如果你要把DebianARM(如樹莓派Raspbian)上的軟體放到Android上跑,你一樣可以打包程序依賴的共享庫,讓程序也能跑在Android上,比如PHP:
也就是你把庫鏈接器ld-linux-armhf.so.3和PHP依賴的庫都放到/data/local/tmp/web/lib里,然後設置個別名,就能在Android的adbshell里運行樹莓派的PHP了.
當然,你也可以用patchelf設置PHP的interpreter和rpath,效果差不多:
linuxso是什麼文件?
SO文件格式即ELF文件格式,它是Linux下可執行文件,共享庫文件和目標文件的統一格式。
根據看待ELF文件的不同方式,ELF文件可以分為鏈接視圖和裝載視圖。鏈接視圖是鏈接器從鏈接的角度看待靜態的ELF文件。
從鏈接視圖看ELF文件,ELF文件由多個section組成,不同的section擁有不同的名稱,許可權。而裝載視圖是操作系統從載入ELF文件到內存的角度看待動態的ELF文件。
從裝載視圖看ELF文件,ELF文件由多個segment,每一個segment都擁有不同的許可權,名稱。實際上,一個segment是對多個具有相同許可權的section的集合。
(2)反編譯WindowsQt程序擴展閱讀:
由於Android操作系統的底層基於Linux系統,所以SO文件可以運行在Android平台上。Android系統也同樣開放了C/C++介面供開發者開發Native程序。
由於基於虛擬機的編程語言JAVA更容易被人反編譯,因此越來越多的應用將其中的核心代碼以C/C++為編程語言,並且以SO文件的形式供上層JAVA代碼調用,以保證安全性。
而ELF頭表記錄了ELF文件的基本信息,包括魔數,目標文件類型(可執行文件,共享庫文件或者目標文件),文件的目標體系結構,程序入口地址(共享庫文件為此值為0),然後是section表大小和數目,程序頭表的大小和數目,分別對應的是鏈接視圖和裝載視圖。