시간이 나서, Timer DPC에 관해서 정리해보고자 글을 쓴다.

  먼저 Timer DPC 라는 제목을 살펴보자. Timer와 DPC 2개로 분리가 된다. Timer는 뭔가 시간이 흐른다는것을 예상해볼 수 있고, DPC는 Deferred Procedure Call 의 약자로써, 지연된 처리의 호출이라고 해석할 수 있다. 사실 Timer의 의미는 대략적으로 예상해볼 수 있는데,  DPC는 뭐가 도대체 지연된 호출인가? 지연된 호출이 왜 필요하단 말인가? 하고 궁금증이 생길 수 있다.

  DPC를 이해하기 위해서는 IRQ 우선순위와 커널의 인터럽트 처리 메커니즘을 알고있어야 하는데, 일반적으로 외부 하드웨어에서 CPU에 인터럽트를 보내면 커널은 이를 인지하여 , 해당 하드웨어에 맞는 ISR을 적절히 선택하여 인터럽트 처리를 수행한다. 그런데 보통 이러한 인터럽트 서비스 루틴은 해당 하드웨어의 요청에 정말 필요한 크리티컬 코드들로만 짧게 구성되어져 있는데, 이는 어느 특정 인터럽트 서비스 루틴으로 인해, 다른 인터럽트 처리의 방해가 없도록 하기 위해서이다. 여기서 갑자기 방해가 왜 나올까? 라고 생각해볼수가 있는데, 여기에서 인터럽트 우선순위 레벨(IRQL) 을 생각해볼 수 있다. 예를 들어 시스템에서 특정 하드웨어가 있는데 , 이 하드웨어는 매우 크리티컬한 요소라서 최우선적으로 처리되어야 할 놈이라고 가정해보자. 이 하드웨어는 IRQL26 우선순위를 부여받고, ISR을 처리하게된다고 가정했을때,  ISR에서 빨리 끝내주지 않고 , 질질 끌게되면 다른 우선순위 낮은 하드웨어(예 : 키보드) 가 인터럽트 처리를 요청했을때, 우선순위 높은 애가 아직 CPU를 부여잡고 있으므로, 기다릴수 밖에 없을것이다.  키보드 빨리빨리 입력해야하는데 , 키보드가 드득드득 지연되면서 입력되는것을 상상해본적이 있는가? 
  그럼 이 문제를 해결하려면 어떻게 해야할까? 참 이런거 생각한사람들은 머리가 좋은것 같다. (어찌보면 단순한가?)  해결법은 ISR을 최대한 단순하고 중요한 코드들로만 구성하고, 만약에 ISR에서 못다한 그리 중요하지않은 추가적인 작업이 필요할 경우, DPC라는 녀석을 요청하는것이다. DPC는  DIRQL이상의 하드웨어 인터럽트 처리가 완료되고나서 , PASSIVE_LEVEL로 떨어지기 전에 DISPATCH_LEVEL에서 작동하는 구간인데, SW Interrupt(PASSIVE_LEVEL, APC_LEVEL , DISPATCH_LEVEL) 중에서는 가장 높은 레벨에 속한다. 이렇게 되면 하드웨어 인터럽트 처리가 완료되고 난다음에 DPC가 처리되기 때문에 , 다른 하드웨어의 인터럽트를 처리하는데 별 무리가 없을것이다.


  이제 Timer DPC의 의미를 다시 한번 생각해보자. DPC는 HW ISR처리가 완료되고난다음, DISPATCH_LEVEL에서 작동하는 SW INT인데 , 이것이 Timer와 합쳐지면 어떤 관련이 있을까? 사실 필자도 이것에 관해서 딱히 책에서 찾아본적은 없는데, 가만히 생각해보면 DPC는 SW INT이므로 , "커널 Timer의 힘을 빌어서 주기적으로 발생되는 SW INT" 라고 생각해도 크게 나쁜것 같지는 않다.

본격적으로 윈도우 커널에서 제공하는 Timer 관련 함수들중 자주 사용되는 함수들을 알아보자.
 
 
1. NTKERNELAPI VOID KeInitializeTimer ( __out PKTIMER Timer );

