文章目录
- 前言
- 一、Capstone简介
- 二、示例代码
前言
介绍了capstone反汇编引擎的用法
一、Capstone简介
Capstone 是一个轻量级的多平台、多架构的反汇编框架,用纯 C 语言实现。可以说它是如今世界上最优秀的反汇编引擎,IDA,Radare2,Qemu等著名项目都使用了Capstone Engine,所以选择它来开发是一个不错的选择。
Capstone官网: http://www.capstone-engine.org
二、示例代码
#include <iostream>
#include <stdio.h>
#include <cinttypes>
#include "capstone.h"
using namespace std;#define CODE "\x55\x48\x8b\x05\xb8\x13\x00\x00"int main(void)
{csh handle; // 生成调用capstone API的句柄cs_insn* insn; // 存储指令的详细信息size_t count;/*** 初始化cs句柄* arch: 架构类型 (CSARCH)* mode: 硬件模式. CSMODE在cs_mode数据类型中可查* handle: 指向句柄, 返回时更新* return: 创建成功返回CS_ERR_OK,否则返回cs_err枚举中对应的错误信息*/if (cs_open(CS_ARCH_X86, CS_MODE_64, &handle)) {printf("ERROR: Failed to initialize engine!\n");return -1;}/*** 给定缓冲区、大小、地址和编号,反编译机器码* handle: cs_open()返回的句柄* code: 包含要反汇编的机器码的缓冲区。* code_size:上面代码缓冲区的大小。* address:给定原始代码缓冲区中的第一条指令的地址。* insn: 由这个API填写的指令数组。注意: insn将由这个函数分配,应该用cs_free () API释放* count: 需要分解的指令数量,或输入0分解所有指令* return:成功反汇编指令的数量,如果该函数未能反汇编给定的代码,则为0,失败时,调用cs_errno()获取错误代码。*/count = cs_disasm(handle, (unsigned char*)CODE, sizeof(CODE) - 1, 0x1000, 0, &insn);if (count) {size_t j;for (j = 0; j < count; j++) {printf("0x%""Ix"":\t%s\t\t%s\n", insn[j].address, insn[j].mnemonic, insn[j].op_str);}cs_free(insn, count);}elseprintf("ERROR: Failed to disassemble given code!\n");/*** 释放句柄* handle: 指向一个cs_open()打开的句柄* return: 释放成功返回CS_ERR_OK,否则返回cs_err枚举的错误信息*/cs_close(&handle);return 0;
}
更多API介绍请参考:
- Capstone反汇编引擎数据类型及API分析与示例(一)
- Capstone反汇编引擎数据类型及API分析及示例(二)
- Capstone反汇编引擎数据类型及API分析及示例(三)
- Capstone反汇编引擎数据类型及API分析及示例(四)