Rizin
unix-like reverse engineering framework and cli tools
test_detail.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <capstone/platform.h>
#include <capstone/capstone.h>

Go to the source code of this file.

Classes

struct  platform
 

Functions

static void print_string_hex (unsigned char *str, size_t len)
 
static void test ()
 
int main ()
 

Function Documentation

◆ main()

int main ( void  )

Definition at line 347 of file test_detail.c.

348 {
349  test();
350 
351  return 0;
352 }
static void test()
Definition: test_detail.c:31

References test().

◆ print_string_hex()

static void print_string_hex ( unsigned char *  str,
size_t  len 
)
static

Definition at line 20 of file test_detail.c.

21 {
22  unsigned char *c;
23 
24  printf("Code: ");
25  for (c = str; c < str + len; c++) {
26  printf("0x%02x ", *c & 0xff);
27  }
28  printf("\n");
29 }
size_t len
Definition: 6502dis.c:15
_Use_decl_annotations_ int __cdecl printf(const char *const _Format,...)
Definition: cs_driver.c:93
#define c(i)
Definition: sha256.c:43

References c, len, printf(), and cmd_descs_generate::str.

Referenced by test().

◆ test()

static void test ( )
static

Definition at line 31 of file test_detail.c.

32 {
33 #ifdef CAPSTONE_HAS_X86
34 #define X86_CODE16 "\x8d\x4c\x32\x08\x01\xd8\x81\xc6\x34\x12\x00\x00"
35 #define X86_CODE32 "\x8d\x4c\x32\x08\x01\xd8\x81\xc6\x34\x12\x00\x00"
36 #define X86_CODE64 "\x55\x48\x8b\x05\xb8\x13\x00\x00"
37 #endif
38 #ifdef CAPSTONE_HAS_ARM
39 #define ARM_CODE "\xED\xFF\xFF\xEB\x04\xe0\x2d\xe5\x00\x00\x00\x00\xe0\x83\x22\xe5\xf1\x02\x03\x0e\x00\x00\xa0\xe3\x02\x30\xc1\xe7\x00\x00\x53\xe3"
40 #define ARM_CODE2 "\x10\xf1\x10\xe7\x11\xf2\x31\xe7\xdc\xa1\x2e\xf3\xe8\x4e\x62\xf3"
41 #define THUMB_CODE "\x70\x47\xeb\x46\x83\xb0\xc9\x68"
42 #define THUMB_CODE2 "\x4f\xf0\x00\x01\xbd\xe8\x00\x88\xd1\xe8\x00\xf0"
43 #define THUMB_MCLASS "\xef\xf3\x02\x80"
44 #define ARMV8 "\xe0\x3b\xb2\xee\x42\x00\x01\xe1\x51\xf0\x7f\xf5"
45 #endif
46 #ifdef CAPSTONE_HAS_MIPS
47 #define MIPS_CODE "\x0C\x10\x00\x97\x00\x00\x00\x00\x24\x02\x00\x0c\x8f\xa2\x00\x00\x34\x21\x34\x56\x00\x80\x04\x08"
48 #define MIPS_CODE2 "\x56\x34\x21\x34\xc2\x17\x01\x00"
49 #define MIPS_32R6M "\x00\x07\x00\x07\x00\x11\x93\x7c\x01\x8c\x8b\x7c\x00\xc7\x48\xd0"
50 #define MIPS_32R6 "\xec\x80\x00\x19\x7c\x43\x22\xa0"
51 #endif
52 #ifdef CAPSTONE_HAS_ARM64
53 #define ARM64_CODE "\x09\x00\x38\xd5\xbf\x40\x00\xd5\x0c\x05\x13\xd5\x20\x50\x02\x0e\x20\xe4\x3d\x0f\x00\x18\xa0\x5f\xa2\x00\xae\x9e\x9f\x37\x03\xd5\xbf\x33\x03\xd5\xdf\x3f\x03\xd5\x21\x7c\x02\x9b\x21\x7c\x00\x53\x00\x40\x21\x4b\xe1\x0b\x40\xb9\x20\x04\x81\xda\x20\x08\x02\x8b\x10\x5b\xe8\x3c"
54 #endif
55 #ifdef CAPSTONE_HAS_POWERPC
56 #define PPC_CODE "\x80\x20\x00\x00\x80\x3f\x00\x00\x10\x43\x23\x0e\xd0\x44\x00\x80\x4c\x43\x22\x02\x2d\x03\x00\x80\x7c\x43\x20\x14\x7c\x43\x20\x93\x4f\x20\x00\x21\x4c\xc8\x00\x21\x40\x82\x00\x14"
57 #define PPC_CODE2 "\x10\x60\x2a\x10\x10\x64\x28\x88\x7c\x4a\x5d\x0f"
58 #endif
59 #ifdef CAPSTONE_HAS_SPARC
60 #define SPARC_CODE "\x80\xa0\x40\x02\x85\xc2\x60\x08\x85\xe8\x20\x01\x81\xe8\x00\x00\x90\x10\x20\x01\xd5\xf6\x10\x16\x21\x00\x00\x0a\x86\x00\x40\x02\x01\x00\x00\x00\x12\xbf\xff\xff\x10\xbf\xff\xff\xa0\x02\x00\x09\x0d\xbf\xff\xff\xd4\x20\x60\x00\xd4\x4e\x00\x16\x2a\xc2\x80\x03"
61 #define SPARCV9_CODE "\x81\xa8\x0a\x24\x89\xa0\x10\x20\x89\xa0\x1a\x60\x89\xa0\x00\xe0"
62 #endif
63 #ifdef CAPSTONE_HAS_SYSZ
64 #define SYSZ_CODE "\xed\x00\x00\x00\x00\x1a\x5a\x0f\x1f\xff\xc2\x09\x80\x00\x00\x00\x07\xf7\xeb\x2a\xff\xff\x7f\x57\xe3\x01\xff\xff\x7f\x57\xeb\x00\xf0\x00\x00\x24\xb2\x4f\x00\x78"
65 #endif
66 #ifdef CAPSTONE_HAS_XCORE
67 #define XCORE_CODE "\xfe\x0f\xfe\x17\x13\x17\xc6\xfe\xec\x17\x97\xf8\xec\x4f\x1f\xfd\xec\x37\x07\xf2\x45\x5b\xf9\xfa\x02\x06\x1b\x10"
68 #endif
69 #ifdef CAPSTONE_HAS_M68K
70 #define M68K_CODE "\xd4\x40\x87\x5a\x4e\x71\x02\xb4\xc0\xde\xc0\xde\x5c\x00\x1d\x80\x71\x12\x01\x23\xf2\x3c\x44\x22\x40\x49\x0e\x56\x54\xc5\xf2\x3c\x44\x00\x44\x7a\x00\x00\xf2\x00\x0a\x28"
71 #endif
72 #ifdef CAPSTONE_HAS_M680X
73 #define M680X_CODE "\x06\x10\x19\x1a\x55\x1e\x01\x23\xe9\x31\x06\x34\x55\xa6\x81\xa7\x89\x7f\xff\xa6\x9d\x10\x00\xa7\x91\xa6\x9f\x10\x00\x11\xac\x99\x10\x00\x39"
74 #endif
75 
76  struct platform platforms[] = {
77 #ifdef CAPSTONE_HAS_X86
78  {
81  (unsigned char *)X86_CODE16,
82  sizeof(X86_CODE16) - 1,
83  "X86 16bit (Intel syntax)"
84  },
85  {
88  (unsigned char *)X86_CODE32,
89  sizeof(X86_CODE32) - 1,
90  "X86 32bit (ATT syntax)",
93  },
94  {
97  (unsigned char *)X86_CODE32,
98  sizeof(X86_CODE32) - 1,
99  "X86 32 (Intel syntax)"
100  },
101  {
102  CS_ARCH_X86,
104  (unsigned char *)X86_CODE64,
105  sizeof(X86_CODE64) - 1,
106  "X86 64 (Intel syntax)"
107  },
108 #endif
109 #ifdef CAPSTONE_HAS_ARM
110  {
111  CS_ARCH_ARM,
113  (unsigned char *)ARM_CODE,
114  sizeof(ARM_CODE) - 1,
115  "ARM"
116  },
117  {
118  CS_ARCH_ARM,
120  (unsigned char *)THUMB_CODE2,
121  sizeof(THUMB_CODE2) - 1,
122  "THUMB-2"
123  },
124  {
125  CS_ARCH_ARM,
127  (unsigned char *)ARM_CODE2,
128  sizeof(ARM_CODE2) - 1,
129  "ARM: Cortex-A15 + NEON"
130  },
131  {
132  CS_ARCH_ARM,
134  (unsigned char *)THUMB_CODE,
135  sizeof(THUMB_CODE) - 1,
136  "THUMB"
137  },
138  {
139  CS_ARCH_ARM,
141  (unsigned char*)THUMB_MCLASS,
142  sizeof(THUMB_MCLASS) - 1,
143  "Thumb-MClass"
144  },
145  {
146  CS_ARCH_ARM,
148  (unsigned char*)ARMV8,
149  sizeof(ARMV8) - 1,
150  "Arm-V8"
151  },
152 #endif
153 #ifdef CAPSTONE_HAS_MIPS
154  {
155  CS_ARCH_MIPS,
157  (unsigned char *)MIPS_CODE,
158  sizeof(MIPS_CODE) - 1,
159  "MIPS-32 (Big-endian)"
160  },
161  {
162  CS_ARCH_MIPS,
164  (unsigned char *)MIPS_CODE2,
165  sizeof(MIPS_CODE2) - 1,
166  "MIPS-64-EL (Little-endian)"
167  },
168  {
169  CS_ARCH_MIPS,
171  (unsigned char*)MIPS_32R6M,
172  sizeof(MIPS_32R6M) - 1,
173  "MIPS-32R6 | Micro (Big-endian)"
174  },
175  {
176  CS_ARCH_MIPS,
178  (unsigned char*)MIPS_32R6,
179  sizeof(MIPS_32R6) - 1,
180  "MIPS-32R6 (Big-endian)"
181  },
182 #endif
183 #ifdef CAPSTONE_HAS_ARM64
184  {
187  (unsigned char *)ARM64_CODE,
188  sizeof(ARM64_CODE) - 1,
189  "ARM-64"
190  },
191 #endif
192 #ifdef CAPSTONE_HAS_POWERPC
193  {
194  CS_ARCH_PPC,
196  (unsigned char*)PPC_CODE,
197  sizeof(PPC_CODE) - 1,
198  "PPC-64"
199  },
200  {
201  CS_ARCH_PPC,
203  (unsigned char*)PPC_CODE2,
204  sizeof(PPC_CODE2) - 1,
205  "PPC-64 + QPX",
206  },
207 #endif
208 #ifdef CAPSTONE_HAS_SPARC
209  {
212  (unsigned char*)SPARC_CODE,
213  sizeof(SPARC_CODE) - 1,
214  "Sparc"
215  },
216  {
219  (unsigned char*)SPARCV9_CODE,
220  sizeof(SPARCV9_CODE) - 1,
221  "SparcV9"
222  },
223 #endif
224 #ifdef CAPSTONE_HAS_SYSZ
225  {
226  CS_ARCH_SYSZ,
227  (cs_mode)0,
228  (unsigned char*)SYSZ_CODE,
229  sizeof(SYSZ_CODE) - 1,
230  "SystemZ"
231  },
232 #endif
233 #ifdef CAPSTONE_HAS_XCORE
234  {
236  (cs_mode)0,
237  (unsigned char*)XCORE_CODE,
238  sizeof(XCORE_CODE) - 1,
239  "XCore"
240  },
241 #endif
242 #ifdef CAPSTONE_HAS_M68K
243  {
244  CS_ARCH_M68K,
246  (unsigned char*)M68K_CODE,
247  sizeof(M68K_CODE) - 1,
248  "M68K",
249  },
250 #endif
251 #ifdef CAPSTONE_HAS_M680X
252  {
255  (unsigned char*)M680X_CODE,
256  sizeof(M680X_CODE) - 1,
257  "M680X_M6809",
258  },
259 #endif
260  };
261 
262  csh handle;
263  uint64_t address = 0x1000;
264  cs_insn *all_insn;
265  cs_detail *detail;
266  int i;
267  size_t count;
268  cs_err err;
269 
270  for (i = 0; i < sizeof(platforms)/sizeof(platforms[0]); i++) {
271  printf("****************\n");
272  printf("Platform: %s\n", platforms[i].comment);
274  if (err) {
275  printf("Failed on cs_open() with error returned: %u\n", err);
276  abort();
277  }
278 
279  if (platforms[i].opt_type)
281 
283 
284  count = cs_disasm(handle, platforms[i].code, platforms[i].size, address, 0, &all_insn);
285  if (count) {
286  size_t j;
287  int n;
288 
290  printf("Disasm:\n");
291 
292  for (j = 0; j < count; j++) {
293  cs_insn *in = &(all_insn[j]);
294  printf("0x%" PRIx64 ":\t%s\t\t%s // insn-ID: %u, insn-mnem: %s\n",
295  in->address, in->mnemonic, in->op_str,
296  in->id, cs_insn_name(handle, in->id));
297 
298  // print implicit registers used by this instruction
299  detail = in->detail;
300 
301  if (detail->regs_read_count > 0) {
302  printf("\tImplicit registers read: ");
303  for (n = 0; n < detail->regs_read_count; n++) {
304  printf("%s ", cs_reg_name(handle, detail->regs_read[n]));
305  }
306  printf("\n");
307  }
308 
309  // print implicit registers modified by this instruction
310  if (detail->regs_write_count > 0) {
311  printf("\tImplicit registers modified: ");
312  for (n = 0; n < detail->regs_write_count; n++) {
313  printf("%s ", cs_reg_name(handle, detail->regs_write[n]));
314  }
315  printf("\n");
316  }
317 
318  // print the groups this instruction belong to
319  if (detail->groups_count > 0) {
320  printf("\tThis instruction belongs to groups: ");
321  for (n = 0; n < detail->groups_count; n++) {
322  printf("%s ", cs_group_name(handle, detail->groups[n]));
323  }
324  printf("\n");
325  }
326  }
327 
328  // print out the next offset, after the last insn
329  printf("0x%" PRIx64 ":\n", all_insn[j-1].address + all_insn[j-1].size);
330 
331  // free memory allocated by cs_disasm()
332  cs_free(all_insn, count);
333  } else {
334  printf("****************\n");
335  printf("Platform: %s\n", platforms[i].comment);
337  printf("ERROR: Failed to disasm given code!\n");
338  abort();
339  }
340 
341  printf("\n");
342 
343  cs_close(&handle);
344  }
345 }
lzma_index ** i
Definition: index.h:629
static bool err
Definition: armass.c:435
static mcore_handle handle
Definition: asm_mcore.c:8
const lzma_allocator const uint8_t * in
Definition: block.h:527
@ CS_ARCH_ARM64
ARM-64, also called AArch64.
Definition: capstone.h:76
@ CS_ARCH_SPARC
Sparc architecture.
Definition: capstone.h:80
@ CS_ARCH_XCORE
XCore architecture.
Definition: capstone.h:82
@ CS_ARCH_M68K
68K architecture
Definition: capstone.h:83
@ CS_ARCH_X86
X86 architecture (including x86 & x86-64)
Definition: capstone.h:78
@ CS_ARCH_M680X
680X architecture
Definition: capstone.h:85
@ CS_ARCH_ARM
ARM architecture (including Thumb, Thumb-2)
Definition: capstone.h:75
@ CS_ARCH_MIPS
Mips architecture.
Definition: capstone.h:77
@ CS_ARCH_SYSZ
SystemZ architecture.
Definition: capstone.h:81
@ CS_ARCH_PPC
PowerPC architecture.
Definition: capstone.h:79
cs_mode
Mode type.
Definition: capstone.h:102
@ CS_MODE_MCLASS
ARM's Cortex-M series.
Definition: capstone.h:109
@ CS_MODE_64
64-bit mode (X86, PPC)
Definition: capstone.h:107
@ CS_MODE_M68K_040
M68K 68040 mode.
Definition: capstone.h:121
@ CS_MODE_MIPS64
Mips64 ISA (Mips)
Definition: capstone.h:125
@ CS_MODE_32
32-bit mode (X86)
Definition: capstone.h:106
@ CS_MODE_ARM
32-bit ARM
Definition: capstone.h:104
@ CS_MODE_V8
ARMv8 A32 encodings for ARM.
Definition: capstone.h:110
@ CS_MODE_MICRO
MicroMips mode (MIPS)
Definition: capstone.h:111
@ CS_MODE_MIPS32
Mips32 ISA (Mips)
Definition: capstone.h:124
@ CS_MODE_MIPS32R6
Mips32r6 ISA.
Definition: capstone.h:113
@ CS_MODE_BIG_ENDIAN
big-endian mode
Definition: capstone.h:123
@ CS_MODE_16
16-bit mode (X86)
Definition: capstone.h:105
@ CS_MODE_V9
SparcV9 mode (Sparc)
Definition: capstone.h:115
@ CS_MODE_THUMB
ARM's Thumb mode, including Thumb-2.
Definition: capstone.h:108
@ CS_MODE_QPX
Quad Processing eXtensions mode (PPC)
Definition: capstone.h:116
@ CS_MODE_LITTLE_ENDIAN
little-endian mode (default mode)
Definition: capstone.h:103
@ CS_MODE_M680X_6809
M680X Motorola 6809 mode.
Definition: capstone.h:132
@ CS_OPT_DETAIL
Break down instruction structure into details.
Definition: capstone.h:171
@ CS_OPT_SYNTAX
Assembly output syntax.
Definition: capstone.h:170
size_t csh
Definition: capstone.h:71
@ CS_OPT_SYNTAX_ATT
X86 ATT asm syntax (CS_OPT_SYNTAX).
Definition: capstone.h:186
@ CS_OPT_ON
Turn ON an option (CS_OPT_DETAIL, CS_OPT_SKIPDATA).
Definition: capstone.h:183
CAPSTONE_EXPORT size_t CAPSTONE_API cs_disasm(csh ud, const uint8_t *buffer, size_t size, uint64_t offset, size_t count, cs_insn **insn)
Definition: cs.c:798
CAPSTONE_EXPORT const char *CAPSTONE_API cs_group_name(csh ud, unsigned int group)
Definition: cs.c:1178
CAPSTONE_EXPORT cs_err CAPSTONE_API cs_open(cs_arch arch, cs_mode mode, csh *handle)
Definition: cs.c:453
CAPSTONE_EXPORT const char *CAPSTONE_API cs_insn_name(csh ud, unsigned int insn)
Definition: cs.c:1166
CAPSTONE_EXPORT void CAPSTONE_API cs_free(cs_insn *insn, size_t count)
Definition: cs.c:1017
CAPSTONE_EXPORT const char *CAPSTONE_API cs_reg_name(csh ud, unsigned int reg)
Definition: cs.c:1154
CAPSTONE_EXPORT cs_err CAPSTONE_API cs_close(csh *handle)
Definition: cs.c:501
CAPSTONE_EXPORT cs_err CAPSTONE_API cs_option(csh ud, cs_opt_type type, size_t value)
Definition: cs.c:646
cs_arch arch
Definition: cstool.c:13
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags static arg static fd static protocol static who struct sockaddr static addrlen static backlog struct timeval struct timezone static tz const struct iovec static count static mode const void const struct sockaddr static tolen const char static pathname void count
Definition: sflib.h:98
struct platform platforms[]
Definition: fuzz_diff.c:18
voidpf void uLong size
Definition: ioapi.h:138
const char int mode
Definition: ioapi.h:137
int n
Definition: mipsasm.c:19
string M680X_CODE
Definition: test_basic.py:36
unsigned long uint64_t
Definition: sftypes.h:28
Definition: inftree9.h:24
cs_opt_type opt_type
Definition: test_basic.c:16
cs_opt_value opt_value
Definition: test_basic.c:17
#define PRIx64
Definition: sysdefs.h:94
#define ARM64_CODE
#define THUMB_CODE
#define THUMB_MCLASS
#define ARM_CODE2
#define ARMV8
#define ARM_CODE
#define THUMB_CODE2
static void print_string_hex(unsigned char *str, size_t len)
Definition: test_detail.c:20
#define X86_CODE32
#define M68K_CODE
#define MIPS_CODE2
#define MIPS_32R6
#define MIPS_CODE
#define MIPS_32R6M
#define PPC_CODE2
#define PPC_CODE
#define SPARCV9_CODE
#define SPARC_CODE
#define SYSZ_CODE
#define X86_CODE64
#define X86_CODE16
#define XCORE_CODE

