Linux capstone 反汇编引擎使用方法

news/2024/11/8 0:06:26/

最进在研究反汇编引擎,在google看到capstone反汇编工具,据说是IDA都使用了capstone的引擎,记录一下;
capstone 官方网站:http://www.capstone-engine.org/
github源码下载:https://github.com/aquynh/capstone
capstone在架构兼容性上来说是非常丰富了:Multi-architectures: Arm, Arm64 (Armv8), BPF, Ethereum Virtual Machine, M68K, M680X, Mips, MOS65XX, PowerPC, RISCV, Sparc, SystemZ, TMS320C64X, Web Assembly, XCore & X86 (include X86_64)

1.实测解码的速率并不是很快(原因是printf直接把信息往外丢,去掉prinf直接写文件14M内存bin文件耗时5s左右,甚至比intel-xed还快);
2.需要使用动态内存,从代码实现来看,传入文件多大就需要申请多大的内存,还要给disam buffer分配内存;
3.代码架构比较复杂,改造成本还是比较高;

下载源码之后:

//解压文件
curtis@curtis-virtual-machine:~/Desktop$ unzip capstone-master.zip//编译文件
curtis@curtis-virtual-machine:~/Desktop/capstone-master$ ./make.sh
.........省略..........
make[1]: Leaving directory `/home/curtis/Desktop/capstone-master/tests'
make -C suite/fuzz
make[1]: Entering directory `/home/curtis/Desktop/capstone-master/suite/fuzz'CC      fuzz_disasm.oCC      drivermc.oCC      driverbin.oLINK    fuzz_disasmLINK    fuzz_bindisasm
make[1]: Leaving directory `/home/curtis/Desktop/capstone-master/suite/fuzz'
install -m0755 ./libcapstone.so.5 ./tests/
cd ./tests/ && rm -f libcapstone.so && ln -s libcapstone.so.5 libcapstone.so//安装引擎,创建文件夹,把对应的库安装好,安装cstool工具
curtis@curtis-virtual-machine:~/Desktop/capstone-master$ sudo ./make.sh install
mkdir -p /usr/lib
install -m0755 ./libcapstone.so.5 /usr/lib
cd /usr/lib && rm -f libcapstone.so && ln -s libcapstone.so.5 libcapstone.so
install -m0644 ./libcapstone.a /usr/lib
mkdir -p /usr/include/capstone
install -m0644 include/capstone/*.h /usr/include/capstone
mkdir -p /usr/lib/pkgconfig
install -m0644 ./capstone.pc /usr/lib/pkgconfig
mkdir -p /usr/bin
install -m0755 cstool/cstool /usr/bin//capstone so&a 库大小
curtis@curtis-virtual-machine:/usr/lib$ ls -alh | grep capstone
-rw-r--r--   1 root root     5.7M 10月 26 17:57 libcapstone.a
lrwxrwxrwx   1 root root       16 10月 26 17:57 libcapstone.so -> libcapstone.so.5
-rwxr-xr-x   1 root root     4.4M 10月 26 17:57 libcapstone.so.5//输出ins.asm大小
curtis@curtis-virtual-machine:~/Desktop$ ls -alh | grep ins.asm
-rwxr-xr-x  1 curtis curtis 395M 10月 28 10:40 ins.asm//卸载capstone
curtis@curtis-virtual-machine:~/Desktop/capstone-master$ sudo ./make.sh uninstall
[sudo] password for curtis: 
rm -rf /usr/include/capstone
rm -f /usr/lib/libcapstone.*
rm -f /usr/lib/pkgconfig/capstone.pc
rm -f /usr/bin/cstool

这里先讲讲cstool工具的具体使用方法;

curtis@curtis-virtual-machine:~/Desktop/capstone-master$ cstool
Cstool for Capstone Disassembler Engine v5.0.0Syntax: cstool [-u|-d|-s|-v] <arch+mode> <assembly-hexstring> [start-address-in-hex-format]The following <arch+mode> options are supported:x16         16-bit mode (X86)x32         32-bit mode (X86)x64         64-bit mode (X86)x16att      16-bit mode (X86), syntax AT&Tx32att      32-bit mode (X86), syntax AT&Tx64att      64-bit mode (X86), syntax AT&Tarm         armarmbe       arm + big endianthumb       thumb modethumbbe     thumb + big endiancortexm     thumb + cortex-m extensionsarm64       aarch64 modearm64be     aarch64 + big endianmips        mips32 + little endianmipsbe      mips32 + big endianmips64      mips64 + little endianmips64be    mips64 + big endianppc64       ppc64 + little endianppc64be     ppc64 + big endiansparc       sparcsystemz     systemz (s390x)xcore       xcorem68k        m68k + big endianm68k40      m68k_040tms320c64x  TMS320C64xm6800       M6800/2m6801       M6801/3m6805       M6805m6808       M68HC08m6809       M6809m6811       M68HC11cpu12       M68HC12/HCS12hd6301      HD6301/3hd6309      HD6309hcs08       HCS08evm         Ethereum Virtual Machinemos65xx     MOS65XX familyExtra options:-d show detailed information of the instructions-u show immediates as unsigned-s decode in SKIPDATA mode-v show version & Capstone core build info

再看看REME中的具体实施例;

$cstool x32 "90 91"

也就是选择好cstool参数之后输入需要反汇汇编的编码;

//举个例子,想要看x86_64编码所对应的汇编代码:
488d 2551 3f60 01e8 d400 0000 488d 3ded ffff ff56 e8d7 0100 005e 4805 0060 f203 eb20 0f1f 4000 662e 0f1f 8400 0000 0000 e8ab 0000 0056 e8c5 1f00 005e 4805 00a0
curtis@curtis-virtual-machine:~/Desktop/capstone-master/cstool$ cstool -u x64 "488d 2551 3f60 01e8 d400 0000 488d 3ded ffff ff56 e8d7 0100 005e 4805 0060 f203 eb20 0f1f 4000 662e 0f1f 8400 0000 0000 e8ab 0000 0056 e8c5 1f00 005e 4805 00a0"0  48 8d 25 51 3f 60 01                             lea	rsp, [rip + 0x1603f51]7  e8 d4 00 00 00                                   call	0xe0c  48 8d 3d ed ff ff ff                             lea	rdi, [rip - 0x13]
13  56                                               push	rsi
14  e8 d7 01 00 00                                   call	0x1f0
19  5e                                               pop	rsi
1a  48 05 00 60 f2 03                                add	rax, 0x3f26000
20  eb 20                                            jmp	0x42
22  0f 1f 40 00                                      nop	dword ptr [rax]
26  66 2e 0f 1f 84 00 00 00 00 00                    nop	word ptr cs:[rax + rax]
30  e8 ab 00 00 00                                   call	0xe0
35  56                                               push	rsi
36  e8 c5 1f 00 00                                   call	0x2000
3b  5e                                               pop	rsi
//成功反汇编出汇编代码

使用intel-xed反汇编同一编码;

curtis@curtis-virtual-machine:~/Desktop$ cat 11.txt | head -n 14
XDIS 0: MISC      BASE       488D25513F6001           lea rsp, ptr [rip+0x1603f51]
XDIS 7: CALL      BASE       E8D4000000               call 0xe0
XDIS c: MISC      BASE       488D3DEDFFFFFF           lea rdi, ptr [rip-0x13]
XDIS 13: PUSH      BASE       56                       push rsi
XDIS 14: CALL      BASE       E8D7010000               call 0x1f0
XDIS 19: POP       BASE       5E                       pop rsi
XDIS 1a: BINARY    BASE       48050060F203             add rax, 0x3f26000
XDIS 20: UNCOND_BR BASE       EB20                     jmp 0x42
XDIS 22: WIDENOP   BASE       0F1F4000                 nop dword ptr [rax], eax
XDIS 26: WIDENOP   BASE       662E0F1F840000000000     nop word ptr [rax+rax*1], ax
XDIS 30: CALL      BASE       E8AB000000               call 0xe0
XDIS 35: PUSH      BASE       56                       push rsi
XDIS 36: CALL      BASE       E8C51F0000               call 0x2000
XDIS 3b: POP       BASE       5E                       pop rsi

1.打算添加两个功能,将传入code的参数改为传入文件的路径,反汇编时只需要传入文件路径即可;
2.添加输出参数,将反汇编代码写入文件;
3.添加一个参数,只要传入内存地址即可把该地址前后10条汇编指令打印出来;

功能一已经实现,代码就不公开了,效果如下:

curtis@curtis-virtual-machine:~/Desktop/capstone-master/cstool$ ./cstool -u x64 "/home/curtis/Desktop/ins.txt"0  0f 1f 44 00 00                                   nop	dword ptr [rax + rax]5  55                                               push	rbp6  48 89 e5                                         mov	rbp, rsp9  5d                                               pop	rbpa  c3                                               ret	b  0f 1f 44 00 00                                   nop	dword ptr [rax + rax]

功能二已经实现,代码就不公开了,效果如下:

//命令
curtis@curtis-virtual-machine:~/Desktop/capstone-master/cstool$ ./cstool -u x64 "/home/curtis/Desktop/ins.txt" -o "/home/curtis/Desktop/ins.asm"
//效果,成功将内容写入文件
curtis@curtis-virtual-machine:~/Desktop/capstone-master/cstool$ cat /home/curtis/Desktop/ins.asm 
0x 0   48 8d 25 51 3f 60 01                           lea	rsp, [rip + 0x1603f51]
0x 7   e8 d4 00 00 00                                 call	0xe0
0x c   48 8d 3d ed ff ff ff                           lea	rdi, [rip - 0x13]
0x13   56                                             push	rsi
0x14   e8 d7 01 00 00                                 call	0x1f0
0x19   5e                                             pop	rsi
0x1a   48 05 00 60 b2 1e                              add	rax, 0x1eb26000
0x20   eb 20                                          jmp	0x42
0x22   0f 1f 40 00                                    nop	dword ptr [rax]

在实现这个功能的过程中发现如果使用-u参数的话,从添加log打印,代码已经限定count的值位312,那么如果你传入参数size大于312条汇编指令的话,剩余部分没有进行反汇编操作,仔细研究capstone代码之后,我们应该使用-s参数进行反汇编;

curtis@curtis-virtual-machine:~/Desktop/capstone-master/cstool$ ./cstool -s x64 "/home/curtis/Desktop/ins.txt"
0x 0   48 8d 25 51 3f 60 01                           lea	rsp, [rip + 0x1603f51]
0x 7   e8 d4 00 00 00                                 call	0xe0
0x c   48 8d 3d ed ff ff ff                           lea	rdi, [rip - 0x13]
0x13   56                                             push	rsi
0x14   e8 d7 01 00 00                                 call	0x1f0
0x19   5e                                             pop	rsi
0x1a   48 05 00 60 b2 1e                              add	rax, 0x1eb26000
0x20   eb 20                                          jmp	0x42
0x22   0f 1f 40 00                                    nop	dword ptr [rax]
.......省略.........
0x447b4  e8 27 2d 03 00                               call	0x774e0
0x447b9  66 90                                        nop	
0x447bb  41 83 fc 02                                  cmp	r12d, 2
0x447bf  0f 8e 6f ff ff ff                            jle	0x44734
0x447c5  48 8d 7b 18                                  lea	rdi, [rbx + 0x18]
0x447c9  e8 d2 fd ff ff                               call	0x445a0
0x447ce  e9 61 ff ff ff                               jmp	0x44734
0x447d3  48 8b 05 12 e1 7f 01                         mov	rax, qword ptr [rip + 0x17fe112]

http://www.ppmy.cn/news/223660.html

相关文章

LCD 的接口类型详解

LCD 的接口有多种&#xff0c;分类很细。主要看 LCD 的驱动方式和控制方式&#xff0c;目前 手机上的彩色 LCD 的连接方式一般有这么几种&#xff1a; MCU 模式&#xff0c; RGB 模式&#xff0c; SPI 模式&#xff0c; VSYNC 模式&#xff0c; MDDI 模式&#xff0c; DSI 模式…

Lcd(七)接口与驱动方式

LCD的接口有多种&#xff0c;分类很细。主要看LCD的驱动方式和控制方式&#xff0c;目前手机上的彩色LCD的连接方式一般有这么几种&#xff1a;MCU模式&#xff0c;RGB模式&#xff0c;SPI模式&#xff0c;VSYNC模式&#xff0c;MDDI模式&#xff0c;DSI模式。MCU模式(也写成MP…

HP DL580 G8 做RAID

1.进入系统开机界面 选择F10 2.进入配置界面选择HPE Smart Storage Administrator 3. 选择Smart Array P440ar 4.选择configure 5.选择create Array 创建raid 6. 选择raid硬盘 7.选择raid级别 8.完成raid配置 9.选择Set Bootable logical Drive/Volume 10.选择本地 11. 查看配置…

LCD的接口类型详解

LCD的接口类型详解 LCD的接口有多种,分类很细。主要看LCD的驱动方式和控制方式,目前手机上的彩色LCD的连接方式一般有这么几种:MCU模式,RGB模式,SPI模式,VSYNC模式,MDDI模式,DSI模式。MCU模式(也写成MPU模式的)。只有TFT模块才有RGB接口。 但应用比较多的就是MUC模式…

6800和8080两种模式的理解

LCD显示模块的外部接口一般采用并行方式,并行接口接口线的读写时序常见以下两种模式: (1)8080模式。 这类模式通常有下列接口信号:Vcc(工作主电源)Vss(公共端)Vee(偏置负电源,常用于调整显示对比度)/RES,复位线。   DB0~DB7,双向数据线。D/I,数据/指令选择线(1:数据读写,0:命…

通信教程 | 8080和6800通信接口的区别

关注星标公众号&#xff0c;不错过精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 用过LCD的同学应该都知道&#xff0c;LCD有两种常见的接口&#xff0c;那就是 8080 和 6800 接口。 今天来说说在LCD中使用的 8080 和 6800 接口的来源&#xff0c;以及它们的区别。…

casbin基于RBAC的权限管理案例

在RBAC模型中新定义了角色和继承关系&#xff0c;用户可以通过角色区分不同的权限&#xff0c;继承不同的角色时用户有多个权限。 [role_definition] g _, _ g2 _, _g 是一个 RBAC系统, g2 是另一个 RBAC 系统。 _, _表示角色继承关系的前项和后项&#xff0c;即前项继承后项…

简单的并口协议:8080和6800

简单的并口协议&#xff1a;8080和6800 PC处理器的萌芽时期&#xff0c;MOTOROLA的M6800和INTEL的I8080就成为当时微处理器的杰出代表而在随后几十年间广泛应用于工业及控制领域&#xff0c;不过MOTOROLA的强项不在微处理器设计上&#xff0c;后来又出来的M6800也不能挽回失地&…