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

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

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

------------------------------------------------------------------------------------------------------------
예제실행파일을 실행하면 다음과 같은 메세지가 나온다.
사용자 삽입 이미지
건방지게~~~ 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 을 눌러준다.
사용자 삽입 이미지
이명령어를 눌러주면 해당 수정된내용을 저장하는 메세지창이 뜨는데,
사용자 삽입 이미지
파일저장을 눌러서
사용자 삽입 이미지
다른이름으로 저장을 해준다.
사용자 삽입 이미지

끝났다~~
이제 크랙된 파일을 실행 시켜주면된다.
사용자 삽입 이미지

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


Posted by 후니 유

댓글을 달아주세요:: 스팸은 정중히 사절합니다.

  1. 강훈
    2008/04/16 12:18
    댓글 주소 수정/삭제 댓글
    좋은 글 감사합니다. 저는 에러문구와 성공문구를 찾은 뒤에 성공문구에서 성공 문구로 가기 위한 조건문을 찾아서 JMP를 했습니다. 그런데 GetDriveTypeA는 아직 사용법을 모르겠네요;
    • 2008/04/16 13:20
      댓글 주소 수정/삭제
      GetDriveTypeA 이넘을 이용한건 결국 성공문구를 찾기위한 한 방편에 지나지 않죵 ^^
      이 예제에서는 해당 드라이브가 HDD 인지, CDROM인지를 판별해서, 해당 드라이브에 따라서 문구를 달리보여준다는데서 아이디어가 시작된거죠.
      드라이브의 리턴값을 가지고 판별한다면, GetDriveTypeA라는 함수가 쓰였을 것이다라는 생각을 해서 찾아들어간 것이구요. 굳이 이방법을 이용하지않고, Text만 찾아도 간단히 해결이 되는 예제입니다.
      굳이 GetDriveTypeA를 이용한건, 이예제의 특성이 드라이브정보를 가져온다는 것과 그것에 이용된 함수가 아마도 GetDriveTypeA라고 생각이 되었기때문에, 리버싱의 시작부분이 GetDriveTypeA가 된것이죠.
  2. 2009/02/13 15:50
    댓글 주소 수정/삭제 댓글
    와 정말 재밌어요 ㅎ

    다른 예제 계속 쭉 올려주시면 안될까요? ㅋ

    설명도 너무 잘되있고 머리에도 쏙쏙 들어옵니다!!ㅋ


BLOG main image
Cr4cK th3 W0Rld by 후니 유

1,212,295


Today : 150
Yesterday : 225
hit counters

카테고리

전체보기 (802)
Etc (246)
Hacked Brain (280)
My Project (32)
데일리 (22)
운영체제 (31)
프로그래밍 (92)
Securities (27)