2013-03-12 2 views
1

저는 메모리에있는 명령어의 크기를 알아야합니다 (실제로는 작은 코드 세그먼트를 가지고 있고 첫 번째 명령어의 크기를 가져오고 싶습니다). 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)); 

답변

0

disassemble_info 데이터 구조는 사용자가 제공 한 것보다 더 많은 초기화가 필요합니다. 내가 공부해온 예제에서, 초기화하는 올바른 방법은 init_disassemble_info()를 호출하는 것입니다.

도움이되는지 확인하십시오. 실패하면 디버그 정보 ('-g')로 프로그램을 컴파일하고 gdb를 실행하여 충돌이 발생한 곳을 진단하십시오.

+0

맛 (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 –

+0

시도한 것을 포함하도록 프로그램 목록을 업데이트하고 gdb 스택 추적을 붙여 넣거나/포맷 할 수 있습니다. –

+0

다른 항목 : buffer_vength가 아니라 buffer_length를 설정하고 있습니다. BTW,이 파일을 체크 아웃 : https://github.com/mkfs/opdis/blob/master/opdis/opdis.c; 그것은 libopcodecs를 이용합니다. 나는 당신의 프로그램에서 어떤 단계가 빠졌는지를 결정하기 위해 그것을 연구 해왔다. 이것은 또한 당신에게 유용 할 수 있습니다. –

1

리눅스 커널에 도용 할 수있는 몇 가지 코드가 있습니다. 사용자 모드 프로그램에 복사하면 잘 작동합니다.

arch/x86/lib 및 arch/x86/tools를 살펴보십시오. opcode 맵 파일이 있으며 awat 스크립트를 사용하여 innat.c 파일에 테이블을 생성합니다. 테이블을 사용하여 디코더를 구현하는 다른 파일이 있습니다.

명령어 크기를 결정하는 것으로 충분합니다.

물론 GPL을 사용한다고 가정합니다.

+0

고마워, 그 x86에 대한 작동합니다. 팔과 같은 다른 아키텍처로 포팅하고 싶다면 어떻게해야할까요? 나는 거기에 상응하는 것을 찾지 못했습니다. –