吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8085|回复: 9
收起左侧

[Android 分享] Android平台下使用Capstone反汇编引擎(HEX转ARM64)

[复制链接]
alpha007 发表于 2017-4-26 10:36
本帖最后由 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] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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


免费评分

参与人数 2吾爱币 +1 热心值 +2 收起 理由
thornfish + 1 + 1 用心讨论,共获提升!
md5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

end620 发表于 2017-4-26 10:39

看看,,,什么好东西!
fengrui99 发表于 2017-4-26 11:03
md5 发表于 2017-4-26 12:09
欢迎分析讨论交流,吾爱破解论坛有你更精彩!
shz108j 发表于 2017-4-26 16:53
感谢分享的
yssun 发表于 2017-4-26 17:42
感谢分享的a
乖乖黑娃娃 发表于 2017-4-26 20:32
学习了一下知识
WANGYUBIN 发表于 2017-4-27 09:58
好骚的代码呀!
头像被屏蔽
夏520 发表于 2017-4-27 16:46
提示: 作者被禁止或删除 内容自动屏蔽
疯疯传说 发表于 2017-4-27 20:24
分析讨论交流,吾爱破解论坛有你更精彩!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-4-6 12:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表