본문 바로가기

Hacked Brain/Reverse Engineering

리버스엔지니어링샘플.abex crack me 시리즈. 1. cdrom protection crack

하드웨어만지다가 리버스엔지니어링에 요즘 빠져들고 있다~~~
꽤나 방대한 부분의 공부가 필요한 부분이라 조금씩 먹고 있는데... 끝이 안보이긴 하다 큭...
그래도 꽤나 재미있는 분야라... 옛날에 해킹에 빠졌던 느낌이 스믈스믈 올라오는게, 좋다 ㅋㅋㅋ
해킹마냥 밝은부분과 어두운부분이 공존하는 분야의 공부인지라 더욱더 관심이 간다.
사실상 해킹과 연관이 꽤 있는 부분이라 꽤나 복잡허다...
---------------------------------------------------

리버스 엔지니어링 샘플중 유명한 것중 하나인 abex crack me 시리즈.
첫번째 예제 cdrom protection.

준비물
------------------------------------------------------------------------------------------------------------

abex1.zip

OllyICE.zip

------------------------------------------------------------------------------------------------------------
예제실행파일을 실행하면 다음과 같은 메세지가 나온다.


건방지게~~~ HD를 CD-Rom 으로 생각하게 만들어 보라는 도전장이다.
확인을 누르면,


이렇게 나온다. 음... 이넘을 바꾸라는 거다....
어떻게 하면될까????
여기선 GetDriveTypeA API를 이용해서 찾아 들어간다.
GetDriveTypeA는 리턴값에 따라서 여러가지 드라이브를 나타낸다.

0 Drive Cannot Be determined
1 Root Dir Does not exist
2 DriveRemoveable
3 A Fixed Disk (HardDrive)
4 Remote Drive(Network)
5 Cd-Rom Drive
6 RamDisk

여기서 보면, 리턴값을 5로 바꾸면 된다. 혹은 점프를 원하는 곳으로 하면된다.

ollyice를 실행시킨다.


이제 우리가 크랙할 파일을 불러온다.

사용자 삽입 이미지

이제 여기서 실행되고 있는 모듈을 불러온다.


모듈을 보면 가장위에 우리가 실행시킨 파일이 보인다ㅏ 이넘을 클릭해서, 관련 name들을 확인한다.


여기서 보면, 이전에 언급했던 GetDriveTypeA를 불러오는 것을 알수 있다.
이 함수를 참조하는 부분을 불러온다.


클릭을 하게되면


참조되는 부분이 뜨는데,
이 주소를 눈여겨봐야 한다.
이부분을 브레이킹시키기 위해서 메뉴에서 선택한다

사용자 삽입 이미지

이렇게 하면, 해당 커멘드가 실행될때마다 브레이킹이 된다.

이제 프로그램을 실행시켜서 브레이킹되는 포인트를 잡아낸다.

사용자 삽입 이미지

아까 참조되는 주소에서 나타난 것과 같이 실행시 브레이킹이 그 주소에서 된다.(00401018)
이제 관련 소스를 분석해보자.
이 소스에서 가장 중요한 세부분이다.
첫번째 붉은색 부분은 위의 cmp 부분에서의 값에 따라 분기할수 있는 조건문이 되며,
가장 중요한 부분이 된다. 이후 녹색 부분은 처음 보았던 에러 메세지 처리부분이고,
푸른색부분은 우리가 원하는 메세지 출력부분이다.
우리는 붉은색 조건 분기문을 수정해서 녹색부분을 무시하고,
무조건 푸른색 분기문 쪽으로 점프하게 만들면 된다.

je 명령어는 위의 cmp 부분이 0일경우, 즉 같을 경우 0040103D 번지로 점프하라는 명령이다.
그런데, 항상 값이 다르므로 그다음으로 패스되어진다. 이를 jmp 명령어로 치환시켜, 푸른색분기문의 첫주소인 0040103B로 점프시켜 버리면 된다.

00401013  |.  68 94204000   push    abexcm1.00402094                 ; /RootPathName = "c:\"
00401018  |.  E8 38000000   call    <jmp.&KERNEL32.GetDriveTypeA>    ; \GetDriveTypeA
0040101D  |.  46            inc     esi
0040101E  |.  48            dec     eax
0040101F  |.  EB 00         jmp     short abexcm1.00401021
00401021  |>  46            inc     esi
00401022  |.  46            inc     esi
00401023  |.  48            dec     eax
00401024  |.  3BC6          cmp     eax, esi
00401026  |.  74 15         je      short abexcm1.0040103D
00401028  |.  6A 00         push    0                                ; /Style = MB_OK|MB_APPLMODAL
0040102A  |.  68 35204000   push    abexcm1.00402035                 ; |Title = "Error"
0040102F  |.  68 3B204000   push    abexcm1.0040203B                 ; |Text = "Nah... This is not a CD-ROM Drive!"
00401034  |.  6A 00         push    0                                ; |hOwner = NULL
00401036  |.  E8 26000000   call    <jmp.&USER32.MessageBoxA>        ; \MessageBoxA

0040103B  |.  EB 13         jmp     short abexcm1.00401050
0040103D  |>  6A 00         push    0                                ; |/Style = MB_OK|MB_APPLMODAL
0040103F  |.  68 5E204000   push    abexcm1.0040205E                 ; ||Title = "YEAH!"
00401044  |.  68 64204000   push    abexcm1.00402064                 ; ||Text = "Ok, I really think that your HD is a CD-ROM! :p"
00401049  |.  6A 00         push    0                                ; ||hOwner = NULL
0040104B  |.  E8 11000000   call    <jmp.&USER32.MessageBoxA>        ; |\MessageBoxA

00401050  \>  E8 06000000   call    <jmp.&KERNEL32.ExitProcess>      ; \ExitProcess
00401055   $- FF25 50304000 jmp     dword ptr ds:[<&KERNEL32.GetDriv>;  kernel32.GetDriveTypeA
0040105B   .- FF25 54304000 jmp     dword ptr ds:[<&KERNEL32.ExitPro>;  kernel32.ExitProcess

사용자 삽입 이미지


그런후 수정된 내용을 저장한다. 00401026번지를 클릭후
메뉴에서 copy to executable>selection 을 눌러준다.


이명령어를 눌러주면 해당 수정된내용을 저장하는 메세지창이 뜨는데,


파일저장을 눌러서

사용자 삽입 이미지

다른이름으로 저장을 해준다.

사용자 삽입 이미지


끝났다~~
이제 크랙된 파일을 실행 시켜주면된다.


우리가 원하는 메세지가 나온다~~