posted by 블르샤이닝 2011. 10. 7. 11:50
728x90

PEB 구조체를 이용한 간단한 안티디버깅 코드

CALL      00000000
MOV       EAX, 18
MOV       EBX, DWORD PTR FS:[EAX]
ADD        EBX, 30
MOV       EAX, EBX
MOV       EAX, DWORD PTR DS:[EAX]
INC         EAX
INC         EAX
MOVZX   EAX, BYTE PTR DS:[EAX]
SHL        EAX, 2
ADD        EAX, 63
ADD        DWORD PTR SS:[ESP], EAX
RETN


이걸 좀 눈에 보기 좋게 바꾸면....

CALL      00000000
MOV       EAX, DWORD PTR FS:[18]
ADD        EAX, 30
MOV       EAX, DWORD PTR DS:[EAX]
ADD        EAX, 2
MOVZX   EAX, BYTE PTR DS:[EAX]
SHL        EAX, 2
ADD        EAX, 63
ADD        DWORD PTR SS:[ESP], EAX
RETN


FS:[0] 레지스터는 TEB구조체의 시작이다.
TEB구조는 다음과 같다.

typedef struct _TEB
{
    NT_TIB NtTib;
    PVOID EnvironmentPointer;
    CLIENT_ID ClientId;
    PVOID ActiveRpcHandle;
    PVOID ThreadLocalStoragePointer;
    PPEB ProcessEnvironmentBlock;
    ULONG LastErrorValue;
    ...
}

FS:[18] 이라고 하면.. NT_TIB의 멤버중 하나이다.
NT_TIB의 구조체는 다음과 같다

typedef struct _NT_TIB
{
     PEXCEPTION_REGISTRATION_RECORD ExceptionList;
     PVOID StackBase;
     PVOID StackLimit;
     PVOID SubSystemTib;
     union
     {
          PVOID FiberData;
          ULONG Version;
     };
     PVOID ArbitraryUserPointer;
     PNT_TIB Self;
} NT_TIB, *PNT_TIB;

그러므로 FS:[18]은 PNT_TIB Self; 값을 가리키고 있으며... 이것은 즉 FS:[0]을 뜻하는 것과 마찬가지다...
그러므로 아까 안티디버깅 코드를 좀 더 줄이면... 다음과 같이 줄일수 있다.

CALL      00000000
MOV       EAX, DWORD PTR FS:[30]
ADD        EAX, 2
MOVZX   EAX, BYTE PTR DS:[EAX]
SHL        EAX, 2
ADD        EAX, 63
ADD        DWORD PTR SS:[ESP], EAX
RETN

FS:[30]은 PEB 구조체에 대한 포인터를 가지고 있으며... PEB 구조체는 다음과 같다.

typedef struct _PEB {
    BOOLEAN InheritedAddressSpace;
    BOOLEAN ReadImageFileExecOptions;
    BOOLEAN BeingDebugged;
    BOOLEAN Spare;
    HANDLE Mutant;
    PVOID ImageBaseAddress;
    PPEB_LDR_DATA LoaderData;
    PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
    ...
}

그러므로 위의 안티디버깅코드는... PEB 구조체의 BeingDebugged 값을 체크하여 만약 디버깅중일때는 0이 아닌 값이 저장되어 있으므로 이 값을 이용하여 리턴되는 EIP값을 조작하여 임의의 주소로 분기시켜 비정상 실행을 시키고 있다.
이 값은 IsDebugerPresent() 함수에서도 사용을 하여 디버깅 체크를 하고 있다.


참고사이트 :
http://www.nirsoft.net/kernel_struct/vista/NT_TIB.html
http://vbdream.tistory.com/entry/Windows-TEBThread-Environment-Block-%EC%82%B4%ED%8E%B4%EB%B3%B4%EA%B8%B0
728x90