게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
디스어셈블리 인텔 opmap, moder/m, sib
게시물ID : programmer_5407짧은주소 복사하기
작성자 : 황금비
추천 : 1
조회수 : 922회
댓글수 : 2개
등록시간 : 2014/09/13 15:35:06
ms 빠돌이 입니다.
터보C로 c배우고 visual studio 5.0으로 잠깐 독학하다가 입사해서 6.0 사용하면서 거의 2007년까지 쓰다가 2005 잠깐 쓰고 2008을 이식성 때문에 지금까지 메인으로 쓰고 있습니다. 2010은 잠깐 쓰다가 버리고 2012를 다시 구입해서 새로운 c++11문법 적용과 타입스크립트 개발 툴로 사용하고 있습니다.

저는 vc에서 디버깅으로 disassembly를 아주 가끔씩 사용합니다. 이 디스어셈블리가 2010부터 disassembly에 추가 된 것이 많은데,
코드 바이트, 주소, 소스코드, 기호 이름 줄 번호 표시 등을 체크해서 볼 수 있어서 편리합니다.

disaa.jpg


만약 디스어셈블리는 디버그 모드에서 동작하는데 활성화가 안되어 있다면 도구->디버그 -> 디스어셈블리를 선택하거나 ALT+8을 누르면 창이 활성화 됩니다.

잠깐 이 디스어셈을 설명 드리면 그림에서 맨 좌측의 노란색이 현재 명령어 주소를 가르키는 커서이고 처음 00121070 등은 코드 세그먼트 주소를 말합니다. 프로그램이 시작되면 운영체제의 프로그램 로더는 코드가 저장된 메모리 블록 코드세그먼트와 스택 세그먼트가 RAM에 처음 생성이되고 데이터 세그먼트, extra 데이터 세그먼트가 만들어지는데 코드 세그먼트는 코드가 올라가 있는 메모리입니다.


disaa2.jpg
명령어 형식은 이렇게 되어 있는데 바이트가 기본 단위이며 디스어셈블리에서는 Opcode 부터 시작합니다.

예를 들어서  00121070 줄의 "55", 012C1071의 "8B EC"가 명령어 세트 입니다.

같은 어셈 명령어라도 레지스트리에 따라 번역된 기계어가 조금씩 달라지는데 "mov"라는 어셈 명령어도 012C1071는 8B, 012C1082는 B9
012C1087 B8로 되어 번역되어 있음을 볼 수 있는데 그 이유는 op map을 보시면 알 수 있습니다.

ASSEM00.jpg

예를 들어 012C1071를 보면 기계어로는 "8B EC"로 되어 있고 우측 어셈에는 mov ebp,esp로 되어있는데 8B는 Op Map의 8행 B열을 보면
MOV Gv,Ev로 되어 있음을 볼 수 있는데 Gv, Ev 는 "8B" 다음의 "EC"에서 가져 옵니다.


ASSEM01.jpg

ModeR/M  테이블에서 EC 의 왼쪽을 쭉 가면 ESP...로 쭉 되어 있고 상단으로 가면  r2에 ESP되어 있음을 볼 수 있으며 8B EC 는 mov ebp,esp가 됩니다.

이런 식으로 명령어가 해석되는 것이고요, 눈으로 읽을 때 주의할 것은 음수에 대한 표현입니다.
그림에서 012C10A3 에는 8B 45 E0로 되어 있는데 8B mov , 45는 상단 EAX, 좌측 [EBP]+ disp8 이렇게 되어 있습니다. 이것은 EAX에 EBP+ 8비트 변위 위치에 있는 갑을 복사하라는 것인데 여기서 E0는 변위가 입니다.

8비트 변위는 -128~ 127입니다. 따라서 E0는 음수로 표현한다면 -20H 가 되겠지요. 그래서 디스어셈에 dword ptr [ebp-20h]로 표현 되어 있는 것입니다.

만약 SIB를 요구한다면 SIB(scale index table) 테이블을 사용하시면 됩니다.
ASSEM02.jpg

머 이 정도면 대충 디스어셈블리에 나타난 코드 바이트를 이해할 수 있고 프로그래밍이 더 재미있어 질거라 생각됩니다.

참고로 Op map에서 Gv, Ev, Iz 이런거 보이실 텐데 이것은 Addressing method와 Operand type 입니다.
예를 들어 Ev는 Addressing Method가 E, 오퍼렌드 타입이 z이고요, 다음 그림을 이용하면 될 것 같습니다.

ASSEM00.jpg

전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호