KiFastCallEntry의 후킹을 통한 간단한 모니터링 작업


(KiFastCallEntry : SYSENTER명령어는 IA32_SYSENTER_EIP  MSR 레지스터에 저장된 Instrution Pointer를 참조하여
해당 위치로 이동하는데  이때 , IA32_SYSENTER_EIP에는 KiFastCallEntry의 주소가 담겨있다.
KiFastCallEntry 함수의 뜻을 내멋대로 해석을 해보았는데 , 이것이 맞는지는 모르겠지만,
 흔히 SYSENTER 명령어를 이용하는 목적이 빠른 시스템 콜(FastCall)을 위한것이고 , 그것의 Entry Address , 즉 Fast System Call의 EntryPoint 개념이  KiFastCallEntry 함수라고 생각이 된다.)

SYSENTER :  아래는 IA-32 매뉴얼에서 발췌
The SYSENTER and SYSEXIT instructions were introduced into the IA-32 architecture in the Pentium II processors for the purpose of providing a fast (low overhead) mechanism for calling operating system or executive procedures. SYSENTER is intended for use by user code running at privilege level 3 to access operating system or executive procedures running at privilege level 0. SYSEXIT is intended for use by privilege level 0 operating system or executive procedures for fast returns to privilege level 3 user code. SYSENTER can be executed from privilege levels 3, 2, 1, or 0; SYSEXIT can only be executed from privilege level 0.

-> SYSENTER와 SYSEXIT명령어는   펜티엄2 프로세서부터 도입되었으며 ,  유저모드에서 운영체제 레벨로 빠른 특권전환과 함께 프로시져를 호출하는데 그 목적이 있다.SYSENTER는 보통 유저코드에서(Ring3) 커널코드(Ring0)로 특권전환을 이행해서 커널의 프로시져를 호출하는데 사용되는 경향이 있다. SYSEXIT는  Ring0에서 Ring3로 리턴하기 위해서 사용된다.  SYSENTER는  Ring3,2,1,0 에서 사용가능하며 , SYSEXIT는  Ring0에서만 사용 가능하다.

(주 : MS 운영체제에서는 Windows XP 부터 도입되었으며 , 이전의 NT운영체제는 INT 2E를 사용.
XP에서도 이전 NT의 호환성을 위해서 INT 2E를 사용하는 함수인 KiIIntSystemCall이라는 함수가 존재하긴 하나,
거의 사용하는 꼴을 보진 못하였다. 아마 호환성 체크에다가 Windows2000을 선택하면 KiIntSystemCall을 호출하려나?)


For SYSENTER, target fields are generated using the following sources:
•Target code segment — Reads this from IA32_SYSENTER_CS.
•Target instruction — Reads this from IA32_SYSENTER_EIP.
•Stack segment — Computed by adding 8 to the value in IA32_SYSENTER_CS.
•Stack pointer — Reads this from the IA32_SYSENTER_ESP.

For SYSEXIT, target fields are generated using the following sources:
•Target code segment — Computed by adding 16 to the value in the IA32_SYSENTER_CS.
•Target instruction — Reads this from EDX.
•Stack segment — Computed by adding 24 to the value in IA32_SYSENTER_CS.
•Stack pointer — Reads this from ECX.

IA32_SYSENTER_EIP에 관한 정보
Register Address : 0x176 (374d)
Architectural MSR Name : IA32_SYSENTER_EIP


ps. MSR레지스터에 관한 자세한 정보는 IA-32 매뉴얼 Volume 3B의  "Appendix B - Model-Specific Registers" 를 참조하시면 될듯..

mov ecx, Register Address
wrmsr
과  rdmsr  만 있으면  MSR을 마음대로 컨트롤 할수가 있다.
저작자 표시 비영리 변경 금지
신고
by Sone 2010.04.20 02:16
Arab Team 4 Reverse Engineering  에서 Kernel Detective라는 툴을 새롭게 내놓았습니다.
사실 배포된지는 꽤 됐죠.




기능을 살펴보면 , 

- 프로세스,쓰레드 정보 조회( 숨겨진 정보까지 탐지 가능 )
- KPROCESS , KTHREAD, 조회 가능
-  KeServiceDescriptorTable , KeServiceDescriptorTableShadow 변경 여부 조회 가능
- 쓰레드별로 , SSDT , SSDT SHADOW  Change , Restore 가능 ( SSDT Relocation 탐지 가능)
- IDT 조회 가능
- 핸들 조회&닫기 가능
- Kernel Modification 탐지 가능
- Driver 조회&언로드 가능
- 올리디버거 디스어셈블 엔진 내장 (모듈, 드라이버, 쓰레드, 프로세스,  특정 어드레스의 디스어셈블 가능, 실시간 Read/Write 지원)
- DebugView 지원


이건 뭐 딱 봐도 기능들이 초강력한것을 알수 있습니다.
커널모드로 작동하는 왠만한 보안프로그램은 저리가라 수준이네요.
역시나 창과 방패의 대결은 영원히 지속되는군요...(이번엔 방패측에서 조금 고생할수도....)




위 스샷은  카스퍼스키 안티 바이러스 2010  필터 드라이버에서  SSDT와  SSDT SHADOW 를 후킹하고있는것을 탐지한 모습입니다.
네이트온 원격제어로  카스퍼스키 화면을 컨트롤하려고 했을때 , 화면 조작이 되지않는 이유가 , 바로 SSDT Shadow를 후킹하고있기 때문이죠~

저작자 표시 비영리 변경 금지
신고
by Sone 2010.01.23 00:15
| 1 |