하드웨어만지다가 리버스엔지니어링에 요즘 빠져들고 있다~~~
꽤나 방대한 부분의 공부가 필요한 부분이라 조금씩 먹고 있는데... 끝이 안보이긴 하다 큭...
그래도 꽤나 재미있는 분야라... 옛날에 해킹에 빠졌던 느낌이 스믈스믈 올라오는게, 좋다 ㅋㅋㅋ
해킹마냥 밝은부분과 어두운부분이 공존하는 분야의 공부인지라 더욱더 관심이 간다.
사실상 해킹과 연관이 꽤 있는 부분이라 꽤나 복잡허다...
---------------------------------------------------
리버스 엔지니어링 샘플중 유명한 것중 하나인 abex crack me 시리즈.
첫번째 예제 cdrom protection.
준비물
------------------------------------------------------------------------------------------------------------
예제실행파일을 실행하면 다음과 같은 메세지가 나온다.
확인을 누르면,
어떻게 하면될까????
여기선 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를 실행시킨다.
이제 우리가 크랙할 파일을 불러온다.
이제 여기서 실행되고 있는 모듈을 불러온다.
이 함수를 참조하는 부분을 불러온다.
이 주소를 눈여겨봐야 한다.
이부분을 브레이킹시키기 위해서 메뉴에서 선택한다
이렇게 하면, 해당 커멘드가 실행될때마다 브레이킹이 된다.
이제 프로그램을 실행시켜서 브레이킹되는 포인트를 잡아낸다.
아까 참조되는 주소에서 나타난 것과 같이 실행시 브레이킹이 그 주소에서 된다.(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 을 눌러준다.
다른이름으로 저장을 해준다.
끝났다~~
이제 크랙된 파일을 실행 시켜주면된다.