logo

English

이곳의 프로그래밍관련 정보와 소스는 마음대로 활용하셔도 좋습니다. 다만 쓰시기 전에 통보 정도는 해주시는 것이 예의 일것 같습니다. 질문이나 오류 수정은 siseong@gmail.com 으로 주세요. 감사합니다.

[WINCE] IAT Hooking 방법과 소스 코드

by digipine posted Oct 29, 2017
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print
?

Shortcut

PrevPrev Article

NextNext Article

Larger Font Smaller Font Up Down Go comment Print

IAT 수정을 통한 후킹 방식입니다. 현재 모듈 및 다른 모듈의 IAT까지 수정할 수 있습니다.

훌륭하신 sweetlilmre님의 소스를 토대로 Undocument 헤더와 샘플 프로젝트를 작성해 보았습니다.

x86에 대한 Kernal Data는 현재 작성중이므로 ARM 플랫폼에서만 사용가능합니다.

개발툴은 Embedded Visual C++ 4.0을 사용하였습니다.

sweetlilmre님의 원본 소스는 아래 링크를 따라가시면 됩니다.

http://forum.xda-developers.com/showthread.php?p=1968396 

IAT 후킹에 대해서

User-Mode Hooking

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

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

Kernel-Mode Hooking (루트킷)

SSDT(SystemService 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 로 등록하는 기법이다. 부트 타임에 로드됨으로써 다른 어떤 안티바이러스 제품보다 먼저 실행된다.


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


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

 
WinCE_ARM_Hook.zip Download URL
https://drive.google.com/open?id=0B1HrfZ99uXGXblVkUGhaUEYwN2c
TAG •

List of Articles
No. Subject Author Date Views
25 RegEnumKeyEx 함수 사용법 digipine 2017.10.29 754
24 [WINCE] Process, Thread API 함수 사용법 digipine 2017.10.29 960
23 [WINCE] 메모리카드 상태 감시 digipine 2017.10.29 327
» [WINCE] IAT Hooking 방법과 소스 코드 digipine 2017.10.29 659
21 [WINCE] 키보드 및 마우스 메시지 후킹하기 digipine 2017.10.29 809
20 [C#] C#에서 C++ DLL의 Call by Referance out 인수 사용하는 방법 digipine 2017.10.29 1076
19 [C#] Convert char[] to string digipine 2017.10.29 301
18 VS2005 ConvertBSTRToString 에서 LNK2019 에러 대처법 digipine 2017.10.29 192
17 VS2003 이상에서 iostream 구현의 문제점 digipine 2017.10.29 256
16 DLL과 EXE간의 데이타 공유하기 digipine 2017.10.29 837
15 Serialize를 이용한 객체 복사하기 (Copy constructor) digipine 2017.10.29 499
14 세마포어의 개념과 사용법 digipine 2017.10.29 765
13 VC++ 에서 대소문자 변경하는 함수 digipine 2017.10.29 311
12 VC++(MFC)에서 MDB 생성 / 압축 / 연동관리자 digipine 2017.10.29 2654
11 CreateSemaphore Semaphore Manager digipine 2017.10.29 447
10 Mutex, Critical Section Class 만들기 digipine 2017.10.29 392
9 Windows API 멀티 쓰레드 구현법 digipine 2017.10.29 691
8 RPC에 대하여... (3) : RPC 작동을 위한 테스트 방법 digipine 2017.10.29 542
7 RPC에 대하여... (2) : RPC 가 사용하는 포트를 바꿔보자 digipine 2017.10.29 1118
6 RPC에 대하여... (1) : RPC 가 사용하는 TCP/IP 포트는 ? digipine 2017.10.29 1295
Board Pagination Prev 1 2 3 Next
/ 3