2. NTKERNELAPI BOOLEAN KeSetTimerEx ( __inout PKTIMER Timer, __in LARGE_INTEGER DueTime, __in LONG Period, __in_opt PKDPC Dpc );

 3. NTKERNELAPI BOOLEAN KeCancelTimer ( __inout PKTIMER )
 

 
 1. 타이머를 사용하기에 앞서 , 초기화를 수행해주는 함수이다.  ExAllocatePool을 이용하여 SystemPool에 KTIMER만큼 할당한뒤, 사용하는것을 권장.

2. 타이머 설정&시작 함수인데, 옵션으로 DPC루틴도 파라메터로 전달할수 있어서, 주기적으로 처리해야할 작업이 있을경우 요긴하게 쓸수 있다. 참고로 , KeSetTimer 함수와 KeSetTimerEx 함수간의 차이가 존재하는데,  KeSetTimer 함수는 Signal이 한번만 발생해서 DPC루틴이 한번만 호출되고 끝나게 되고,  KeSetTimerEx는 LONG Period만큼 주기적으로 DPC루틴이 호출되게 된다.
 
 
3. 타이머를 취소하는 함수로써 , 본인 코드 구성에 따라, 필요에따라 UnloadRoutine 같은곳에 넣어준다.


필자는 따로 편리하게 쓰기 위해서 함수를 정의한뒤, 

PKTIMER
InitializeTimer(VOID)
{
PKTIMER Timer;

Timer = (PKTIMER)ExAllocatePool(NonPagedPool, sizeof(KTIMER));
if(Timer == NULL)
{
return NULL;
}

KeInitializeTimer(Timer);
return Timer;
}

PKDPC
SetTimer
(
IN PKTIMER Timer,
IN LONG Period, 
IN OPTIONAL KDEFERRED_ROUTINE TimerDpcRoutine, 
IN OPTIONAL PVOID DpcRoutineContext
)
{
LARGE_INTEGER TimePeriod;
PKDPC DpcObj;

DpcObj = NULL;

if(TimerDpcRoutine != NULL)
{
DpcObj = (PKDPC) ExAllocatePool(NonPagedPool, sizeof(KDPC));
if(DpcObj == NULL)
{
return NULL;
}
KeInitializeDpc(DpcObj, TimerDpcRoutine, DpcRoutineContext);
}

TimePeriod.QuadPart = -100;
KeSetTimerEx(Timer, TimePeriod, Period, DpcObj);

return DpcObj;
}
 
VOID
ReleaseTimer(IN PKTIMER Timer, IN OPTIONAL PKDPC DpcObj)
{
KeCancelTimer(Timer);
ExFreePool(Timer);

if(DpcObj != NULL)
{
ExFreePool(DpcObj);
}
}


DriverEntry에  다음과 같은 코드를 넣어주었다.


TimerObj = InitializeTimer();
if(TimerObj == NULL)
{
return STATUS_UNSUCCESSFUL;
}
TimerDpcObj = SetTimer(TimerObj, 1000, TimerDpcRoutine, NULL);
if(!TimerDpcObj)
{
return STATUS_UNSUCCESSFUL;
}


또한 UnloadRoutine에는 다음과 같은 코드를 넣어주었다.

ReleaseTimer(TimerObj, TimerDpcObj);
 


이제 TimerDpcRoutine을 살펴보자.

 VOID TimerDpcRoutine(
IN PKDPC Dpc,
IN OPTIONAL PVOID DeferredContext,
IN OPTIONAL PVOID SystemArgument1,
IN OPTIONAL PVOID SystemArgument2
)
{
DBG_PRINT1("Warning! This routine executes on DISPATCH_LEVEL!\n");

if(IsSSDTAlreadyHooked(
(PBYTE)ZwSetInformationThread, 
(PBYTE)NewZwSetInformationThread, 
(PDWORD)KeServiceDescriptorTable.KiServiceTable) == FALSE)
{
disableWP_CR0();
OldZwSetInformationThread = (ZwSetInformationThreadPtr) hookSSDT((PBYTE)ZwSetInformationThread, 
(PBYTE)NewZwSetInformationThread, 
(PDWORD)KeServiceDescriptorTable.KiServiceTable);
enableWP_CR0();
}
return;
}

Timer DPC를 이용해서 간단하게 주기적으로 SSDT훅을 거는 코드를 구성해보았다. 이렇게 코드를 구성하면 , Timer DPC Detect 기능이 없는 루트킷 디텍터에서 SSDT를 Restore 한다고 해도, 1초마다 훅이 걸려있는지 검사해서 다시 훅을 걸어버리기 때문에, 악성 루트킷에서 요긴하게 사용될법 하다.
주의할점은, DPC Routine에서 Zw Routine은 호출하면 안된다는것이다. (Zw Routine은  PASSIVE_LEVEL에서만 호출이 가능하다!)

 

