如何利用Capstone引擎寫一個Android反彙編工具
在做一些逆向工程時,偶然想到我還沒有一款用於安卓反彙編二進位制檔案的工具。之後做了一些研究,我將目標選定為 Capstone Engine ,下面就將介紹我是如何整合Capstone Engine在安卓裝置上執行的。
建立Android專案
為此,我還特意使用了Android Studio。建立一個空白的專案 – 這裡沒啥特別的,但是需要注意的是我在app/src/main/下建立了一個名為jniLibs的目錄,其中包含了我們之後會用到的編譯好的C函式庫。
請注意,我通過Android Studio SDK Manager安裝了NDK
編譯Capstone Engine
接下來為Android交叉編譯Capstone Engine
# git clone https://github.com/aquynh/capstone.git Cloning into 'capstone'... remote: Counting objects: 16805, done. remote: Compressing objects: 100% (12/12), done. remote: Total 16805 (delta 4), reused 0 (delta 0), pack-reused 16789 Receiving objects: 100% (16805/16805), 26.10 MiB | 3.01 MiB/s, done. Resolving deltas: 100% (12089/12089), done.Checking connectivity... done. # cd capstone # NDK=~/Library/Android/sdk/ndk-bundle/ ./make.sh cross-android arm
在當前目錄中我們應該有一個名為libcapstone.so的檔案,將其複製到我們之前建立的jniLibs目錄中。
接著下載一份 Capstone Java bindings ,並將其放入Android Studio專案中的app/libs/目錄,其提供了一些方法和類幫助我們與Capstone Engine進行互動。
編譯JNA
Capstone Java bindings利用JNA函式庫載入並與Capstone預製函式庫溝通,我們需要為Android編譯JNA JAR並提取支援JNA的二進位制庫平臺。
這一步,你需要安裝ant:
# git clone https://github.com/twall/jna.git Cloning into 'jna'... remote: Counting objects: 41416, done. remote: Total 41416 (delta 0), reused 0 (delta 0), pack-reused 41416 Receiving objects: 100% (41416/41416), 213.06 MiB | 4.51 MiB/s, done. Resolving deltas: 100% (26780/26780), done.Checking connectivity... done. # cd jna # PATH=$PATH:~/Library/Android/sdk/ NDK_PLATFORM=~/Library/Android/sdk/ndk-bundle/platforms/android-21/ ant -Dos.prefix=android-arm dist
JNA完成編譯之後,我們還需要複製一些檔案到Android Studio project。首先複製dist/jna.jar到專案下的app/libs/目錄,然後就像解壓zip檔案包一樣提取dist/android- arm.jar檔案,將libjnidispatch.so檔案複製到專案下的app/src/main/jniLibs目錄。JNA使用的這些函式庫通過JNI與本機函式庫進行互動。
在一起,在一起!
既然已經將所有的函式庫都進行了編譯,並將這些檔案複製到專案下相對應的目錄,我們就可以開始使用Capstone Engine。在我們開始使用之前,我們需要保證複製到專案下的兩個Java庫已經被包含。要做到這一點,在Android Studio中將他們作為檔案的依賴進行增加(右鍵單擊模組,開啟模組設定,然後開啟依賴關係選項卡,最後點選’+'按鈕進行新增)
新增完成之後,我們就可以在Android專案中使用Capstone了:
import capstone.Capstone;public class MainActivity extends Activity { private byte [] CODE = { 0x55, 0x48, (byte) 0x8b, 0x05, (byte) 0xb8, 0x13, 0x00, 0x00 }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Capstone cs = new Capstone(Capstone.CS_ARCH_X86, Capstone.CS_MODE_64); Capstone.CsInsn[] allInsn = cs.disasm(CODE, 0x1000); for (int i=0; i<allInsn.length; i++) { Log.e("CAPSTONE", allInsn[i].address + " " + allInsn[i].mnemonic + " " + allInsn[i].opStr); } }}</pre>
但願這篇文章對你有幫助。
相關文章
- 使用匯編和反彙編引擎寫一個x86任意地址hookHook
- 反彙編專用工具——objdumpOBJ
- Android反編譯:反編譯工具和方法Android編譯
- Android Apk反編譯系列教程(一)如何反編譯APKAndroidAPK編譯
- 反彙編工具objdump的使用簡介OBJ
- 編寫一個簡單的JavaScript模板引擎JavaScript
- IDA Pro for Mac(最強反彙編工具)Mac
- android反編譯工具總結Android編譯
- 一個Java反彙編器的修改 (7千字)Java
- 如何編寫 C++ 遊戲引擎C++遊戲引擎
- 編寫一個介面壓測工具
- 從0到1編寫一個指令碼引擎指令碼
- 反彙編命令U
- 如何編寫一個React元件React元件
- Java 反彙編、反編譯、volitale解讀Java編譯
- 從0到1編寫一個JS指令碼引擎JS指令碼
- 如何利用CSS寫一個六邊形?CSS
- 如何反編譯Android 5.0 framework編譯AndroidFramework
- 黑客反彙編解密 第一版黑客解密
- 如何快速編寫一個微信Api?API
- 如何編寫一個Jquery外掛jQuery
- Android反編譯工具Apktool淺析Android編譯APK
- Android反編譯工具ApkTool的使用Android編譯APK
- 利用Runtime寫一個JSON轉Model的工具JSON
- 編寫一個分析程式碼依賴的工具(一)
- 如何編寫一個可複用元件元件
- 如何編寫一個Perl爬蟲程式爬蟲
- 如何編寫一個 Redux 中介軟體Redux
- 實戰:如何編寫一個 OpenTelemetry Extensions
- 如何使用Flask編寫一個網站Flask網站
- Win32彙編教程四 編寫一個簡單的視窗 (轉)Win32
- [譯] Go 終極指南:編寫一個 Go 工具Go
- 推薦一款採用 .NET 編寫的 反編譯到原始碼工具 Reko編譯原始碼
- apkTool---一個簡單好用的apk反編譯工具APK編譯
- 仿寫一個android圖片壓縮工具Android
- android 反編譯Android編譯
- 反彙編器-javap.exe(轉)Java
- 如何編寫一個 Pulsar Broker Interceptor 外掛