Capstone反汇编


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;
}

image-20221030211443172

cs_insn结构

//反汇编的函数,需要字节数以及大小从内存中申请缓冲区,0代表反汇编指令的个数(尽可能多)
  n = cs_disasm(dis, text->bytes, text->size, text->vma, 0, &insns);

insns的地址作为cs_disasm函数的最后一个参数。

在对代码缓冲物反汇编时,cs_disasm将构建一个反汇编指令的数组,指令以insns的形式返回这个数组。

insn结构体

image-20221030211654627

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

image-20221030220423446


文章作者: 尘落
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 尘落 !
评论
  目录