본문 바로가기

프로젝트/디스어셈블러 만들기

IA-32 opcode map-1 일단 지금 하고 있는것이 기계어-> 어셈블리어로 변환시키는 방법이므로 intel이 어떻게 기계어 구조를 만들었는지를 알기 위해서 Intel에서 제공해준 공식 메뉴얼을 봐봤습니다. 이 메뉴얼은 intel공식 홈페이지를 가서 메뉴얼 다운로드를 하면 나옵니다. 먼저 인텔 기계어의 가장 기본적인 구조입니다.1)Instruction Prefixes: 1바이트로 Opcode를 보조하는 역할을 합니다.(선택적: 없어도 됨)2) Opcode : 1,2,3 바이트로 어떤 명령어인지를 알려줍니다.3) ModR/M : 1바이트로 각각의 bit가 Mod, Reg/Opcode,R/M으로 되있으며 Opcode가 원하는 그 어셈블리어에서 명령어 뒤에 나오는 값이 라고 생각하면 됩니다.(선택적)4) SIB : 1바이트로 각각의 bi.. 더보기
EP찾기 RAW=RVA-VA+PointerToRawData라는것을 이용해서EP의 RVA를 OptionalHeader구조체서 참조해오고,VA와PointerToRawData를 code부분의 Sectionheader구조체서 참조해오고,그것을 계산시킨값을 code라는부분에 저장시켜봤습니다.일단 이상태는 기계어(어셈블리어가 아님)일테니까 실험적으로 20바이트만 출력해보도록 해봤습니다. 그러니 이렇게 기계어가 막 튀어나오는데 실제 이 기계어는 올리디버거의 Opcode와 똑같습니다. 다음번에는 이제 IA-32의 instruction과 함께 이 기계어로부터 어셈블리어로 변환시키는 작업을 해보겠습니다. 더보기
디스어셈블러 원리 파악 리버싱 관련 블로그들을 찾아봐도 디버거를 만드는 방법을 알려주는 분들이 없어서 어떻게 만들까 고민을 하고 있었는데 이번에 PE구조 관련 글을 쓰기 위해 여러 프로그램을 분석, PE구조를 찾아보니까 PE구조의 Section에서 code부분의 기계어와 올리디버거로 돌렸을때의 기계어코드가 일치한다는 것을 찾았습니다.현재 API를 열심히 공부하고 있으니 이 프로젝트는 아마 내년 여름방학쯤에 디버거를 만드는것으로 목표를 잡고 있습니다. 더보기