Capstone反汇编
capstone线性反汇编
/* Linearly disassemble a given binary using Capstone. */
#include <stdio.h>
#include <string>
#include <capstone/capstone.h>
#include "../inc/loader.h"
int
disasm(Binary *bin)
{
//capstone实例(句柄)
csh dis;
cs_insn *insns;
Section *text;
size_t n;
//一个指向.text的指针
text = bin->get_text_section();
if(!text) {
fprintf(stderr, "Nothing to disassemble\n");
return 0;
}
//初始化dis,反汇编x86程序,并且代码是64位
if(cs_open(CS_ARCH_X86, CS_MODE_64, &dis) != CS_ERR_OK) {
fprintf(stderr, "Failed to open Capstone\n");
return -1;
}
//反汇编的函数,需要字节数以及大小从内存中申请缓冲区,0代表反汇编指令的个数(尽可能多)
n = cs_disasm(dis, text->bytes, text->size, text->vma, 0, &insns);
if(n <= 0) {
fprintf(stderr, "Disassembly error: %s\n", cs_strerror(cs_errno(dis)));
return -1;
}
for(size_t i = 0; i < n; i++) {
printf("0x%016jx: ", insns[i].address);
for(size_t j = 0; j < 16; j++) {
if(j < insns[i].size) printf("%02x ", insns[i].bytes[j]);
else printf(" ");
}
printf("%-12s %s\n", insns[i].mnemonic, insns[i].op_str);
}
cs_free(insns, n);
cs_close(&dis);
return 0;
}
int
main(int argc, char *argv[])
{
Binary bin;
std::string fname;
if(argc < 2) {
printf("Usage: %s <binary>\n", argv[0]);
return 1;
}
fname.assign(argv[1]);
//diliver name to function load_binary
if(load_binary(fname, &bin, Binary::BIN_TYPE_AUTO) < 0) {
return 1;
}
//bin->func disasm
if(disasm(&bin) < 0) {
return 1;
}
unload_binary(&bin);
return 0;
}
cs_insn结构
//反汇编的函数,需要字节数以及大小从内存中申请缓冲区,0代表反汇编指令的个数(尽可能多)
n = cs_disasm(dis, text->bytes, text->size, text->vma, 0, &insns);
insns的地址作为cs_disasm函数的最后一个参数。
在对代码缓冲物反汇编时,cs_disasm将构建一个反汇编指令的数组,指令以insns的形式返回这个数组。
insn结构体
typedef struct cs_insn{
unsigned int id;//指令类型(体系)唯一标识符
uint64_t address;//指令地址
uint16_t size;//字节数
uint8_t bytes[16];//字节
char mnemonic[32];//可读形式的指令字符串
char op_str[160];//指令操作数的可读表示
cs_detail *deail;//包含反汇编指令的更详细的信息(寄存器的值),在开启capstone的详细反汇编时使用
}cs_insn;
capstone.h是capstone的头文件,包含所有的capstone API函数的注释定义和体系结构无关的数据结构信息,如cs_insn和cs_err