프로그램을 실행하면 다음과 같은 문구가 나옵니다.
CD-ROM이 아니라고 나옵니다.
올리디버거를 이용해서 확인해 보겠습니다.
좀 내려가 보면 40100E에서 첫 메시지 박스가 뜨고 나서 401024에서 CMP명령을 이용해서 EAX와 ESI가 비교를 합니다.
그리고 401028에서 CMP의 반환값을 가지고 참인지 거짓인지 판별후 JMP를 할지 안할지를 결정하는 문장입니다.
이때 Error로 가기 때문에 YEAH!!로 갈수 있도록 해야 하는데 방법이 총 4가지가 있습니다.
#1. EAX와 ESI의 값을 동일하게 만들어서 성공으로 보내는 방법
#2. JE조건문을 바꿔서 성공으로 보내는 방법
#3. 실패화면을 성공으로 보내는 방법(문자열 변경)
#4. C드라이브를 진짜 CD-ROM으로 인식하게 하는 방법
저는 가장 많이 사용되는 1번과 2번 방법으로 풀이를 해보겠습니다.
1번 풀이 :
CMP명령어가 있는 401024주소 까지 내려와 보면
비교하는 EAX의 값과 ESI의 값이 다릅니다.
ESI의 값이 3인데 401003으로 뜨는 이유는..
다른 분들은 그냥 3으로 나오지만 저는.. 저렇게 나옵니다.
아마.. ESI 레지스터의 용도를 보면 출발지 주소(Source Index)가 저장됩니다.
근데 처음 시작 할 때 401000주소로 시작해서 아마 ESI가 저 값이라고 추측이 됩니다.
EAX=1,ESI=3이 나오는 과정은 다음과 같습니다.
40101D 이전 : C:\를 의미하는 값인 3이 EAX에 들어간다. EAX=3, ESI=0
40101D : ESI 1증가. EAX=3, ESI=1
40101E : EAX 1감소. EAX=2, ESI=1
401021 : ESI 1증가. EAX=2, ESI=2
401022 : ESI 1증가. EAX=2, ESI=3
401023 : EAX 1감소. EAX=1, ESI=3
그래서 EAX=1, ESI=3이 된 것 입니다.
두개의 값을 같게 해주기 위해서 다음과 같이 수정해 줍니다.
이렇게 하고 다음으로 넘어가보니
점프선이 보이게 되었습니다. 이대로 쭉 진행하면 성공 출력!
2번 풀이 :
401026주소에서 JE명령어로 CMP의 참 거짓을 판별해서 JMP를 하게 됩니다.
참이면 40103D로 점프하고 아니면 그냥 401028로 가는 명령인데 굳이 판별 안하고 JE를 JMP로 변경하면 바로 점프 하게 됩니다.
이렇게 바꿔 주시면 성공메시지로 바로 점프하게 됩니다.