테스트 결과 잘 작동이 되었다.
아래는 스크린 샷.


드라이버를 시작한 모습.  DriverEntry에서 훅을 거는 코드를 작성하진 않았고 , TimerDpcRoutine에 훅을 거는 코드를 삽입했다. 따라서 , 훅은 TimerDpcRoutine에 의해서 걸린것이다.


SSDT Restore를 수행하려고 시도중인 모습.


SSDT Restore를 수행해도 바로 훅이 다시 걸린다. Period를 적절히 조절해주면 Performance도 어느정도 확보할 수 있을것 같다.


 
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
by Sone 2011.05.05 11:30
 요즘에는 SSDT후킹에 관한 정보들이 온라인상에 매우 많아졌고, 예제 코드또한 많아서 , 이에 대해서 잘 모른다고해도 , 몇번 쳐보고 실습해보면 금방 알수있게 되었습니다. SSDT후킹이라 함은,  System Service Descriptor Table 을 후킹한다는말인데, 좀더 구체적으로 살펴보면, 우선 커널에서 Export 하고있는 KeServiceDescriptorTable (또는 KeServiceDescriptorTableShadow)의 구조체를 살펴보면 다음과 같습니다.


typedef struct ServiceDescriptorEntry
{
UINT* ServiceTableBase;
UINT* ServiceCounterTableBase;
UINT NumberOfServices;
UCHAR* ParamTableBase;
} SSDT_Entry, *PSSDT_Entry;

typedef struct _SERVICE_DESCRIPTOR_TABLE {
SSDT_Entry ntoskrnl;          // Native API
SSDT_Entry win32k;           // GUI Sub System
SSDT_Entry reserved3; // Reserved.
SSDT_Entry reserved4; // Reserved.
} SERVICE_DESCRIPTOR_TABLE, *PSERVICE_DESCRIPTOR_TABLE; 


 대부분 SSDT후킹이라함은 , ntoskrnl(또는 win32k) . ServiceTableBase[INDEX]  를 따내는것이 대부분일것이고, 이것을 따내는목적은 시스템콜을 후킹함으로써 , 전역적으로 모든 쓰레드에 대하여 자신이 원하는 작업을 수행하게하려는 목적일것입니다. 그런데 이미 오래전부터 잘 알려진 사실이지만 ,  엄밀히 말하면  SSDT를 후킹하는것이   모든 쓰레드에 관해서 전역적으로 후킹한다는것은 틀린말입니다.
 윈도우에서 제공해주는 시스템API를 이용하여 쓰레드를 만들면 (또는 Main Thread 포함)  윈도우에서는 생성된 쓰레드를 효율적으로 관리하기위하여 , 커널레벨 내부적으로 ETHREAD , KTHREAD라는 Struct를 생성하여 관리합니다. 이중,  KTHREAD라는 구조체 내부를 살펴보면 다음과 같은 멤버가 있습니다.

