吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 7728|回复: 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] 纯文本查看 复制代码
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

看看,,,什么好东西!
3#
fengrui99 发表于 2017-4-26 11:03
4#
md5 发表于 2017-4-26 12:09
欢迎分析讨论交流,吾爱破解论坛有你更精彩!
5#
shz108j 发表于 2017-4-26 16:53
感谢分享的
6#
yssun 发表于 2017-4-26 17:42
感谢分享的a
7#
乖乖黑娃娃 发表于 2017-4-26 20:32
学习了一下知识
8#
WANGYUBIN 发表于 2017-4-27 09:58
好骚的代码呀!
9#
夏520 发表于 2017-4-27 16:46
收下了,谢谢楼主分享

楼主,请问你,我的一个汽车中控BIN文件,你能还解包,是安卓类的!
10#
疯疯传说 发表于 2017-4-27 20:24
分析讨论交流,吾爱破解论坛有你更精彩!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-22 00:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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