U E D R , A S I H C RSS

이영호/n Protect Reverse Engineering

(개인적으로 이 ZeroWikihttp://www.dasomnetwork.com/~leedw/ 개인 위키인 이곳보다 정보가 없다. 정말 아쉽다.)
좋은 생각이네요. ZeroWiki란 제로페이지 위키를 말하는 것이겠죠? 제로페이지 위키는 정보가 많은 곳이 되어야 합니다. 그리고 모아놓은 정보를 가다듬는 작업이 따라야 정말로 효과가 있을 것입니다. 위키에서는 이를 정원관리에 비유하죠. 그리고 아직까지는 사람이 손으로 일일이 페이지를 돌아다니며 가꾸어주어야 합니다.
제로페이지 위키에 글은 많은데 자료는 거의 없는 이유는 가다듬는 작업이 거의 안 일어나서라고 봅니다. 예를 들면 중복되는 내용을 담은 페이지, 관련된 내용인데도 서로 다른 이름과 분류 아래 저장된 페이지, 의미를 알 수 없는 이름을 가진 페이지, 너무 옛날 자료라서 이제는 의미없는 내용을 담고 있는 페이지 따위입니다. 자신이 만든 페이지는 누구보다도 글쓴이 자신이 잘 가다듬을 수 있을 것입니다. 때문에 자신이 만든 페이지부터 가다듬는 것이 좋은 정보를 많이 찾을 수 있는 위키를 만드는 지름길이라고 생각합니다. 더 좋은 방법이 있을까요? -- Leonardong
특정한 게임을 Cracking 하려고 했더니 nProtect와 비슷한 녀석이 디버그 되는 것을 방해하고 있었다.

게임 : 마비노기(Mabinogi)
Protector : guardcat 이라는 nProtect와 같은 동작을 수행하는 녀석

# 1일째
nexon의 경우 Protector를 외주에 주는 것이 아니라 게임을 만드는 팀 자체에서 설계하여 완성하는 것 같다.
확인 결과 nProtect와 guardcat은 비슷한 역할을 수행하는 것을 발견하였다.
(누군가가 nProtect가 함수를 hooking을 하고, 게임 자체 소스에 포함 되는 것이 아니라 바이너리 형식으로 덧 붙여진다고 하였는데,
마비노기가 아닌 다른 nProtect를 사용하는 게임을 확인한 결과 소스에 포함되어 Exception Handling을 한다는 것을 발견하였다.)

guardcat을 확인하니 EnumServicesStatusA로 Process의 정보를 빼와서 OpenProcess로 열어 debug를 확인 하는 루틴을 발견하였다.
이것을 인라인 패치하였지만, OpenProcess로 디버그 Process를 Hooking하는 함수는 gc_proch.dll에 있다는 것을 확인하였다.
=> guardcat.exe -> gc_proch.dll
두개를 고쳤지만 게임을 실행하니 원래대로 돌아가 있다는 것을 확인 후, 업데이트 파일이 있다는 것을 깨닫고, 파일을 변경 하였지만 시도는 성공 되지 않았다.
업데이트 파일에서 host의 patch 주소를 내가 사용하는 eady.sarang.net/~dark/12/Mabi/로 고치고 여기에 파일 3개를 올리고 시도 하였더니
성공 하였다. 다행히 이 guardcat은 Packing, Enchypher로 인한 encoding이 되지 않아서 인라인 패치가 쉬웠다.

# 2일째
=> gcupdater -> guardcat.exe -> gc_proch.dll
몇몇개의 함수만을 수정하고 guardcat.exe만 실행하였으나 gc_proch.dll의 hooking 루틴때문에 막혀버렸다.
!!! gc_proch.dll을 더 분석해야할 것이다.
gc_proch.dll 파일을 제거후 실행하였더니 gaurdcat.exe가 실행되고 debugger도 제대로 동작 하는 것을 알았다.
중요한것은 update를 어떻게 막느냐이다. 아마도 gc_proch.dll이 없더라도 mabinogi.exe는 제대로 실행될 것이다.

=> mabinogi.exe -> client.exe -> gcupdater -> guardcat.exe -> gc_proch.dll
이렇게 동작하는 것을 확인하였다.
여기까지 분석하는데 2일씩이나 걸리다니...
1. mabinogi.exe(게임 자체의 업데이트 체크를 한다. 그리고 createprocess로 client.exe를 실행하고 종료한다.)
2. client.exe(client가 실행될 때, gameguard와는 별개로 디버거가 있는지 확인하는 루틴이 있는 듯하다. 이 파일의 순서는 이렇다. 1. 데이터 파일의 무결성검사-확인해보지는 않았지만, 이게 문제가 될 소지가 있다. 2. Debugger Process가 있는지 Check.-있다면 프로세스를 종료한다. 3. gcupdater.exe를 서버로부터 받아온다. 4. createprocess로 gcupdater를 실행한다. 5. 자체 게임 루틴을 실행하고 gcupdater와 IPC를 사용할 thread를 만든다.)
3. gcupdater(실행시 항상 서버에 접속하여 파일 3개를 받아온다. guardcat.exe, INST.dat, gc_proch.dll을 순서대로 받아와 자체적으로 wsprintf를 이용하여 복사한다.-아마 디버거에 API를 걸리기 싫었는지 모른다. createprocess로 guardcat.exe를 실행시킨다.)
4. guardcat.exe(실행시 EnumServicesStatusA로 Process List를 받아와 gc_proch.dll 파일과 IPC로 데이터를 보낸다. 이 파일이 실행되는 Process를 체크하여 gc_proch.dll로 보내게 된다. 또한 IPC를 통해 client.exe에 Exception을 날리게 되 게임을 종료시키는 역할도 한다.)
5. gc_proch.dll(이 파일은 debugger를 잡는 역할을 한다. 분석이 더 필요하다.) -> 이 파일은 dll injection 또한 막아낸다.

# 3일째
지금까지의 자료들을 분석한 결과 key는 client.exe가 쥐고 있는 것으로 보인다.
client.exe가 실행될 때, 데이터 무결성과 디버거를 잡아내는 루틴을 제거한다면, updater의 사이트를 내 사이트로 변경후 인라인 패치를 통한 내 protector를 올려 mabinogi를 무력화 시킬 수 있다.
아니면 client.exe가 gcupdater.exe를 받아내는 부분을 고치면 한결 수월 해 질 수도 있다. 단지, 무결성이 넘어가지 않는다면 힘들어진다.

그리고 zeropage에 정보 업로드 (부디 이건 google에 걸리면 안되는 문서다.)

-------------------------------------
mabinogi.exe -> client.exe로 넘어가는 부분

CreateProcess() 매개변수
|ModuleFileName = NULL
|CommandLine = ""C:\Program Files\Mabinogi\client.exe" code:1622 ver:237 logip:211.218.233.200 logport:11000 chatip:211.218.233.192 chatport:8000 setting:"file://data/features.xml=Regular, Korea""
|pProcessSecurity = NULL
|pThreadSecurity = NULL
|InheritHandles = FALSE
|CreationFlags = 0
|pEnvironment = NULL
|CurrentDir = "C:\Program Files\Mabinogi"
|pStartupInfo = 0012E4F0
|pProcessInfo = 0012E4E0

client.exe code:1622 ver:237 logip:211.218.233.200 logport:11000 chatip:211.218.233.192 chatport:8000 setting:"file://data/features.xml=Regular, Korea" 로 실행시키면 된다.
-------------------------------------

지금은 reverse engineering을 하는 중이다.
Protector가 제거 된다면 바로 cracking에 들어가자. -_-^
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2009-05-27 07:09:19
Processing time 0.1062 sec