(Windows XP Service Pack 3 기준)
   +0x0de NpxIrql          : UChar
   +0x0df InitialNode      : UChar
   +0x0e0 ServiceTable     : Ptr32 Void
   +0x0e4 Queue            : Ptr32 _KQUEUE
   +0x0e8 ApcQueueLock     : Uint4B
   +0x0f0 Timer            : _KTIMER

 즉 쓰레드마다  ServiceTable이라는 멤버를 가지고있고 , 특정 쓰레드에서 커널 시스템콜을 호출할 경우, 그 쓰레드는 자신의 KTHREAD의 ServiceTable 멤버를 참조하여 , 서비스 테이블을 찾아감을 알수 있습니다. 여기서 생각해보면 , 위 ServiceTable 멤버의 값을 임의로 바꿔버리게 되면 커널이 Export 하고있는 서비스테이블이 아닌, 다른 위치를 참조하게 된다는 말입니다.  먼저 ExAllocatePoolWithTag를 이용해서 메모리를 할당한뒤 , RtlCopyMemory 등을 이용하여, 원래의 서비스테이블 내용을 복사해주고 , ServiceTable멤버의 값을 새로 할당한 메모리주소로 바꿔주면 , 그때부터 그 쓰레드는 커널에서 Export 하고있는 서비스테이블을 참조하는것이 아니라 , 유저가 임의로 생성한 서비스테이블을 참조하게 되는것입니다. 흔히 SSDT를 따내면 전역적으로 후킹이 된다라고 하는것은 , 어플리케이션단에서 작동하는 쓰레드에 대해서 KTHREAD의 ServiceTable 멤버가 조작되지 않았을 경우에 한해서만 성립됩니다.  쓰레드마다 ServiceTable 멤버를 가지고있고 이 값이 변경되버리면 커널에서 Export 하고있는 SSDT를 후킹한다고 해도 , 그 후킹이 먹히지가 않을것이기 때문에 , 전역적인 후킹이라는것이 성립되지 않게 되는것이죠. 이것이 일명 Service Table Relocation이라고 하는것입니다. 이 Service Table Relocation은  SSDT후킹으로부터 보호하고자 하는 쓰레드를 대상으로해서 , 효율적으로 코드를 작성할수가 있어서 현업에서도 종종 이용되는것으로 알고있습니다. (1위 온라인 FPS 총게임에 채택된 보안솔루션도 이 방법을 쓰고있죠.)

 그런데 여기서 머리를 조금만 굴려보면 , 이 Service Table Relocation 도 무력화 시킬수 있는 방법이 있습니다. 즉 , 모든 쓰레드에 대하여 전역적인 SSDT후킹이 가능해지는것이죠. 그 방법은 KiFastCallEntry를 인라인 후킹하는 방법입니다. (뭐 잘 아시는분들이 수두룩할겁니다. 전혀 새로운 방법이 아니죠) KiFastCallEntry는  유저레벨에서  시스템콜을 호출해서  Ring Transaction이 이루어져서 커널레벨로 진입한뒤 , 제일 처음 호출되는 함수라는 의미에서 Entry라는 이름이 붙여진것같네요. 질질 끌지않고 바로 핵심내용을 살펴보면 KiFastCallEntry 함수 내부의 코드를 살펴보면 아래와 같은 내용이 있습니다.


805435bf 8bf8            mov     edi,eax
805435c1 c1ef08          shr     edi,8
805435c4 83e730          and     edi,30h
805435c7 8bcf            mov     ecx,edi
805435c9 03bee0000000    add     edi,dword ptr [esi+0E0h]
805435cf 8bd8            mov     ebx,eax
805435d1 25ff0f0000      and     eax,0FFFh
805435d6 3b4708          cmp     eax,dword ptr [edi+8]
805435d9 0f8333fdffff    jae     nt!KiBBTUnexpectedRange (80543312)
805435df 83f910          cmp     ecx,10h
805435e2 751b            jne     nt!KiFastCallEntry+0xcf (805435ff)
805435e4 648b0d18000000  mov     ecx,dword ptr fs:[18h]
805435eb 33db            xor     ebx,ebx
805435ed 0b99700f0000    or      ebx,dword ptr [ecx+0F70h]
805435f3 740a            je      nt!KiFastCallEntry+0xcf (805435ff)
805435f5 52              push    edx
805435f6 50              push    eax
805435f7 ff1548e75580    call    dword ptr [nt!KeGdiFlushUserBatch (8055e748)]
805435fd 58              pop     eax
805435fe 5a              pop     edx
805435ff 64ff0538060000  inc     dword ptr fs:[638h]
80543606 8bf2            mov     esi,edx
80543608 8b5f0c          mov     ebx,dword ptr [edi+0Ch]
8054360b 33c9            xor     ecx,ecx
8054360d 8a0c18          mov     cl,byte ptr [eax+ebx]
80543610 8b3f            mov     edi,dword ptr [edi]
80543612 8b1c87          mov     ebx,dword ptr [edi+eax*4]
80543615 2be1            sub     esp,ecx
80543617 c1e902          shr     ecx,2
8054361a 8bfc            mov     edi,esp
8054361c 3b3534415680    cmp     esi,dword ptr [nt!MmUserProbeAddress (80564134)]
80543622 0f83a8010000    jae     nt!KiSystemCallExit2+0x9f (805437d0)
80543628 f3a5            rep movs dword ptr es:[edi],dword ptr [esi]
8054362a ffd3            call    ebx

 제일 윗쪽의 진하게 표시된 부분을 보시면 ,  ESI + 0x0E0h 를 한다음 그것을 DWORD만큼 참조해서 연산을 수행하고 있습니다. 805435c9  에 EIP가 왔을때 , EDI의 값이 어떤지는 라이브 디버깅을 해보지않아서 현재로썬 모르겠지만, 여기서 ESI는 PKTHREAD일것이 분명할것이고 , 0x0E0는   ServiceTable 멤버의 Offset이라는거죠.   그다음 진한부분을 보시면  EDI 레지스터가 지니고있는 포인터를 DWORD만큼 참조하여 , EDI로 넣고 있습니다. EIP가 80543610에 왔을때 ,  EDI레지스터는  KeServiceDescriptorTable 또는 KeServiceDescriptorTableShadow의 값을 가지고 있을겁니다. 해당 라인이 수행되고나면 , EDI는 KiServiceTable 또는 W32pServiceTable 의 값을 가지게 될것입니다. 다음줄에서 EDI+EAX*4 연산을 수행하게되면, EBX는   KiServiceTable(또는 W32pServiceTable)  + (Service Number * 4) 의 값을 가지게 될것입니다. 즉 실제 Native 시스템콜이 구현되어져 있는부분의 주소값을 EBX가 가지게 된다는 말이죠. 그리고나서 맨 아랫줄에서 call ebx를 통하여 실제 시스템콜을 호출합니다. 그럼 여기서 핵심은 80543610 , 80543612인데, EIP가 80543610에 왔을때 EDI값은  KTHREAD의 ServiceTable 멤버를 참조하는것이 분명할것이기 때문에 , 이 부분을 인라인 후킹해주면 될것입니다. 후킹 함수는 다음과 같이 작성해볼 수 있겠죠.