References arch, ARM64_CODE, ARM_CODE, ARM_CODE2, ARMV8, platform::comment, count, CS_ARCH_ARM, CS_ARCH_ARM64, CS_ARCH_M680X, CS_ARCH_M68K, CS_ARCH_MIPS, CS_ARCH_PPC, CS_ARCH_SPARC, CS_ARCH_SYSZ, CS_ARCH_X86, CS_ARCH_XCORE, cs_close(), cs_disasm(), cs_free(), cs_group_name(), cs_insn_name(), CS_MODE_16, CS_MODE_32, CS_MODE_64, CS_MODE_ARM, CS_MODE_BIG_ENDIAN, CS_MODE_LITTLE_ENDIAN, CS_MODE_M680X_6809, CS_MODE_M68K_040, CS_MODE_MCLASS, CS_MODE_MICRO, CS_MODE_MIPS32, CS_MODE_MIPS32R6, CS_MODE_MIPS64, CS_MODE_QPX, CS_MODE_THUMB, CS_MODE_V8, CS_MODE_V9, cs_open(), CS_OPT_DETAIL, CS_OPT_ON, CS_OPT_SYNTAX, CS_OPT_SYNTAX_ATT, cs_option(), cs_reg_name(), test_evm::detail, err, handle, i, in, test_basic::M680X_CODE, M68K_CODE, MIPS_32R6, MIPS_32R6M, MIPS_CODE, MIPS_CODE2, n, platform::opt_type, platform::opt_value, platforms, PPC_CODE, PPC_CODE2, print_string_hex(), printf(), PRIx64, SPARC_CODE, SPARCV9_CODE, SYSZ_CODE, THUMB_CODE, THUMB_CODE2, THUMB_MCLASS, X86_CODE16, X86_CODE32, X86_CODE64, and XCORE_CODE.

Referenced by main().