好友
阅读权限10
听众
最后登录1970-1-1
|
本帖最后由 alpha007 于 2017-4-26 10:42 编辑
Capstone是一个轻量级的多平台多架构支持的反汇编框架。支持包括ARM,ARM64,MIPS和x86/x64平台。
可以在 http://www.capstone-engine.org/download.html 获取到最新的代码或者新的二进制包。
目前Capstone提供了如Python/Go/C#/Java等语言的支持,有较好的可扩展性。
----------------------------------------------
编译环境:
Ubuntu4.04 x86-64
android-ndk-r10e-linux
ant
对于Capstone和jna的编译,我是在Ubuntu14.04 x86-64位环境下完成的;
本文的测试代码运行的手机,CPU位数必须是64位的;
1.编译Capstone Engine;
(为Android交叉编译Capstone Engine,使用香港服务器下载 Capstone)
# git clone https://github.com/aquynh/capstone.git
# cd capstone
# NDK=~/soft/android-ndk-r10e ./make.sh cross-android arm64
在当前目录中我们应该有一个名为libcapstone.so的文件,将其复制到app/libs/arm64-v8a/目录中。
接着下载一份 Capstone Java bindings ,并将其放入Android Studio项目中的app/libs/目录,
其提供了一些方法和类帮助我们与Capstone Engine进行交互。
2.编译JNA;
Capstone Java bindings利用JNA函数库加载并与Capstone预制函数库沟通,我们需要为Android编译JNA JAR并提取支持JNA的二进制库平台。
这一步,你需要安装ant:
# git clone https://github.com/twall/jna.git
# cd jna
# PATH=$PATH:~/Android/sdk/ NDK_PLATFORM=~/soft/android-ndk-r10e/platforms/android-21/ ant -Dos.prefix=android-arm64 dist
JNA完成编译之后,我们还需要复制一些文件到Android Studio project。
首先复制dist/jna.jar到项目下的app/libs/目录,然后就像解压zip文件包一样提取dist/android-aarch64.jar文件,
将libjnidispatch.so文件复制到项目下的 app/libs/arm64-v8a/ 目录。JNA使用的这些函数库通过JNI与本机函数库进行交互。
3.创建Android App工程,导入Capstone和jna,编写测试代码;
--------------------------------------------------------------------------------------
[Java] 纯文本查看 复制代码 package dt.capstone_arm64;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import capstone.Capstone;
/**
* 示例: 使用capstone反汇编引擎反编译64位汇编代码;
*
*
* 程序输出:
* CAPSTONE-X86-64: =========== X86-64 反汇编引擎使用 =========开始==
* CAPSTONE-X86-64: 4096 push rbp
* CAPSTONE-X86-64: 4097 mov rax, qword ptr [rip + 0x13b8]
* CAPSTONE-X86-64: =========== X86-64 反汇编引擎使用 =========结束==
* CAPSTONE-ARM-64: =========== ARM-64 反汇编引擎使用 =========开始==
* CAPSTONE-ARM-64: 4096 ldr x1, [x20]
* CAPSTONE-ARM-64: 4100 mov x0, x19
* CAPSTONE-ARM-64: 4104 bl #0xccc
* CAPSTONE-ARM-64: 4108 movz w0, #0xa
* CAPSTONE-ARM-64: =========== ARM-64 反汇编引擎使用 =========结束==
*/
public class MainActivity extends AppCompatActivity {
/***********************************************************************************************
[ARM-64 汇编代码]
.text:0000000000001164 81 02 40 F9 LDR X1, [X20]
.text:0000000000001168 E0 03 13 AA MOV X0, X19
.text:000000000000116C 31 FF FF 97 BL sub_E30
.text:0000000000001170 40 01 80 52 MOV W0, #0xA
**********************************************************************************************/
private byte[] ARM64_CODE = {(byte) 0x81, 0x02, 0x40, (byte) 0xF9, (byte) 0xe0, 0x03, 0x13, (byte) 0xAA,
0x31, (byte) 0xFF, (byte) 0xFF, (byte) 0x97, 0x40, 0x01, (byte) 0x80, 0x52};
private byte[] X86_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);
/* [X86-64 反汇编引擎使用] */
Capstone cs_x86 = new Capstone(Capstone.CS_ARCH_X86, Capstone.CS_MODE_64);
Capstone.CsInsn[] allInsn = cs_x86.disasm(X86_CODE, 0x1000);
Log.e("CAPSTONE-X86-64", "=========== X86-64 反汇编引擎使用 =========开始==");
for (int i = 0; i < allInsn.length; i++) {
Log.e("CAPSTONE-X86-64", allInsn.address + " " + allInsn.mnemonic + " " + allInsn.opStr);
}
Log.e("CAPSTONE-X86-64", "=========== X86-64 反汇编引擎使用 =========结束==");
/* [ARM-64 反汇编引擎使用] */
Capstone cs_arm64 = new Capstone(Capstone.CS_ARCH_ARM64, Capstone.CS_MODE_ARM);
Capstone.CsInsn[] allInsn_arm64 = cs_arm64.disasm(ARM64_CODE, 0x1000);
Log.e("CAPSTONE-ARM-64", "=========== ARM-64 反汇编引擎使用 =========开始==");
for (int i = 0; i < allInsn_arm64.length; i++) {
Log.e("CAPSTONE-ARM-64", allInsn_arm64.address + " " + allInsn_arm64.mnemonic + " " + allInsn_arm64.opStr);
}
Log.e("CAPSTONE-ARM-64", "=========== ARM-64 反汇编引擎使用 =========结束==");
}
} --------------------------------------------------------------------------------------
Android App示例代码下载:http://pan.baidu.com/s/1hrJKYeK 密码:h63p
Capstone和jna相关代码下载: http://pan.baidu.com/s/1bFn5Wq 密码:xd5m
参考:
如何利用Capstone引擎写一个Android反汇编工具 http://www.freebuf.com/sectool/88799.html
Capstone官方主页: http://www.capstone-engine.org
linux ndk包下载: http://dl.google.com/android/ndk/android-ndk-r10e-linux-x86_64.bin
Capstone Java bindings : https://capstone-engine.github.io/download/3.0.4/capstone.jar
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|