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
» [WINCE] IAT Hooking 방법과 소스 코드 digipine 2017.10.29 60
21 [WINCE] 키보드 및 마우스 메시지 후킹하기 digipine 2017.10.29 62
20 [C#] C#에서 C++ DLL의 Call by Referance out 인수 사용하는 방법 digipine 2017.10.29 30
19 [C#] Convert char[] to string digipine 2017.10.29 16
18 VS2005 ConvertBSTRToString 에서 LNK2019 에러 대처법 digipine 2017.10.29 4
17 VS2003 이상에서 iostream 구현의 문제점 digipine 2017.10.29 6
16 DLL과 EXE간의 데이타 공유하기 digipine 2017.10.29 26
15 Serialize를 이용한 객체 복사하기 (Copy constructor) digipine 2017.10.29 29
14 세마포어의 개념과 사용법 digipine 2017.10.29 83
13 VC++ 에서 대소문자 변경하는 함수 digipine 2017.10.29 4
12 VC++(MFC)에서 MDB 생성 / 압축 / 연동관리자 digipine 2017.10.29 31
11 CreateSemaphore Semaphore Manager digipine 2017.10.29 34
10 Mutex, Critical Section Class 만들기 digipine 2017.10.29 12
9 Windows API 멀티 쓰레드 구현법 digipine 2017.10.29 7
8 RPC에 대하여... (3) : RPC 작동을 위한 테스트 방법 digipine 2017.10.29 32
7 RPC에 대하여... (2) : RPC 가 사용하는 포트를 바꿔보자 digipine 2017.10.29 22
6 RPC에 대하여... (1) : RPC 가 사용하는 TCP/IP 포트는 ? digipine 2017.10.29 41
5 GINA(Graphical Identification aNd Authentication), SAS(Secure Attention Sequence) digipine 2017.10.29 12
4 The .Net Developer's Guide to Directory Services Programming digipine 2017.10.29 6
3 Customizing GINA, Part 2 digipine 2017.10.28 108
Board Pagination Prev 1 2 3 Next
/ 3