__declspec(naked) VOID hookproc()
{
_asm
{
mov edi, dword ptr [edi]
cmp edi, OriginalSSDT
je RelocationMySSDT
cmp edi, OriginalSSDTShadow
je RelocationMySSDTShadow
jmp CalculateSystemCall
RelocationMySSDT:
mov edi, MyHookSSDT
jmp CalculateSystemCall
RelocationMySSDTShadow:
mov edi, MyHookSSDTShadow
jmp CalculateSystemCall
CalculateSystemCall:
mov ebx, dword ptr [edi+eax*4]
retn
}
}

위 naked 함수는 이미 특정 커널 드라이버에 의해서 Service Table Relocation 되버린 쓰레드를 걸러내는 기능을 하지는 못하고, 원본 SSDT, SSDTShadow 를 참조하는 쓰레드를 대상으로 전역적인 후킹이 가능하게끔 구현되어져 있지만,
PKTHREAD(KeGetCurrentThread)의  Win32Thread를 참조로하여 ,  그것의 TEST연산 결과를 이용하여(단순 GUI쓰레드 판별) , 그것이 Relocation되버린 쓰레드이건 , 커널의 서비스 테이블을 참조하고있는 쓰레드이건 상관없이, 강제적인 SSDT훅 , 또는 SDTShadow훅을 걸어버리게끔 코드 작성을 생각해볼 수 있습니다. 
 이렇게 하면 KTHREAD 단에서 ServiceTable의 멤버를 바꿔서 Relocation을 수행한다고 해도, KiFastCallEntry에서 Init을 수행하는 과정에서 후킹을 해버리기 때문에  , 모든 쓰레드에 대하여 전역적으로 후킹이 가능해질 것입니다. (사실 실제로 구현해보지는 않았습니다만, 될것으로 확신합니다.)  "KiFastCallEntry 후킹 + 시스템콜 (인라인)후킹"  을 써먹으면 매우 강력한 방법이 될것입니다.
