처음으로 "Reverse Engineering" 에 포스팅을 하게 되네요~

앞으로 얼마간은 Crack 과 관련된 포스팅을 하게될 듯 합니다.

처음 타겟은 Abex's CrackMe 시리즈입니다.

제가 회사에 입사하고 나서 얼마간 업무파악을 못한 상태에서~~

빈둥거리며 연습삼아 하게된 것들인데요...^^;;ㅋ

Crack 세계에 막 입문하시려는 분들에게 좋은 연습자료가 될거라 생각합니다...ㅋ

Abex's CrackMe 시리즈는 총 5개구요.. 오늘은 그 중 1번을 타켓으로 잡았습니다.

( 총 시리즈가 5개이니 앞으로 4번의 포스팅에 대해선~ 뭘할까..? 하는 고민을 없애기위한
  =0=;;;.. 놀고먹으려는 의도가 강하긴 합니다...ㅋㅋ :D )


우선~ 위의 abex1.zip 파일을 다운로드 받으셔서 원하는 폴더에 압축을 풉니다~

abexcm1.exe 파일이 있을텐데요~ 악성코드나 그런거 아니니 안심하고 실행시켜 봅니다~

사용자 삽입 이미지

위와 같은 대화상자가 하나 뜰겁니다~ㅋ

"확인"을 눌러볼까요...?

사용자 삽입 이미지

음... CD-ROM 드라이브가 아니라고 하는군요.. =0=;;;


여기서 이번 작업의 목적이 뭘까~~? 하고 생각을 할 수 있는데...

abexcm1.exe 파일을 적당히 뜯어고쳐서...우리의 하드 디스크를 CD-ROM 으로 인식하게끔 해서

CD-ROM 이네요~~ 하고 메시지박스를 띄우도록 바꾸는게 목적입니다.


본격적인 작업에 시작하기 전에~~ 사용할 도구를 준비해야 되는데...

저는 Olly Debugger 를 사용합니다. 유저모드 디버거 중에선 최고가 아닐까~~ 생각되는;;ㅋ

참고로 Olly Debuggerhttp://www.ollydbg.de 에서 받으실 수 있습니다.

그리고 http://www.tuts4you.com 에서 각종 변형들과 스크립트, 플러그인 등을 받으실 수 있습니다.

이제... 도구가 준비되었으면~ 본격적으로 작업을 시작해볼까요..?


먼저.. 올리로 abexcm1.exe 파일을 열어봅니다. ( 아래 이미지 클릭강추~ㅋ )

사용자 삽입 이미지

abexcm1.exe on OllyDBG

위의 내용이 abexcm1.exe 의 전부입니다. (워낙에 단순한 프로그램인지라...)


전체적인 흐름은 아래와 같습니다.

     1. "Make me think your HD is a CD-Rom" 메시지를 띄운다.
     2. GetDriveTypeA API 함수를 호출한다. (인자는 "c:\")
     3. 함수 실행 결과를 바탕으로 비교연산을 수행한다. (CD-ROM인지 아닌지...)
     4. CD-ROM 이면 CD-ROM이라는 메시지박스를, 아니면 아니라는 메시지박스를 띄운다.
     5. 프로그램 종료.


"하드디스크를 CD-ROM 으로 인식하게끔 하라..."

직관적으로 3. 의 과정을 건드려야 되겠구나~~ 하고 생각되면 Goooooooooooood 입니다.

3. 과정의 비교연산을 수행하는 부분을 건드려서 하드디스크를 CD-ROM 으로 인식하게끔 하면 됩니다.

3. 과정에 해당되는 부분은 아래의 코드입니다.

사용자 삽입 이미지

GetDriveTypeA 호출 후 비교연산 수행


GetDriveTypeA 함수를 호출하게 되면 그 리턴값이 EAX 에 저장됩니다.

"C:\" 를 인자로 GetDriveTypeA 를 호출하면 "3" 을 리턴하게 됩니다. (아래 이미지 참조)

사용자 삽입 이미지

GetDriveTypeA 함수실행 후 레지스터의 값


비교연산을 할 때, INC, DEC 등의 명령을 ESI, EAX 레지스터를 대상으로 하고 있는데...
( 참고로 INC 는 1증가, DEC 는 1감소 시키는 명령입니다.)

아래의 연산루틴을 타게되면 해당 레지스터의 값이 조금 바뀌게 됩니다.

0040101D    INC ESI               ;---> ESI : 00000000
0040101E    DEC EAX              ;---> EAX : 00000002
0040101F    JMP SHORT abexcm1.00401021
00401021    INC ESI                ;---> ESI : 00000001
00401022    INC ESI                ;---> ESI : 00000002
00401023    DEC EAX              ;---> EAX : 00000001
00401024    CMP EAX, ESI       ; EAX, ESI 값을 비교
00401026    JE SHORT abexcm1.0040103D

CMP 명령의 연산결과에 따라 EAX와 ESI 값이 같으면 0040103D로 점프를 하고,

값이 다르면 JE 명령이 수행된 00401026의 바로 다음 번지(00401028)에서 실행이 계속 됩니다.

맨~~위의 전체코드를 보면 아시겠지만... 00401028 번지는 CD-ROM이 아니라는 메시지박스를 띄우는 부분이고,

0040103D 번지는 우리가 원하던~ CD-ROM 이구나~~ 하는 메시지박스를 띄우는 부분입니다.

정리하면, EAX와 ESI의 값이 같으면 CD-ROM 으로 인식을 한다는 것입니다.


이제 다 왔습니다...

위의 코드에서는 EAX와 ESI값이 같다는 조건하에 CD-ROM 이라는 메시지박스를 띄우는 번지로

조건분기(JE 명령)를 하도록 되어있습니다.

이 때, 조건을 무의미하게 하려면 어떻게 하면 될까요...? ^^:;

조건에 상관없이 분기... 즉 무조건 분기, JMP 명령을 이용하면 됩니다.

00401026    JE SHORT abexcm1.0040103D 이 부분을

00401026    JMP SHORT abexcm1.0040103D 로 바꿔주면 됩니다.

이러면 CMP명령의 연산 결과(EAX와 ESI값이 같은지의 여부)에 상관없이 무조건...

CD-ROM 이라고 인식을 하는 메시지박스를 띄우게 됩니다.

사용자 삽입 이미지
.
.

어렵지는 않은 내용인데.. =0= 어쩌다보니.. 굉장히 길어졌군요;;;;;

다음에는 Lv2 에 대한 내용을 올리도록 하겠습니다..ㅋ
YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. BlogIcon 시미 2007.10.07 12:50  댓글주소  수정/삭제  댓글쓰기

    abex 크랙미는 유명하죠.
    저도 예전에(군대에서) 몇백가지의 크랙미들을 하나하나 풀어가는 재미로,
    시간을 보낸 기억이 나네요. ^^