반응형
RE를 공부한 사람이라면 누구나 알만한 그룹 ARTeam 이 쓴 문서다. part1부터 part10 까지 있으며, RE를 이제 막 시작하려는 사람에게 좋은 문서다. 앞으로 하나하나 번역해서 올릴 생각이다.
- forc1

--------------------------------------------

Gabri3l Tutorial #1

Beginner Tutorial: Serial fishing
번역 : forc1 (http://forc1.net)

The Target:
WorldTV 7.1
http://www.netfor2.com/WorldTV.html
The Tools:
OllyDbg 1.09d, PEiD 0.92, W32dasm, HexWorkshop 4.1
The Protection:
Serial Protection
Other Information:
이 문서는 초보 크래커에게 올리로 serial fishing을 소개하기 위한문서다. 과정을 하나하나 보여줄 것이다. 새로운 타겟에 어떻게 접근할지 더 좋은 아이디어를 얻는데 도와줄것이다.

Intro:

필요한 툴은 인터넷에서 모두 구할 수 있다.
http://home.t-online.de/home/Ollydbg/odbg109d.zip
http://peid.has.it/
http://protools.cjb.net/

일단 툴을 설치하고 크랙할 준비를 한다. 타겟이 있는 폴더를 연다. 이 경우 c:\program files\worldtv\ 이고 만약의 경우를 대비해 백업을 해둬라. 나는 worldtv2.exe 로 백업했고 이 문서에선 이것을 참조할것이다.

패커나 프로택터를 확인하기 위해 PEiD를 사용한다. PEiD를 열고 worldtv2.exe를 이곳에 드래그한다. 그 결과는 "Microsoft Visual C++ 5.0". 놀랍게도 타겟은 패킹이나 프로택팅 되지 않았다. 이것은 크랙하기 더욱 쉽도록 한다.


Body:

우리가 파일을 언팩할 필요가 없을거란걸 알고 있는것은 우리가 프로텍션 scheme의 검사를 조금
하게 한다. 이제 worldtv를 실행한다. 등록되지 않았다는걸 알려주는 nag 스크린으로 바로 간다.
이것은 프로그램이 로드되기 전에 등록키(키 파일이나 레지스트리 키)를 체크한다는걸 우리에게
알려주기 때문에 중요하다. 임의의값을 넣어본다. "Invalid Registration Code" 라는 메시지박스가
떳다. 이것을 적어둔다. 만약 전에 다른 문서를 읽어봤다면 능숙히 얻을 수 있으리라 본다.
 확인을 누르고 프로그램을 종료한다.

Finding the Bytes:
일 단 쉬운 방법으로 해볼것이다. invalid 등록 박스로 리턴하는 jump를 패치할 것이다. w32dasm을
실행하고 WordTV.exe를 연다. 오리지날 WorldTV.exe 파일을 열고 있기때문에 작업은 위에서 만든
만든 복사본에서 할 수 있다. 디스어셈블이 끝난 후, 메시지박스에서 문자열을 찾을 것이다.
w32dasm 의 위쪽에 있는 String References 버튼을 클릭한다.
파일에서 찾을 수 있는 모든 문자열의 리스트가 새로운 창에 뜬다. "Invalid Registration Code"를
찾을 때까지 스크롤을 아래로 내리고 그것을 더블클릭한다. 아마도 아래의 라인에 있을것이다.



test eax, eax와 그 밑의 jne 0041B54C 코드를 보라.



아무 시리얼이나 넣어도 프로그림에 등록되도록 하기 위해 jne(jump if not equal)을 jmp(jump)로
바꾸길 원한다. 이것을 하기 위해 WorldTv.exe에서 jne 명령이 위치한곳을 찾을 필요가 있다.
그 정보는 w32dasm 창의 아랫쪽에서 찾을 수 있다. 아마 다음과 같을것이다.

Line:52558 Pg 657 and 658 of 1734 Code Data @:0041B521 @Offset 0001A915h in File
 WorldTV.exe

0001A915h의 오프셋 값에 관심이 있다.
 hexadecimal 값을 의미하는 마지막에있는 h를 빼고 이 숫자를 적어둔다.

Patching the Bytes:
HexWorkshop으로 WorldTV2.exe를 연다. 다이얼로그 박스로 이동하기 위해 CTRL+G를 누른다.
 Edit 아래에서도 찾을 수 있다. 아까 적어논 0001A915를 입력한다.
 










Hex 옵션과 Beginning of File 옵션을 체크한다
. 다 됐으면 Go를 누른다.

아마도 jne 0041B54C에 위치할 것이다. 7
5
는 명령어 JNE의 오피코드고 74는 명령어 JE의 오피코드라는걸 알꺼라 믿는다.
 이 경우 bad serial로 점프하는거보단 프로그램이 어떤 serial로 점프하길 원한다.
 75를 JMP 명령어인 EB로 바꿀것이다.
 


[ Before ]

[ After ]

WorldTV2.exe를 저장한다. 백업하고 싶거든 뭐라 물었을때 YES를 선택한다.
 이제 패치된 WorldTV2.exe를 실행해본다.

시리얼을 물으면 아무값이나 넣는다. 나는 1234567을 넣을것이다.
Validate Registration을 누르면.. 성공!
Registration Code Accepted. 여기서 끝? 아니다 :P

WorldTV2.exe를 닫았다가 다시 연다. 여전히 시리얼을 묻는다.
사용할 때마다 항상 시리얼을 넣어야 할 것이다. 매우 귀찮다.
그래서 우리는 진짜 시리얼을 찾을것이다.

Finding a Serial:
시작하기 전에, 이 프로그램에 대해 알고 있는 것을 재검토 해보자.
1. 시작할 때 시리얼을 체크한다.
2. 가짜 시리얼로 등록하면 다음에 시작할 때 등록되지 않는다.
이 것은 프로그램이 완전히 로드되기 전에 제대로된 시리얼을 체크한다는걸 의미한다.
시리얼이 어디에 저장되어 있는지 찾아야 한다. 보통 두군데에 저장이 된다. 레지스트리와 파일.
레지스트리를 체크하면서 시작할 것이다. WorldTV2.exe를 실행하고 시리얼로 1234567을 넣는다.
 시리얼을 확인하고 WorldTV를 닫는다.

시작-실행에 가서 "regedit"를 입력한다. regedit이 뜨고 두 개의 창이 보인다.
왼쪽창의 HKEY_CURRENT_USER 앞에 [+]를 클릭하면 또 다른 리스트가 열릴 것이다.
같은 방법으로 Software-WorldTV 까지 간다.
아하! 오른쪽창에 우리가 아까 입력한 1234567이 저장된 RegCode라는 키가 있다.
이제 WorldTV는 로드되기 전에 레지스트리에서 시리얼을 체크한다는걸 알게되었다.

올리를 실행할 것이다. 1.10은 브포설정할 때 가끔 충돌이 일어나서 나는 1.09d 버전을 쓸 것이다.
원본 WorldTV.exe를 연다.


아마 위에 있는 그림과 비슷하게 나올 것이다. Run 키 를 누르기 전에 브포를 걸어야 한다.
Code 창에서 우클릭-Search For-All Intermodular Calls를 선택한다.
 그러면 Calls 창이 뜰것이다. Destination으로 정렬한다.
RegQueryValueExA를 찾을 때까지 스크롤을 내린다.
그것을 선택하고 우클릭-Set breakpoint on every call to RegQueryValueExA을 선택한다..


이제 Run 버튼을 누른다. 처음에
FF15 0C304400 CALL DWORD PTR DS:[<&ADVAPI32.RegQueryValueExA>]에 서 멈출 것이다.
오른쪽에 있는 레지스터 윈도우를 보면 EDI에서 아스키값 "Recordings"을 볼 수 있다.
이것은 우리가 찾던 레지스트리 키가 아니므로 다시 실행을 누른다.
여기에 도착하기까지 24번의 실행을 눌러야 할 것이다.


EAX 값이 아스키 "RegCode" 라는걸 주의하라. 한번 더 실행을 누르면 여기에 위치한다.


그리고 ECX는 아스키 값 "RegCode"가 있다.
WorldTV가 등록 코드를 찾았기 때문에 점점 가까워 지고 있다는걸 알고있다.
를 통해 코드를 스텝할 것이고 레지스터에 집중할 것이다.
몇 스텝후 ESI 가 가짜 시리얼 1234567값을, EDI에
00000000-00000000-00000000-00000000
가지고 있는걸 찾았다. 이것은 흥미롭지만 000... 이 등록 코드인지는 의심스럽다.
좀 더 스텝 하면, EDI 가  
-00000000-00000000-00000000로 줄어든걸 볼 수 있다.
이것은 아직 우리에게 시리얼을 주지 않는다. 계속 나아가다 보면 EDI가 "
C:\Program Files\WorldTV\Scheduler.txt.tmp"로 바뀐다. 여기 도착한 포인트 다음에 곧 찾을것이다.


EAX, EBX, EDX가 0이 된걸 주목하라. 또한 EDI안에 하나의 아스키 값이 들어간걸 볼 수 있다.
 시리얼 코드를 볼곳이 바로 여기다. 스탭을 통해 조금 더 진행하면 루프안에 있다는걸 발견한다.
 시리얼이 만들어지는걸 볼 수 있고 다음의 주소에서 볼 수 있다.
MOV EDI,WorldTV.004C8950.
코드 라인을 통해 step 하기보단 MOV EDI,WorldTV.004C8950에 브포를 걸고 시리얼을 볼 것이다.
 라인을 선택하고 브포 설정을 위해 F2를 누른다.
이제 Run 버튼을 누르면 잠시 후 완성된 시리얼을 볼 수 있다.


이젠에 EDI가 시리얼이 8문자 4개 세트이거나 8문자 3개 세트였다는걸 유의하라.
3개의 전체 세트를 유심히 보면 빠진게 있다.
오직 2문자만 남았을 때 실행 버튼을 누는걸 멈추고 코드를 step 하라.
REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
라인을 지날 때 마지막 2문자도 볼수있다.


이 숫자들을 적어라. 또 다른 추가된 문자 세트가 있는지 확인하기 위해 Run을 다시 누른다.
없군.. Run을 다시 누르는 것은 분리된 시리얼이 계산되는 또 다른 루프를 돌게 할것이다.
(무엇을 위해? 프로그램에 등록하지 않을 것이기 때문에 확실친 않다)

이제 올리를 닫는다. 원본 WorldTV.exe를 열고 적어논 시리얼로 등록해본다.
Registration Code Accpeted, 진짜 시리얼로 성공적으로 WorldTV를 등록했다.
 패치 없이 말이다.

 


Conclusion:

나는 이 프로그램을 순수하게 올리를 이용해 시리얼을 찾는걸 설명하기 위해 사용했다. 만약 이 프로그램을 사용하려거든 구입하기바란다.

이 문서를 작성하는데 도움을준 사람들 모두에게 감사한다. 배울 수 있는 좋은 장소를 제공해준 Exetools, Woodmann, Arteam 에게 감사한다.

질문이나 할말이나 수정할것이 있으면 email 달라. Gabri3l2003[at]yahoo.com


출처 : http://forc1.net/

+ Recent posts