x86 용 비공개 보호 모드 용으로 생성 된 것으로 보이는 프로그램 (주로 코드) (~ 30KB)을 현재 리버스 엔지니어링하려고합니다. 그것은 물리적 메모리에 직접 (또는 메모리 맵핑 된 장치가 더 정확하게 레지스터)에 액세스 지침, 예를 들어 있습니다 : 나는 에서 QEMU을 상기 프로그램을 실행하고 이상적으로 그것을 통해 단계 수 있도록하고 싶습니다 실행중인 코드가 x86 비공개 보호 모드 용으로 빌드되었습니다.
mov esi, 0FED400000h ; Some device base address
mov eax, [esi+18h] ; Memory mapped status register of said device
디버거 (예 : gdb).
이제 문제는 코드에서 인코딩 된 절대 메모리 주소가 페이징이 활성화 된 모든 운영 체제에서 세그먼트 오류가 발생한다는 것입니다.
나는이 문제를 우회 할 수있는 방법으로 생각을 해 봤는데 :
- 지도 물리적 메모리를 사용자 공간으로는/dev/MEM에서의 mmap를 사용하여 사용자 공간에서 프로그램을 실행하여. 이렇게하면 실제 메모리에 액세스 할 수 있지만 매핑 된 주소는 실제 주소와 같지 않으므로 분석 프로그램의 하드 코드 된 메모리 주소는 패치해야합니다. 이는 대량의 인코딩 된 절대 주소로 인해 거의 불가능한 것처럼 보입니다.
- 주소를 다시 쓰면 불법 메모리 액세스를 수정하려고하는 세그먼트 화 오류 처리기를 설치하십시오. 그런 다음 사용자 공간에서 프로그램을 실행하십시오.
- 프로그램 코드를 디스크에서 메모리로로드하고, 보호 모드 (GDT 설정 포함)를 입력하고 점프하는 부트 로더를 작성하십시오. 비슷한 코드를 작성한 적이 없기 때문에이 코드가 작동하는지조차 확신 할 수 없습니다.
지금까지보고 싶지 않은 프로그램을 실행할 수있는 다른 옵션이 있습니까? 또는 위에 언급 한 아이디어에 대한 제안, 추가 또는 경험이 있습니까?
어떤 형식입니까? DOS COM, EXE, Win32 PE? –
인텔의 TXT 인증 코드 모듈 (일명 SINIT ACM)입니다 ([TXT 소프트웨어 개발 가이드] (http://www.intel.com/content/www/us/en/software-developers/intel-txt- software-development-guide.html) page 64ff) – r00t