HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가?
파일을 실행해보면 HD를 CD-Rom으로 생각하게 만들라고 하고 에러 메시지를 띄어준다.
우선 해당 파일이 32bit 파일인지 64bit 파일인지 확인
32bit 파일임을 알 수 있음
esi + 3한 값과 GetDriveTypeA을 통해 나온 결과(eax) -2 를 비교한 뒤에 eax-2 == esi + 3 이면 HD를 CD-Rom으로 인식하는 것을 알 수 있다.
더 자세한 분석을 위해 x32dbg를 사용했다.
esi에는 EntryPoint값인 401000이 들어가고 eax는 GetDriveTypeA의 return 값이 들어온다.
UINT GetDriveTypeA(
[in, optional] LPCSTR lpRootPathName
);
또한 결과 값을 다음과 같다.
현재는 1이 반환되니 DRIVE_NO_ROOT_DIR임을 알수 있고 CD-Rom으로 인식되면 리턴값이 5여야되지만 문제에서는 eax(1) - 2 == 401003이 되야 하니 리턴값이 401005가 되어야한다.
(원래는 esi에 0이 들어있어야되고 MS에서 정의된것처럼 eax = 5가 되게 리턴값이 반환되면 CD-Rom으로 인식되어 문제가 해결됨 본인 디버거 플러그인 설정 문제 때문일 수 있다고 생각됨)
주소값 401024 부분 opcode를 cmp eax, esi -> cmp eax, eax 로 바꾸는 바이너리 패치를 통해 실행만으로 통과되게 바꾸었다.