uintptr_t next_opcode(uintptr_t address) { ud_t ud_obj; ud_init(&ud_obj, 32); ud_set_input_buffer(&ud_obj, (uint8_t*)address, (size_t)-1); return address + ud_decode(&ud_obj); }
/* ============================================================================= * ud_disassemble() - disassembles one instruction and returns the number of * bytes disassembled. A zero means end of disassembly. * ============================================================================= */ extern unsigned int ud_disassemble(struct ud* u) { if (ud_input_end(u)) return 0; u->asm_buf[0] = 0; if (ud_decode(u) == 0) return 0; if (u->translator) u->translator(u); return ud_insn_len(u); }
/* ============================================================================= * ud_disassemble * Disassembles one instruction and returns the number of * bytes disassembled. A zero means end of disassembly. * ============================================================================= */ extern unsigned int ud_disassemble(struct ud* u) { int len; if (u->inp_end) { return 0; } if ((len = ud_decode(u)) > 0) { if (u->translator != NULL) { u->asm_buf[0] = '\0'; u->translator(u); } } return len; }
uintptr_t next_opcode(uintptr_t address, uint8_t opcode, size_t length) { ud_t ud_obj; ud_init(&ud_obj, 32); ud_set_input_buffer(&ud_obj, (uint8_t*)address, (size_t)-1); size_t size = 0; do { size = ud_decode(&ud_obj); if ((size == length) && (*(uint8_t*)address == opcode)) break; address += size; } while (size); return address; }