«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

www.ManiaLab.com

[Reference] Reverse-Engineering 본문

1.Sec_Doc

[Reference] Reverse-Engineering

HaiDong 2008. 12. 10. 15:49

API Hooking은 크게 유저모드와 커널모드 두가지로 나뉜다.

User-Mode Hooking

  • IAT(Import Address Table) Hooking: IAT 에 적혀있는 API 의 주소를 자신의 함수주소로 바꾸고 자신의 함수 끝에
    다시 원래 API 주소로 돌려주는 방식. 가장 일반적으로 바이러스에서 사용하는 기법.

  • Inline Function Hooking (Detour Hooking): 사용할 API 의 첫 5바이트를 자신의 함수주소로 Jmp 하는 코드로 바꾸고
    자신의 코드에서 다시 원래 API 의 바뀐 코드를 수정해주고 API 시작위치로 돌려주는 방식. IAT 후킹보다 지능적이여서
    찾아내기가 쉽지 않다. 요새 많이 등장한다.

Kernel-Mode Hooking (루트킷)

  • SSDT(System Service Descriptor Table Modification): SSDT 가 가리키는 주소를 후킹 함수의 주소로 바꾸고
    그 함수 호출후 다시 원래 커널 API 의 주소로 돌려주는 기법. 50% 이상의 루트킷이 사용하는 기법. 이런 기법은
    프로세스, 파일의 은폐에 많이 사용됨.

  • DKOM(Direct Kernel Object Modification): 커널 Object 를 직접 조작해서 실행되는 프로세스, 스레드, 서비스,
    포트, 드라이버 및 핸들의 Entry 를 실행리스트(PsActiveProcessHead, PsActiveModuleHead....)에서 감추는 기법.

  • SYSENTER: 유저모드에서 시스템 호출로 넘어갈때 INT 2E(for Windows 2000)/ SYSENTER 를 사용하게 되는데
    호출후 시스템 서비스의 핸들러는 IA32_SYSENTER_EIP 라는 레지스터리에 저장된다. 커널 드라이버를 설치하여
    해당 값을 수정하여 루트킷을 호출하고 다시 원래 값으로 돌려주는 기법.

  • Filter Device Drivers: 시큐리티 제품의 하단에 filter device driver 로 등록하는 기법이다. 부트 타임에 로드됨으로써
    다른 어떤 안티바이러스 제품보다 먼저 실행된다.

  • Runtime Detour Patching: 커널 메모리를 직접 조작함으로써 그 메모리의 포인터가 루트킷을 가르키게 함으로써
    커널 함수들을 후킹하는 기법. 예를 들면 Exception 을 일으키고 Exception Handle 을 컨트롤하는 IDT 레지스터를
    자신을 가리키는 주소로 써줌으로써 후킹목적을 달성한다.

  • IRP table Modification: 디바이스 드라이버가 네트웍 패킷을 처리하거나 파일을 쓸때 사용하는 I/O Request Packets 을
    제어하는 Dispatch Routine 은 DEVICE_OBJECT 구조체에 저장된다. 바이러스에서 사용하는 루트킷은
    IoGetDeviceObjectPointer 란 API를 사용하여 DEVICE_OBJECT 구조체에서 DRIVER_OBJECT 의 위치를 선정해줄수 있다.
    즉 다른 Original Driver Call 이 일어나기 전에 자신의 루트킷을 먼저 실행하여 Call 결과를 조작한다.

*** 레지스터(Register)
- CPU 가 느린 메모리의 접근 시간을 줄이기 위해 CPU 내부에 고속의 기억 소자로 구성된 메모리.

* 범용 레지스터(General-Purpose Register) - 임시저장소
EAX, EBX, ECX, EDX - 하위호환을 위해 16비트영역과 8비트영역에 대한 별도의 이름을 가지고 있고 산술연산과 같은 범용연산에 주로 사용, ESI, EDI, EBP, ESP - 번지 지정을 위한 인덱스나 옵셋을 저장하는 용도

* 세그먼트 레지스터(Segment Register) - 세그먼트의 시작주소.
CS, DS, SS, ES, FS, GS - 전체 메모리를 효율적으로 관리하기위해 크기가 가변적인 일정단위의 구역으로 나눠진 세그먼트주소 저장(코드 레지스터 1개, 스택 레지스터 1개, 데이터 레지스터4개 -> 데이터 처리의 다양성위해)

* 플래그 레지스터(Flags Register) - 상태플래그, 제어플래그, 시스템플래그
EFLAGS - 연산결과에 따른 프로그램의 상태나 제어정보를 다룸

* 명령 포인터 레지스터(Instrucion Pointer Register) - CPU 가 실행해야할 다음 주소를 저장(EIP).

EIP - 읽기전용으로 CPU가 실행해야 할 다음 주소를 저장
EAX(Accumulator) - 산술연산 과 정수형 반환값을 호출함수에 넘김.
EBX(Base) - 함수나 변수의 주소(특히 DS안의 데이터 주소) 를 저장하거나 이동명령의 피연산자로 사용.
ECX(Count) - 카운터 역활을 수행하며 반복될 때마다 ECX 값이 자동 감소.
EDX(Data) - EAX 범위를 초과하는 64비트 산술연산의 상위 결과값을 저장하거나 I/O 포인터로 사용.
ESI(Source Index) - 스트링 명령을 수행할 때 출발지 주소를 지정하거나 DS 안의 데이터 주소를 저장.
EDI(Destination Index) - 스트링 명령을 수행할 때 목적지 주소를 지정하거나 ES 안의 데이터 주소를 저장.
EBP(Base Pointer) - SS 를 기반으로 스택내의 데이터에 접근하기 위한 기준주소를 저장.
ESP(Stack Pointer) - SS 를 기반으로 스택의 스택의 최상위 주소를 유지하는 용도로 사용.
push, pop, call, ret 명령에 의해 자동 증감.
EIP(Instruction Pointer) - 다음에 실행할 명령의 주소를 저장. 사용자 조작은 불가.

CS(Code Segment) - 명령어들이 위치한 시작 주소를 보관.
DS(Data Segment) - 데이터을이 위치한 시작 주소를 보관.
ES(Extra Segment), FS, GS - 변수들을 위한 추가 메모리 영역의 시작 주소를 보관.주로 스트링 명령에 사용
SS(Stack Segment) - 스택 영역의 최상위 주소(top)를 보관. (지역변수)

EFLAGS(Flags)
상태 플래그(Status Flag)그룹 - 특정명령결과, 산술명령에 대한 결과를 가리킴.
AF(Auxiliary carry flag) - 10진수 덧셈, 뺄셈 연산에서 보정이 필요한때 enable.
CF(Carry flag) - 양수 연산에서 연산 결과가 주어진 레지스터 길이를 초과할때 enable.
OF(Overflow flag) - 음수 연산에서 연산 결과가 주어진 레지스터 길이를 초과할 때 enable.
PF(Parity flag) - 연산 결과 1 이 짝수 개일때 enable.
SF(Sign flag) - 연산 결과가 음수일때 enable.
ZF(Zero flag) - 연산 결과가 0 이 아닐때 enable.
제어 플래그(Control Flag) - CPU동작제어, 문자열 처리명령의 제어.
DF(Direction flag) - 문자열 관련 명령에 사용하며 enable 은 역방향, disable 은 순방향 접근.
시스템 플래그(System Flag)

[출처] C언어 용어를 정리하자~|작성자 찡호야

Comments