ts-capstone
Version:
This module provides bindings for the Capstone disassembly framework.
184 lines (180 loc) • 4.16 kB
text/typescript
import { expect, test } from 'bun:test';
import CS from '../../capstone';
test('CS.ARCH_X86', () => {
const buffer = new Uint8Array([
0x8d, 0x4c, 0x32, 0x08, 0x01, 0xd8, 0x81, 0xc6, 0x34, 0x12, 0x00, 0x00,
0x05, 0x23, 0x01, 0x00, 0x00, 0x36, 0x8b, 0x84, 0x91, 0x23, 0x01, 0x00,
0x00, 0x41, 0x8d, 0x84, 0x39, 0x89, 0x67, 0x00, 0x00, 0x8d, 0x87, 0x89,
0x67, 0x00, 0x00, 0xb4, 0xc6, 0x66, 0xe9, 0xb8, 0x00, 0x00, 0x00, 0x67,
0xff, 0xa0, 0x23, 0x01, 0x00, 0x00, 0x66, 0xe8, 0xcb, 0x00, 0x00, 0x00,
0x74, 0xfc,
]);
const disassembler = new CS.CAPSTONE(CS.ARCH_X86, CS.MODE_16);
disassembler.option(CS.OPT_DETAIL, true);
const insns = disassembler.disasm(buffer, 0x1000);
//console.log(require('util').inspect(insns, { depth: null }));
expect(
insns.map(({ id, address, size, mnemonic, op_str, bytes }) => ({
id,
address,
size,
mnemonic,
op_str,
bytes,
})),
).toEqual([
{
id: 332,
address: 4096,
size: 3,
mnemonic: 'lea',
op_str: 'cx, [si + 0x32]',
bytes: new Uint8Array([141, 76, 50]),
},
{
id: 512,
address: 4099,
size: 2,
mnemonic: 'or',
op_str: 'byte ptr [bx + di], al',
bytes: new Uint8Array([8, 1]),
},
{
id: 15,
address: 4101,
size: 4,
mnemonic: 'fadd',
op_str: 'dword ptr [bx + di + 0x34c6]',
bytes: new Uint8Array([216, 129, 198, 52]),
},
{
id: 6,
address: 4105,
size: 2,
mnemonic: 'adc',
op_str: 'al, byte ptr [bx + si]',
bytes: new Uint8Array([18, 0]),
},
{
id: 8,
address: 4107,
size: 2,
mnemonic: 'add',
op_str: 'byte ptr [di], al',
bytes: new Uint8Array([0, 5]),
},
{
id: 24,
address: 4109,
size: 2,
mnemonic: 'and',
op_str: 'ax, word ptr [bx + di]',
bytes: new Uint8Array([35, 1]),
},
{
id: 8,
address: 4111,
size: 2,
mnemonic: 'add',
op_str: 'byte ptr [bx + si], al',
bytes: new Uint8Array([0, 0]),
},
{
id: 460,
address: 4113,
size: 5,
mnemonic: 'mov',
op_str: 'ax, word ptr ss:[si + 0x2391]',
bytes: new Uint8Array([54, 139, 132, 145, 35]),
},
{
id: 8,
address: 4118,
size: 2,
mnemonic: 'add',
op_str: 'word ptr [bx + si], ax',
bytes: new Uint8Array([1, 0]),
},
{
id: 8,
address: 4120,
size: 3,
mnemonic: 'add',
op_str: 'byte ptr [bx + di - 0x73], al',
bytes: new Uint8Array([0, 65, 141]),
},
{
id: 734,
address: 4123,
size: 2,
mnemonic: 'test',
op_str: 'byte ptr [bx + di], bh',
bytes: new Uint8Array([132, 57]),
},
{
id: 460,
address: 4125,
size: 3,
mnemonic: 'mov',
op_str: 'word ptr [bx], sp',
bytes: new Uint8Array([137, 103, 0]),
},
{
id: 8,
address: 4128,
size: 4,
mnemonic: 'add',
op_str: 'byte ptr [di - 0x7679], cl',
bytes: new Uint8Array([0, 141, 135, 137]),
},
{
id: 8,
address: 4132,
size: 3,
mnemonic: 'add',
op_str: 'byte ptr [eax], al',
bytes: new Uint8Array([103, 0, 0]),
},
{
id: 460,
address: 4135,
size: 2,
mnemonic: 'mov',
op_str: 'ah, 0xc6',
bytes: new Uint8Array([180, 198]),
},
{
id: 172,
address: 4137,
size: 6,
mnemonic: 'jmp',
op_str: '0x10e7',
bytes: new Uint8Array([102, 233, 184, 0, 0, 0]),
},
{
id: 172,
address: 4143,
size: 7,
mnemonic: 'jmp',
op_str: 'word ptr [eax + 0x123]',
bytes: new Uint8Array([103, 255, 160, 35, 1, 0, 0]),
},
{
id: 62,
address: 4150,
size: 6,
mnemonic: 'call',
op_str: '0x1107',
bytes: new Uint8Array([102, 232, 203, 0, 0, 0]),
},
{
id: 260,
address: 4156,
size: 2,
mnemonic: 'je',
op_str: '0x103a',
bytes: new Uint8Array([116, 252]),
},
]);
disassembler.close();
});