저는 메모리에있는 명령어의 크기를 알아야합니다 (실제로는 작은 코드 세그먼트를 가지고 있고 첫 번째 명령어의 크기를 가져오고 싶습니다). libopcode와 libbfd를 찾는 데 어느 정도 시간이 걸렸습니다. 나는 헤더를 빨간색과 간단한 해결책을 마련하기 위해 시도했지만 프로그램이 항상 충돌하기 때문에 내가 뭔가를 missunderstood처럼 보인다 :libopcodes : 명령어의 크기를 얻으십시오.
int main(int argc, char **argv) {
disassemble_info *dis = malloc(sizeof(*dis));
assert(dis != NULL);
dis->arch = bfd_arch_i386;
dis->read_memory_func = buffer_read_memory;
dis->buffer_length = 64;
dis->buffer = malloc(dis->buffer_length);
memset(dis->buffer, 0x90, dis->buffer_length);
disassemble_init_for_target(dis);
int instr_size = print_insn_i386(0, dis);
printf("instruction size is %d\n", instr_size);
return 0;
}
예상되는 결과는 1 (nop
)의 명령 크기 일 것이다.
편집 :
미안 얘들 아, 내가 바보 같은 사람이야.
memset(dis, 0, sizeof(*dis));
맛 (bfd_target_elf_flavour), mach (bfd_mach_x86_64) 및 엔디안 (BFD_ENDIAN_LITTLE)이 추가되었습니다. 도와주지는 않았지만 어떤 향기인지 모르겠습니다. 나는 또한 init_disassemble_info (dis, NULL, NULL)를 추가했다; 프로그램 수신 신호 SIGSEGV, 세그먼트 오류. 에서 0x0000000000000000 ??() (gdb) bt # 0 0x0000000000000000 in ??() # 1 0x00007ffff7b1c749 ??() from /usr/lib/libopcodes-2.22.90-system.20120924.so /home/sebastian/prog/libredirect/libredirect/test.c의 main (argc = 1, argv = 0x7fffffffe428)에서 # 2 0x0000000000400b5c : 36 –
시도한 것을 포함하도록 프로그램 목록을 업데이트하고 gdb 스택 추적을 붙여 넣거나/포맷 할 수 있습니다. –
다른 항목 : buffer_vength가 아니라 buffer_length를 설정하고 있습니다. BTW,이 파일을 체크 아웃 : https://github.com/mkfs/opdis/blob/master/opdis/opdis.c; 그것은 libopcodecs를 이용합니다. 나는 당신의 프로그램에서 어떤 단계가 빠졌는지를 결정하기 위해 그것을 연구 해왔다. 이것은 또한 당신에게 유용 할 수 있습니다. –