(ê°œì�¸ì �으로 ì�´ ZeroWiki는 http://www.dasomnetwork.com/~leedw/ ê°œì�¸ 위키ì�¸ ì�´ê³³ë³´ë‹¤ ì •ë³´ê°€ 없다. ì •ë§� 아쉽다.)
게임 : 마비노기(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ì—� 들어가ìž�. -_-^
좋ì�€ ìƒ�ê°�ì�´ë„¤ìš”. ZeroWiki란 ì œë¡œíŽ˜ì�´ì§€ 위키를 ë§�하는 것ì�´ê² ì£ ? ì œë¡œíŽ˜ì�´ì§€ 위키는 ì •ë³´ê°€ ë§Žì�€ ê³³ì�´ ë�˜ì–´ì•¼ 합니다. ê·¸ë¦¬ê³ ëª¨ì•„ë†“ì�€ ì •ë³´ë¥¼ 가다듬는 작업ì�´ ë”°ë�¼ì•¼ ì •ë§�로 효과가 있ì�„ 것입니다. 위키ì—�서는 ì�´ë¥¼ ì •ì›�관리ì—� ë¹„ìœ í•˜ì£ . ê·¸ë¦¬ê³ ì•„ì§�까지는 사람ì�´ ì†�으로 ì�¼ì�¼ì�´ 페ì�´ì§€ë¥¼ ë�Œì•„다니며 가꾸어주어야 합니다.
ì œë¡œíŽ˜ì�´ì§€ 위키ì—� 글ì�€ ë§Žì�€ë�° ìž�료는 ê±°ì�˜ 없는 ì�´ìœ 는 가다듬는 작업ì�´ ê±°ì�˜ 안 ì�¼ì–´ë‚˜ì„œë�¼ê³ 봅니다. 예를 들면 중복ë�˜ëŠ” ë‚´ìš©ì�„ ë‹´ì�€ 페ì�´ì§€, ê´€ë ¨ë�œ ë‚´ìš©ì�¸ë�°ë�„ 서로 다른 ì�´ë¦„ê³¼ 분류 아래 ì €ìž¥ë�œ 페ì�´ì§€, ì�˜ë¯¸ë¥¼ 알 수 없는 ì�´ë¦„ì�„ 가진 페ì�´ì§€, 너무 ì˜›ë‚ ìž�료ë�¼ì„œ ì�´ì œëŠ” ì�˜ë¯¸ì—†ëŠ” ë‚´ìš©ì�„ ë‹´ê³ ìžˆëŠ” 페ì�´ì§€ 따위입니다. ìž�ì‹ ì�´ ë§Œë“ íŽ˜ì�´ì§€ëŠ” 누구보다ë�„ 글쓴ì�´ ìž�ì‹ ì�´ 잘 가다듬ì�„ 수 있ì�„ 것입니다. 때문ì—� ìž�ì‹ ì�´ ë§Œë“ íŽ˜ì�´ì§€ë¶€í„° 가다듬는 것ì�´ 좋ì�€ ì •ë³´ë¥¼ ë§Žì�´ ì°¾ì�„ 수 있는 위키를 만드는 지름길ì�´ë�¼ê³ ìƒ�ê°�합니다. ë�” 좋ì�€ 방법ì�´ 있ì�„까요? -- Leonardong
íŠ¹ì •í•œ 게임ì�„ Cracking í•˜ë ¤ê³ í–ˆë�”니 nProtect와 비슷한 ë…€ì„�ì�´ 디버그 ë�˜ëŠ” 것ì�„ ë°©í•´í•˜ê³ ìžˆì—ˆë‹¤.
ì œë¡œíŽ˜ì�´ì§€ 위키ì—� 글ì�€ ë§Žì�€ë�° ìž�료는 ê±°ì�˜ 없는 ì�´ìœ 는 가다듬는 작업ì�´ ê±°ì�˜ 안 ì�¼ì–´ë‚˜ì„œë�¼ê³ 봅니다. 예를 들면 중복ë�˜ëŠ” ë‚´ìš©ì�„ ë‹´ì�€ 페ì�´ì§€, ê´€ë ¨ë�œ ë‚´ìš©ì�¸ë�°ë�„ 서로 다른 ì�´ë¦„ê³¼ 분류 아래 ì €ìž¥ë�œ 페ì�´ì§€, ì�˜ë¯¸ë¥¼ 알 수 없는 ì�´ë¦„ì�„ 가진 페ì�´ì§€, 너무 ì˜›ë‚ ìž�료ë�¼ì„œ ì�´ì œëŠ” ì�˜ë¯¸ì—†ëŠ” ë‚´ìš©ì�„ ë‹´ê³ ìžˆëŠ” 페ì�´ì§€ 따위입니다. ìž�ì‹ ì�´ ë§Œë“ íŽ˜ì�´ì§€ëŠ” 누구보다ë�„ 글쓴ì�´ ìž�ì‹ ì�´ 잘 가다듬ì�„ 수 있ì�„ 것입니다. 때문ì—� ìž�ì‹ ì�´ ë§Œë“ íŽ˜ì�´ì§€ë¶€í„° 가다듬는 것ì�´ 좋ì�€ ì •ë³´ë¥¼ ë§Žì�´ ì°¾ì�„ 수 있는 위키를 만드는 지름길ì�´ë�¼ê³ ìƒ�ê°�합니다. ë�” 좋ì�€ 방법ì�´ 있ì�„까요? -- Leonardong
Protector : guardcat ��는 nProtect와 같� �작� 수행하는 녀�
nexon� 경우 Protector를 외주� 주는 것� 아니� 게임� 만드는 팀 �체�서 설계하여 완성하는 것 같다.
확ì�¸ ê²°ê³¼ nProtect와 guardcatì�€ 비슷한 ì—í• ì�„ 수행하는 것ì�„ 발견하였다.
(누군가가 nProtectê°€ 함수를 hookingì�„ í•˜ê³ , 게임 ìž�ì²´ 소스ì—� í�¬í•¨ ë�˜ëŠ” 것ì�´ 아니ë�¼ ë°”ì�´ë„ˆë¦¬ 형ì‹�으로 ë�§ ë¶™ì—¬ì§„ë‹¤ê³ í•˜ì˜€ëŠ”ë�°,
마비노기가 아닌 다른 nProtect를 사용하는 게임� 확�한 결과 소스� �함�어 Exception Handling� 한다는 것� 발견하였다.)
�것� ��� 패치하였지만, OpenProcess로 디버그 Process를 Hooking하는 함수는 gc_proch.dll� 있다는 것� 확�하였다.
=> guardcat.exe -> gc_proch.dll
ë‘�개를 ê³ ì³¤ì§€ë§Œ 게임ì�„ 실행하니 ì›�래대로 ë�Œì•„ê°€ 있다는 것ì�„ 확ì�¸ 후, ì—…ë�°ì�´íЏ 파ì�¼ì�´ 있다는 것ì�„ ê¹¨ë‹«ê³ , 파ì�¼ì�„ 변경 하였지만 시ë�„는 성공 ë�˜ì§€ 않았다.
ì—…ë�°ì�´íЏ 파ì�¼ì—�서 hostì�˜ patch 주소를 ë‚´ê°€ 사용하는 eady.sarang.net/~dark/12/Mabi/로 ê³ ì¹˜ê³ ì—¬ê¸°ì—� 파ì�¼ 3개를 ì˜¬ë¦¬ê³ ì‹œë�„ 하였ë�”니
성공 하였다. 다행히 ì�´ guardcatì�€ Packing, Enchypher로 ì�¸í•œ encodingì�´ ë�˜ì§€ 않아서 ì�¸ë�¼ì�¸ 패치가 ì‰¬ì› ë‹¤.
=> 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는 ì œëŒ€ë¡œ 실행ë� 것ì�´ë‹¤.
ì�´ë ‡ê²Œ ë�™ìž‘하는 것ì�„ 확ì�¸í•˜ì˜€ë‹¤.
여기까지 분�하는� 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 ë˜�한 막아낸다.
지금까지ì�˜ ìž�료들ì�„ ë¶„ì„�한 ê²°ê³¼ key는 client.exeê°€ ì¥�ê³ ìžˆëŠ” 것으로 ë³´ì�¸ë‹¤.
client.exeê°€ 실행ë� 때, ë�°ì�´í„° 무결성과 디버거를 잡아내는 루틴ì�„ ì œê±°í•œë‹¤ë©´, updaterì�˜ 사ì�´íŠ¸ë¥¼ ë‚´ 사ì�´íŠ¸ë¡œ 변경후 ì�¸ë�¼ì�¸ 패치를 통한 ë‚´ protector를 ì˜¬ë ¤ mabinogi를 ë¬´ë ¥í™” 시킬 수 있다.
아니면 client.exeê°€ gcupdater.exe를 받아내는 부분ì�„ ê³ ì¹˜ë©´ 한결 수월 í•´ 질 수ë�„ 있다. 단지, 무결성ì�´ 넘어가지 않는다면 힘들어진다.
mabinogi.exe -> client.exe로 넘어가는 부분
|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
-------------------------------------
Protectorê°€ ì œê±° ë�œë‹¤ë©´ 바로 crackingì—� 들어가ìž�. -_-^