저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
by Sone 2010.09.12 07:00




  • 1장 윈도우, 메시지(Window, Message)
    01 윈도우(Window)
    02 윈도우 프로시저(Window Procedure)
    03 윈도우 메시지(Window Message)
    04 모달 윈도우 해제하기(Modal Window Free)
    05 데스크톱(Desktop), 세션(Session), 스테이션(Station)

    2장 프로세스, 스레드(Process, Thread)
    01 프로세스의 구조
    02 스레드의 구조
    03 스레드 관리 기법
    04 스레드 로컬 스토리지(Thread-Local Storage)

    3장 커널 객체(Kernel Object)
    01 핸들(Handle)과 객체(Object)
    02 동기화 객체(Synchronization Object)
    03 커널 객체 공유
    04 보안 속성(Security Attributes)

    4장 디버깅(Debugging)
    01 디버거(Debugger)
    02 디버기(Debuggee)
    03 디버깅 API
    04 심볼과 맵(Symbol & Map)
    05 디버거 연결
    06 특권(Privilege)
    07 PEB, TEB 확인하기

    5장 어셈블리(Assembly) 언어
    01 어셈블리 언어 형식(Instruction Format)
    02 레지스터(Register)
    03 기본 명령어 이해

    6장 해킹 기법(Hacking Techniques)
    01 버퍼 오버플로우(Buffer Overflow)
    02 포맷 문자열 공격(Format String Attack)
    03 코드 케이브(Code Cave)
    04 화면 정보 구하기
    05 비정상 함수 호출(Abnormal Function Call)
    06 리플레이 공격(Replay Attack)
    07 IPC 스니핑(IPC Sniffing)
    08 코드 훔치기(Code Steal)
    09 코드 패치(Code Patch)
    10 루트킷(Rootkit)

    7장 DLL 인젝션(DLL Injection)
    01 DLL 인젝션
    02 DLL 인젝션 기법
    03 DLL 인젝션 방어

    8장 API 후킹(API Hooking)
    01 IAT(Import Address Table) 후킹
    02 인라인 코드 패치(Inline Code Patch)
    03 SSDT(System Service Descriptor Table) 후킹

    9장 안티디버깅(Anti-debugging)
    01 디버깅(Debugging) API
    02 디버그 플래그(Debug Flag)
    03 중단점(Breakpoint)
    04 예외 처리기(Exception Handler)
    05 기타

    10장 메모리 상의 데이터 변경
    01 가상 메모리와 물리적인 메모리의 관계
    02 메모리 조작 도구
    03 디버거를 통한 메모리 조작
    04 API를 통한 메모리 조작

    11장 자동 입력 프로그램 제작
    01 응용 레벨 자동 입력 프로그램
    02 커널 레벨 자동 입력 프로그램

    12장 스풀 데이터(Spool Data) 조작
    01 스풀(Spool) 동작
    02 스풀 가로채기(Spool Hijacking) 소스 코드

    13장 디바이스 드라이버(Device Driver) 개발
    01 디바이스 드라이버의 기본 구조
    02 디바이스 드라이버 로딩하기
    03 디바이스 드라이버에 명령 보내기

    14장 보안을 고려한 개발
    01 보안의 필요성
    02 씬 클라이언트(Thin Client)
    03 디버그 코드(Debug Code)
    04 함수 명명(Function Naming)
    05 설정 및 UI(User Interface)
    06 데이터(Data)
    07 문자열

    부록 주요 디버거(Debugger) 소개
    01 WinDbg
    02 OllyDbg
    03 IDA
    04 SoftIce

  • 위에서 다루고 있는 내용의 대부분은 , 시스템 프로그래밍과  ,C언어 정도는 기본적으로 알고있어야 내용을 쉽게 볼수있는듯 하다.
    C언어는 알고있더라도 ,시스템 프로그래밍분야를 모른다면 , 보기가 매우 힘들것이다.

    예를 들어  구조적 예외 핸들링  기법같은경우는 , 시스템프로그래밍에서 나올법한 내용인데,
    처음부터 아무렇지 않게  소스코드에 넣어서 ,  설명도 없이 등장하고 있다. 
    (마치 , 이건 설명도 필요없을만큼 당연히 알고있어야 한다는듯이)

    책의 전체적인 내용을 살펴보면 , 부분부분 상세하게 이론설명을 하지는 않고 ,
    간단히 순서와 이론 정리를 간단하게 한다음 , 소스코드를 장황하게 늘어놓고 , 실전에 쓰일법한 기법을 바로 설명하고있다.
    따라서 이 책을 이용해서,  
    뭔가  처음부터 다양한분야를 차근차근 상세히 배울 생각은 하지 않는게 좋을것 같다.(지극히 주관적인 생각)
    중급자 이상부터 볼 책인듯.

    결론은 서적 소개란에 보면 , 막 입문하려는 개발자부터 봐도 된다고 나와있지만 ,  본인 주관적인 생각으로는 "전혀 그렇지 않다" 이다.
    물론 저자가 의도한  입문하려는 개발자라는 말의 의미는 
    "위의 선수과목을 전부다 이수하고 , 이제 보안관련 분야에 입문하려는" 이라는 의미일수도 있겠다. (혼동하는 일이 없기를)

    아직 시스템프로그래밍을 잘 모르는 분들은(저도 아직 잘 모릅니다)    구매를 보류하는게 좋을듯 하다..

    저작자 표시 비영리 변경 금지
    신고
    크리에이티브 커먼즈 라이선스
    Creative Commons License
    by Sone 2009.07.06 17:55

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

     

     

     

    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

    ARP스푸핑 공격이 한때 이슈가 되었었죠~
    자신과 동일 선상에 있는 모든 네트워크를 공격할수 있다고 하는데..

     

    간단히 말해서 ,  자기와 가까이 사는 옆동네의 컴퓨터를 공격할 수 있다는 말입니다.



    공격유형에는 여러가지가 있겠지만,   (동일 네트워크 선상에 트로이목마 전파 ,  패킷캡쳐 등)


    오늘은 그중 한가지인  ,   ARP스푸핑을 통한  패킷캡쳐를 해봤스빈다.












    자신과 동일 네트워크 선상에 있는 네트워크 IP들을 스캔합니다.
    (예 :  111.111.111.1  ~  111.111.111.255)


    간략하게 어떤 컴퓨터를 쓰는지도 표시해줍니다.
    스샷을 간단히 보니깐.........우리 옆동네 사람들 중,

     ECS메인보드를 쓰는 컴퓨터도 보이고......삼성컴푸타도 보이고.......ASUSTek 메인보드를 쓰는 조립 컴푸타도 보이네요.












    스캔된 컴퓨터중 ,  공격을 시도할  컴퓨터의 IP를 선택해주고 ,   그 네트워크의 게이트웨이를 선택해줍니다.
    클라이언트와  , 게이트웨이 간에 패킷이 오가는것을 캡쳐하기 위해서죠.

     

    즉,  자신이 인터넷의 링크를 하나 클릭하는 순간에,  자기 컴퓨터에서  인터넷서비스제공업체의  서버로 패킷이 전송되게 되는데,

    이것을 따내는 겁니다.

    뭐 물론 받아오는 정보도 볼수 있죠.

     


    그냥 간단히 말해서 다른 사람이 인터넷으로 뭐하는지 전부다 다 볼수있다  이거입니다..











    공격할 컴퓨터를 선택한뒤 ,  패킷 스니핑을 시작합니다..
    패킷이 많이 잡히네요~   데스티네이션 IP도 표시해줍니다.
    패킷헤더에는 많은 정보들이 들어있으니까요....












    Wireshark 로 ,  스니핑을 해봤습니다.
    패킷 내용이 모두다 나오네요~
    뭐 이사람은  cyworld를 하는것같군요...
    위 스샷의 내용은 극히 일부에 불과하빈다.



    로그인할때 , 아이디 비밀번호가  바로 암호화되지 않고  전송되는 ,  
    보안이 취약한  일부 온라인게임이나 ,   웹사이트 ,    웹하드의 계정은
    간단하게 훔쳐낼 수 있습니다.

    저런 패킷의 내용에 포함되어 있는  쿠키 정보같은것도 손쉽게 빼낼수 있습니다.

     

     

    설령 뭐 암호화된다고 하더라도 ,  문자열별 암호화 패턴을 분석해서 시간만 들이면 쉽게 복호화 할수 있겠죠~







    어때요~  참 쉽죠?


    이렇게 쉬운데 ,   이런 쉬운공격에 당하시면 참 억울해하실 것 같아서 ,  이렇게 알려드리빈다.





    이런 공격이 있다는것도 알고 계셔야 할것같아서 , 글을 써봤구요~ (물론 아시는분들도 많을거라 봅니다.)



    이제   왜  취약점이 있는   웹사이트에  접근하면 안되는지  대략 감이 오시겠죠~~??
    백신 조낸 설치하고 ,  윈도우 업데이트 킹왕짱 설치해놔도...

    우연찮게 취약점 있는 사이트에 접근했는데,,,, 그때 누군가가 ARP스푸핑 패킷스니핑을 통해서 , 훔쳐봤다!!

    이렇게 되면 뭐 끝나는거죠.


    꼭 트로이목마가 아니더라도 , 이런식으로 접근할 수도 있다는 말입니다...

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

    티스토리 툴바