C 드라이브의 이름이 CodeEngn 일 경우에 대해 풀어야 하므로 일단 C 드라이브의 이름을 CodeEngn으로 변경하고 시작하겠습니다. 방법은 폴더 이름 바꾸듯이 하시면 되요.
어떤 식으로 동작하는 지 대략적으로 파악합니다.
마우스 우클릭 -> Search for -> All referenced text strings 를 가면 역시 친절하게 문제풀이에 도움이 될 문자열이 보입니다.(계속 이렇게 푸니 이젠 습관이 됐네요 ㅎㅎ)
입력한 값이 시리얼인 경우 혹은 아닐 경우의 문자열을 더블 클릭하여 해당하는 위치로 이동하면 값을 비교하는 곳과 조건분기점을 찾을 수 있습니다.
다음은 위와 같이 브레이크 포인트(F2)를 걸어 놓고 Ollydbg에서 실행(F9)한 후 임의의 값을 입력했을 때 멈춘 모습입니다.
이것만 봐도 무엇이 답인지 한눈에 알 수 있겠죠?? 그래도 이렇게 마무리하면 밋밋하니까 좀더 풀께요.
위 스크린샷의 윗 부분을 보시면 GetVolumeInformation 이라는 함수를 호출하고 있습니다. 이름만 봐도 드라이브의 정보를 얻어온다는 것을 알 수 있습니다. 자세한 사항은 Help 파일이나 MSDN을 참조하세요.
함수 윗부분을 보면 RootPathName과 VolumeNameBuffer 부분을 각각 NULL과 주소를 넘기고 있음을 알 수 있습니다.
여기서 RootPathName의 값이 NULL이면 현재 디렉토리의 루트 디렉토리. 즉, C:\ 를 가르킨다는 의미이며,
VolumeNameBuffer의 주소는 해당 드라이버의 이름을 저장하는 주소입니다. 코드를 보면 저 주소에 드라이버에 입력한 CodeEngn이 저장됨을 알 수 있습니다. 계속해서 실행하면 lstrcat 함수를 만나는 데 이 함수는 문자열을 결합하는 함수입니다. 함수 아래에 있는 코드가 바로 문자열을 바꾸는 부분입니다. 분석하면
004010AD B2 02 MOV DL,2 ; DX 레지스터의 하위 레지스터 즉 EDX의 값이 2로 변함
004010AF 8305 5C224000 01 ADD DWORD PTR DS:[40225C],1 ; 문자열이 저장된 주소, 첫번째 문자의 값 +1
004010B6 8305 5D224000 01 ADD DWORD PTR DS:[40225D],1 ; 두번째 값 +1
004010BD 8305 5E224000 01 ADD DWORD PTR DS:[40225E],1 ; 세번째 값 +1
004010C4 8305 5F224000 01 ADD DWORD PTR DS:[40225F],1 ; 네번째 값 +1
004010CB FECA DEC DL ; DL 레지스터 -1
004010CD 75 E0 JNZ SHORT 07.004010AF ; Jump if Not Zero, Zero Flag의 값이 0이면 점프
즉, 총 2번 코드를 실행하면서 CodeEngn 중 Code 만 +2를 한다는 것을 알 수 있습니다. 한 줄씩 실행시켜보면 값이 변하는 것을 볼 수 있습니다.