PDA

View Full Version : ssdt



mahmood0197
یک شنبه 14 اسفند 1390, 13:38 عصر
سلام میشه یک مقدار درباره ی ssdt برام توضیح بدید؟
:گریه:

r00tkit
دوشنبه 15 اسفند 1390, 09:04 صبح
مگه من توی پیام خصوصی توضیح ندادم ؟
مگه لینک کد بهت ندادم؟

SSDT یه جدل هستش توی کرنل( ارایه ای از توابع ) که ادرس توابع رو توی خدش نگه می داره !
تو می تونی بری توی جدول و ادس تابع ای که دلت می خواد رو توش عوض کنی و تابع خودت رو قرار بدی

KeServiceDescriptorTable از کرنل export شده که شامل SST هستش که ان هم شامل SSDTیه

چون اول توابع Zw ایندیکس توابع Nt داخل ssdt رو داره ( یه چیزی تو مایع های Mov eax ,xxx به این خاطر می شه از خود Zw ایندیکس رو گیر اورد و مقدار ادرس تابع رو توی ssdt عوض کرد کد زیر تابع ZwCloseرو هوک کرده )

#include <ntddk.h>

typedef unsigned long DWORD, *PDWORD;
typedef unsigned char BYTE, *PBYTE, *PCHAR;
typedef unsigned long ULONG_PTR;
typedef ULONG_PTR DWORD_PTR;

NTSTATUS( *Real_ZwClose )( HANDLE Handle );

#define _Lookup( _Call ) \
KeServiceDescriptorTable.ServiceTable[* ( unsigned int * ) \
( ( unsigned char * ) _Call + 1 )]


typedef struct _SSDT
{
PDWORD ServiceTable;
PDWORD CounterTableBase;
DWORD ServiceLimit;
PCHAR ArgumentTable;
} SSDT;

__declspec(dllimport) SSDT KeServiceDescriptorTable;

DWORD_PTR *SSDT_Hook( DWORD_PTR *_OrigCall, DWORD_PTR *_Hook )
{
unsigned long *returnVal = _Lookup( _OrigCall );
_Lookup( _OrigCall ) = _Hook;

return( returnVal );
}

void DriverUnload( PDRIVER_OBJECT DriverObject)
{
SSDT_Hook( ( DWORD_PTR * ) ZwClose, ( DWORD_PTR * ) Real_ZwClose );
}

NTSTATUS my_ZwClose( HANDLE Handle )
{
DbgPrint( "ZwClose called!" );
Real_ZwClose( Handle );
return( STATUS_SUCCESS );
}

NTSTATUS DriverEntry( PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath )
{
DriverObject->DriverUnload = DriverUnload;
Real_ZwClose = SSDT_Hook( ( DWORD_PTR * ) ZwClose, ( DWORD_PTR * ) my_ZwClose );

return( STATUS_SUCCESS );
}