رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
System Service Dispatch Table SSDT چیست؟
#1
کسی میدونه ssdt چیه؟
پاسخ
سپاس شده توسط
#2
با سلام

لطفا
قوانین ارسال پست و فعالیت در سایت به روز شده در تاریخ 11 /12 /1390
را به دقت مطالعه فرمایید

دوست عزیز لطفا سوالات خود را واضح تر بیان فرمایید

(SQL Server Data Tools(SSDT

(State Software Development Team(SSDT

(System Service Dispatch Table (SSDT

(Scottish Solicitors' Discipline Tribunal(SSDT

(Smart Start Driver Training(SSDT

(South Staffs Dog Training(SSDT

(Scottish Six Days Trial (SSDT

(School of Sustainable Development and Tourism (SSDT

Site Selection Diversity Transmission (SSDT

(Spoofed Secure Data Transfer (SSDT

(Simultaneous Sensing and Data Transmission (SSDT

(Safety Sensitive Drug Testing (SSDT

(Sim Safe Driver Training (SSDT

(Shanghai Superior Die Technology(SSDT
[عکس: www.Mojsazan.com.gif]
پاسخ
سپاس شده توسط worm ، mahmood0197 ، morteza ghaem
#3
System Service Dispatch Table

چون نمی دونم اصلا چیه چطور باید بفهمم کجا تایپیک بزنم!
پاسخ
سپاس شده توسط
#4
با سلام عنوان ویرایش شد !!!

(System Service Dispatch Table (SSDT یا سیستم خدمات اعزام جدول : یک جور سیستم فراخوانی داخلی که توسط شرکت ماکروسافت استفاده میشود

ساده تر بگم یک جور ارایه که آدرس سیستم کال ها (SystemCall) توش ذخیره میشه

نمیدونم میدونید system call جیه ؟ توی درس سیستم عامل وقفه ها را یادتون است وقفه ها یک جور system call هستند

حالا این که کاربردش چیه؟ خیلی کاربرد ها داره مثلا ویندوز سیستم کال ها را باش مدیریت میکنه کرنل سرویس های محلی را آدرس دهی میکنه بقیه مثل بیشتر روت کیت ها و انتی ویروس ها با هوک کردن این سرویس ازش استفاده میکنند

خوب ما باش میتونیم چی کار کنیم خیلی ساده میتونیم آدرس یکی از توابع خودمون را با آدرس یکی از توابع دیگه جایگزین کنیم (بماند که به همین مفتی ها هم نیست مثلا این سرویس فقط خواندی است و این سیستم دفاعی را باید دور بزنید D:)

این سورس را ببین یک روش هوک کردن SSDT است

کد پی‌اچ‌پی:
#include <wdm.h>
 
/****************/
/* Declarations */
/****************/
 
#pragma pack(1)
typedef struct ServiceDescriptorEntry {
    
unsigned int *ServiceTableBase;
    
unsigned int *ServiceCounterTableBase;
    
unsigned int NumberOfServices;
    
unsigned char *ParamTableBase;
SSDT_Entry;
#pragma pack()
 
__declspec(dllimportSSDT_Entry KeServiceDescriptorTable// We import KeServiceDescriptorTable (ntoskrnl.exe)
 
// SYSTEMSERVICE returns the address of the Nt* function corresponding to the Zw* function we put in argument
#define SYSTEMSERVICE(_func) \
  
KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_func+1)]
 
typedef NTSTATUS (*ZWSETVALUEKEY)( // The type of the target function
    
HANDLE  KeyHandle,
    
PUNICODE_STRING  ValueName,
    
ULONG  TitleIndex  OPTIONAL,
    
ULONG  Type,
    
PVOID  Data,
    
ULONG  DataSize
);
 
ZWSETVALUEKEY ZwSetValueKeyOriginal
// We will call this function to call the original target 
//function when its address will be replaced by our hook 
//function address in the SSDT
 
 
/*******************/
/* The Hook Function */
/*******************/
 
// Our hook function will avoid values writing for "Run" and "RunOnce" key: 
//in this way it prevents malwares from writing their path in those keys in 
//order to open up at each reboot.
NTSTATUS ZwSetValueKeyHook(
    
IN HANDLE  KeyHandle,
    
IN PUNICODE_STRING  ValueName,
    
IN ULONG  TitleIndex  OPTIONAL,
    
IN ULONG  Type,
    
IN PVOID  Data,
    
IN ULONG  DataSize
)
{
    
PKEY_BASIC_INFORMATION pKeyInformation NULL;
    
int iflag 1;
    
NTSTATUS ret;
    
WCHAR targetKey1[] = L"Run"// first key target
    
WCHAR targetKey2[] = L"RunOnce"// second key target
    
unsigned long size 0sizeNeeded 0;
 
    
DbgPrint("[+] In da hook function =)\n");
 
    
ret ZwQueryKey(KeyHandleKeyBasicInformationpKeyInformationsize, &sizeNeeded);
    
// We use this function in order to get the current key name. If it Run or RunOnce we prevent from writing.
    
if((ret == STATUS_BUFFER_TOO_SMALL) || (ret == STATUS_BUFFER_OVERFLOW)) { 
    
// If size not enough => we allocate more space memory
        
size sizeNeeded;
        
pKeyInformation = (PKEY_BASIC_INFORMATIONExAllocatePoolWithTag(NonPagedPoolsizeNeeded'aaaa');
 
        
ret ZwQueryKey(KeyHandleKeyBasicInformationpKeyInformationsize, &sizeNeeded);
    }
 
    if(
ret != STATUS_SUCCESS)
        return 
ZwSetValueKeyOriginal(KeyHandleValueNameTitleIndexTypeDataDataSize);
 
    if( (
pKeyInformation->NameLength sizeof(WCHAR)) == 3) { // 3 == strlen("Run")
        
for(0strlen(targetKey1); i++) {
            if(
pKeyInformation->Name[i] != targetKey1[i]) { 
            
// if one character is different from Run key name, flag = 0
                
flag 0;
                break;
            }
        }
    }
    else if((
pKeyInformation->NameLength sizeof(WCHAR)) == 7) { // 7 == strlen("RunOnce")
        
for(0strlen(targetKey2); i++) {
            if(
pKeyInformation->Name[i] != targetKey2[i]) {
            
// if one character is different from RunOnce key name, flag = 0
                
flag 0;
                break;
            }
        }
    }
    else 
flag 0;
 
    if(!
flag// If flag == 0 => normal work ...
        
return ZwSetValueKeyOriginal(KeyHandleValueNameTitleIndexTypeDataDataSize);
 
    
DbgPrint("[+] Bypassing Run key writing\n");
 
    return 
STATUS_SUCCESS;
    
// ... else the function will not be executed so no value writing ...
}
 
/*****************/
/* SSDT Functions */
/*****************/
 
void HookSSDT()
{
    
DbgPrint("[+] SSDTHOOK: in HookSSDT()\n");
 
    
ZwSetValueKeyOriginal = (ZWSETVALUEKEYSYSTEMSERVICE(ZwSetValueKey); 
    
// We save target function address
 
    // unprotect CR0
    
__asm
    
{
        
push eax
        mov  eax
CR0
        
and  eax0FFFEFFFFh
        mov  CR0
eax
        pop  eax
    
}
    
//
 
    
SYSTEMSERVICE(ZwSetValueKey) = (unsigned long *) ZwSetValueKeyHook;
    
// We replace target function address by the address of our hook function
 
    // protect cr0
    
__asm
    
{
        
push eax
        mov  eax
CR0
        
or   eaxNOT 0FFFEFFFFh
        mov  CR0
eax
        pop  eax
    
}
    
//
 
}
 
void UnHookSSDT()
{
    
DbgPrint("[+] SSDTHOOK: in UnHookSSDT()\n");
 
    
// unprotect CR0
    
__asm
    
{
        
push eax
        mov  eax
CR0
        
and  eax0FFFEFFFFh
        mov  CR0
eax
        pop  eax
    
}
    
//
 
    
SYSTEMSERVICE(ZwSetValueKey) = (ZWSETVALUEKEYZwSetValueKeyOriginal;
    
// We delete hook by rewriting the good function address instead of our hook function address
 
    // protect cr0
    
__asm
    
{
        
push eax
        mov  eax
CR0
        
or   eaxNOT 0FFFEFFFFh
        mov  CR0
eax
        pop  eax
    
}
    
//
}
 
VOID unloadFunction(PDRIVER_OBJECT pDriverObject)
{
    
UnHookSSDT(); // unhook function
}
 
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObjectPUNICODE_STRING pRegistryPath)
{
    
HookSSDT(); // hook function
 
    
pDriverObject->DriverUnload unloadFunction;
 
    return 
STATUS_SUCCESS;

برای این که بهتر متوجه بشوید باید بدانید فراخوانی جداول یا Dispatch Table چیه ؟؟

این Dispatch Table به جدولی از اشاره گر ها هاست که به یک سری تابع و متد اشاره دارد

استفاده از این جداول توی برنامه نویسی بسیار متداوله

برای فهم بهتر مطلب یک سورس کد میزارم دقت کنید PERL
کد پی‌اچ‌پی:
#define the table using one anonymous code-ref and one named code-ref
 
my %dispatch = (
   
"-h" => sub {  return "hello\n"; },
   
"-g" => \&say_goodbye
 
);
 
 
sub say_goodbye {
   return 
"goodbye\n";
 }
 
 
#fetch the code ref from the table, and invoke it
 
my $sub $dispatch{$ARGV[0]};
 print 
$sub $sub->() : "unknown argument\n 
";


برای این که بهتر متوجه بشوید کاربرد این جداول چی هست
یک مثال دیگه در برنامه نویسی شی گرا میزنم تابع مجازی که میدونید چیه
هنگامی که شما یک تابع مجازی میسازید
کامپایلر به صورت خودکار یک Dispatch Table میسازه
بعد برای هر تماس به تابع مجازی از Dispatch Table استفاده میکنه به همین سادگی به همین خوشمزگی لبخند

موفق و پیروز باشید

منبع
[عکس: www.Mojsazan.com.gif]
پاسخ
سپاس شده توسط mahmood0197 ، worm ، morteza ghaem
#5
ممنونم.

برای دیدن اون جدول راهی وجود نداره؟

این سورس کد ها رو توی سایت های انگلیسی دیدم اما با c نتونستم کامپایلش کنم
پاسخ
سپاس شده توسط
#6
با سلام

در صورتی که مطلبی که توسط کاربر دیگری ارسال شده از نظر شما مفید و جالب بوده ، و قصد تشکر از او را دارید , میتوانید از گزینه "سپاس" [عکس: postbit_thx.gif]برای ابراز نظر خود استفاده کنید

بله شما میتوانید با خروجی گرفتن از متغییر KeServiceDescriptorTable به وسیله ntoskrnl.exe و تجزیه و تحلیل ساختار آن این کار را انجام دهید
[عکس: www.Mojsazan.com.gif]
پاسخ
سپاس شده توسط mahmood0197 ، worm


موضوعات مشابه ...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  دستور while....wend چیست؟ Nikkhahan 5 1,080 05-04-2012, 03:44 PM
آخرین ارسال: مهرداد عباسی
  فریم ورک چیست؟ (what is the Framework) مهرداد عباسی 0 1,541 12-17-2011, 01:22 PM
آخرین ارسال: مهرداد عباسی
Lightbulb برنامهٔ کاربردی چیست؟ spooggie 0 923 04-28-2010, 08:06 PM
آخرین ارسال: spooggie
Lightbulb Library چیست؟ spooggie 0 1,287 04-28-2010, 07:55 PM
آخرین ارسال: spooggie
Lightbulb API چیست؟ spooggie 0 1,168 04-28-2010, 07:44 PM
آخرین ارسال: spooggie
Lightbulb SDK چیست؟ spooggie 0 5,302 04-28-2010, 07:35 PM
آخرین ارسال: spooggie
  برنامه نویسی چیست مهرداد عباسی 19 12,691 12-16-2009, 01:50 AM
آخرین ارسال: مهرداد عباسی

پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان