Merge branch 'master' of https://github.com/joxeankoret/capstone into hexcode
This commit is contained in:
commit
c45b1588ef
|
@ -135,6 +135,7 @@ class _cs_insn(ctypes.Structure):
|
||||||
('regs_write_count', ctypes.c_uint),
|
('regs_write_count', ctypes.c_uint),
|
||||||
('groups', ctypes.c_uint * 8),
|
('groups', ctypes.c_uint * 8),
|
||||||
('groups_count', ctypes.c_uint),
|
('groups_count', ctypes.c_uint),
|
||||||
|
('hex_code', ctypes.c_ubyte * 15),
|
||||||
('arch', _cs_arch),
|
('arch', _cs_arch),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -197,6 +198,7 @@ class cs_insn:
|
||||||
self.regs_read = all_info.regs_read[:all_info.regs_read_count]
|
self.regs_read = all_info.regs_read[:all_info.regs_read_count]
|
||||||
self.regs_write = all_info.regs_write[:all_info.regs_write_count]
|
self.regs_write = all_info.regs_write[:all_info.regs_write_count]
|
||||||
self.groups = all_info.groups[:all_info.groups_count]
|
self.groups = all_info.groups[:all_info.groups_count]
|
||||||
|
self.hex_code = bytearray(all_info.hex_code)[:self.size]
|
||||||
|
|
||||||
if arch == CS_ARCH_ARM:
|
if arch == CS_ARCH_ARM:
|
||||||
(self.cc, self.update_flags, self.writeback, self.operands) = \
|
(self.cc, self.update_flags, self.writeback, self.operands) = \
|
||||||
|
@ -215,7 +217,6 @@ class cs_insn:
|
||||||
self.raw_insn = all_info
|
self.raw_insn = all_info
|
||||||
self.csh = csh
|
self.csh = csh
|
||||||
|
|
||||||
|
|
||||||
def errno():
|
def errno():
|
||||||
return _cs.cs_errno(self.csh)
|
return _cs.cs_errno(self.csh)
|
||||||
|
|
||||||
|
@ -254,7 +255,6 @@ class cs_insn:
|
||||||
raise ValueError("Error: Failed to initialize!")
|
raise ValueError("Error: Failed to initialize!")
|
||||||
return _cs.cs_op_index(self.csh, self.raw_insn, op_type, position)
|
return _cs.cs_op_index(self.csh, self.raw_insn, op_type, position)
|
||||||
|
|
||||||
|
|
||||||
class cs:
|
class cs:
|
||||||
def __init__(self, arch, mode):
|
def __init__(self, arch, mode):
|
||||||
self.arch, self.mode = arch, mode
|
self.arch, self.mode = arch, mode
|
||||||
|
@ -279,7 +279,6 @@ class cs:
|
||||||
if res > 0:
|
if res > 0:
|
||||||
for i in xrange(res):
|
for i in xrange(res):
|
||||||
yield cs_insn(self.csh, all_insn[i], self.arch)
|
yield cs_insn(self.csh, all_insn[i], self.arch)
|
||||||
|
|
||||||
_cs.cs_free(all_insn)
|
_cs.cs_free(all_insn)
|
||||||
else:
|
else:
|
||||||
yield []
|
yield []
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
# Capstone Python bindings, by Nguyen Anh Quynnh <aquynh@gmail.com>
|
# Capstone Python bindings, by Nguyen Anh Quynnh <aquynh@gmail.com>
|
||||||
|
|
||||||
from capstone import *
|
from capstone import *
|
||||||
|
import binascii
|
||||||
|
|
||||||
X86_CODE16 = "\x8d\x4c\x32\x08\x01\xd8\x81\xc6\x34\x12\x00\x00"
|
X86_CODE16 = "\x8d\x4c\x32\x08\x01\xd8\x81\xc6\x34\x12\x00\x00"
|
||||||
X86_CODE32 = "\x8d\x4c\x32\x08\x01\xd8\x81\xc6\x34\x12\x00\x00"
|
X86_CODE32 = "\x8d\x4c\x32\x08\x01\xd8\x81\xc6\x34\x12\x00\x00"
|
||||||
|
@ -62,7 +63,8 @@ def test_class():
|
||||||
|
|
||||||
all_ins = list(md.disasm(code, 0x1000))
|
all_ins = list(md.disasm(code, 0x1000))
|
||||||
for insn in all_ins:
|
for insn in all_ins:
|
||||||
print("0x%x:\t%s\t%s" %(insn.address, insn.mnemonic, insn.op_str))
|
hex_code = binascii.hexlify(insn.hex_code)
|
||||||
|
print("0x%x:\t%s\t%s\t%s" %(insn.address, insn.mnemonic, insn.op_str, hex_code))
|
||||||
|
|
||||||
print("0x%x:" % (all_ins[-1].address + all_ins[-1].size))
|
print("0x%x:" % (all_ins[-1].address + all_ins[-1].size))
|
||||||
print
|
print
|
||||||
|
|
18
cs.c
18
cs.c
|
@ -168,7 +168,7 @@ cs_err cs_close(csh handle)
|
||||||
|
|
||||||
// fill insn with mnemonic & operands info
|
// fill insn with mnemonic & operands info
|
||||||
static void fill_insn(cs_struct *handle, cs_insn *insn, char *buffer, MCInst *mci,
|
static void fill_insn(cs_struct *handle, cs_insn *insn, char *buffer, MCInst *mci,
|
||||||
PostPrinter_t printer)
|
PostPrinter_t printer, unsigned char *code)
|
||||||
{
|
{
|
||||||
memcpy(insn, &mci->pub_insn, sizeof(*insn));
|
memcpy(insn, &mci->pub_insn, sizeof(*insn));
|
||||||
|
|
||||||
|
@ -194,6 +194,9 @@ static void fill_insn(cs_struct *handle, cs_insn *insn, char *buffer, MCInst *mc
|
||||||
|
|
||||||
strncpy(insn->mnemonic, buffer, sizeof(insn->mnemonic) - 1);
|
strncpy(insn->mnemonic, buffer, sizeof(insn->mnemonic) - 1);
|
||||||
insn->mnemonic[sizeof(insn->mnemonic) - 1] = '\0';
|
insn->mnemonic[sizeof(insn->mnemonic) - 1] = '\0';
|
||||||
|
|
||||||
|
// fill the instruction bytes
|
||||||
|
memcpy(insn->hex_code, code, MIN(sizeof(insn->hex_code), insn->size));
|
||||||
}
|
}
|
||||||
|
|
||||||
cs_err cs_option(csh ud, cs_opt_type type, size_t value)
|
cs_err cs_option(csh ud, cs_opt_type type, size_t value)
|
||||||
|
@ -252,7 +255,7 @@ size_t cs_disasm(csh ud, unsigned char *buffer, size_t size, uint64_t offset, si
|
||||||
mci.mode = handle->mode;
|
mci.mode = handle->mode;
|
||||||
handle->printer(&mci, &ss, handle->printer_info);
|
handle->printer(&mci, &ss, handle->printer_info);
|
||||||
|
|
||||||
fill_insn(handle, insn, ss.buffer, &mci, handle->post_printer);
|
fill_insn(handle, insn, ss.buffer, &mci, handle->post_printer, buffer);
|
||||||
|
|
||||||
c++;
|
c++;
|
||||||
insn++;
|
insn++;
|
||||||
|
@ -264,8 +267,9 @@ size_t cs_disasm(csh ud, unsigned char *buffer, size_t size, uint64_t offset, si
|
||||||
if (c == count)
|
if (c == count)
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
} else // face a broken instruction?
|
} else { // face a broken instruction?
|
||||||
return c;
|
return c;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return c;
|
return c;
|
||||||
|
@ -304,7 +308,7 @@ size_t cs_disasm_dyn(csh ud, unsigned char *buffer, size_t size, uint64_t offset
|
||||||
mci.mode = handle->mode;
|
mci.mode = handle->mode;
|
||||||
handle->printer(&mci, &ss, handle->printer_info);
|
handle->printer(&mci, &ss, handle->printer_info);
|
||||||
|
|
||||||
fill_insn(handle, &insn_cache[f], ss.buffer, &mci, handle->post_printer);
|
fill_insn(handle, &insn_cache[f], ss.buffer, &mci, handle->post_printer, buffer);
|
||||||
f++;
|
f++;
|
||||||
|
|
||||||
if (f == ARR_SIZE(insn_cache)) {
|
if (f == ARR_SIZE(insn_cache)) {
|
||||||
|
@ -330,8 +334,10 @@ size_t cs_disasm_dyn(csh ud, unsigned char *buffer, size_t size, uint64_t offset
|
||||||
|
|
||||||
if (count > 0 && c == count)
|
if (count > 0 && c == count)
|
||||||
break;
|
break;
|
||||||
} else // encounter a broken instruction
|
} else { // encounter a broken instruction
|
||||||
break;
|
// XXX: TODO: JOXEAN continue here
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (f) {
|
if (f) {
|
||||||
|
|
|
@ -11,6 +11,8 @@ extern "C" {
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
|
||||||
|
|
||||||
// Handle using with all API
|
// Handle using with all API
|
||||||
typedef size_t csh;
|
typedef size_t csh;
|
||||||
|
|
||||||
|
@ -82,6 +84,8 @@ typedef struct cs_insn {
|
||||||
unsigned int groups[8]; // list of group this instruction belong to
|
unsigned int groups[8]; // list of group this instruction belong to
|
||||||
unsigned int groups_count; // number of groups this insn belongs to
|
unsigned int groups_count; // number of groups this insn belongs to
|
||||||
|
|
||||||
|
unsigned char hex_code[15]; // bytes of the instruction
|
||||||
|
|
||||||
// Architecture-specific instruction info
|
// Architecture-specific instruction info
|
||||||
union {
|
union {
|
||||||
cs_x86 x86; // X86 architecture, including 16-bit, 32-bit & 64-bit mode
|
cs_x86 x86; // X86 architecture, including 16-bit, 32-bit & 64-bit mode
|
||||||
|
|
|
@ -179,7 +179,7 @@ static void test()
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test();
|
test();
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
#define offsetof(type, member) (int)(&((type *)0)->member)
|
#define offsetof(type, member) (int)(&((type *)0)->member)
|
||||||
|
|
Loading…
Reference in New Issue