![]() |
|
LoadDriver SSDT Hook - نسخة قابلة للطباعة +- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum) +-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3) +--- قسم : مصادر دلفي مفتوحة تعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=14) +--- الموضوع : LoadDriver SSDT Hook (/showthread.php?tid=2565) الصفحات:
1
2
|
LoadDriver SSDT Hook - TF6M - 23-11-2010 STRELiTZIA كتب :1 - اظنها النسخة الأولى لــ WinXP بدون SP صينية... 1- أظنها تابعة لـ هده المشاركة الخاص بمثال NtOpenProcess SSDT Hook .... PHP كود : DbgPrint('ZwOpenProcess Ord Address: 0x%.8X', SystemServiceOrd($7A)^); // XP Ord! 2- كيف لا يتم الإعتماد عليها في عملية المعالجة ؟ SystemServiceOrdترجع عنوان الدالة المستهدفة إنطلاقا من الأندكس الممر ؟؟ بالتوفيق,, LoadDriver SSDT Hook - TF6M - 24-11-2010 GamingMasteR كتب :الافضل تحميل Image نظيف للملف من الدسك والعمل عليه . 1- لو إعتمدنا على إستخراج قائمة الدوال الـ Ntxxx المصدرة من NTDLL , سيكون ترتيب بعض الدوال خاطئ , هل يتم وضع قائمة إستثنائية تحتوي على ترتيب الدوال المضافة حديثا أو على حسب إصدار النظام ؟؟ ![]() - قمت بإستخراج الـ Index من ملف NTDLL , فكان ترتيب الداول الموضحة في الصورة مغاير ... إلا أن راجعه قائمة Windows System Call Table فكان الترتيب صحيح ! 2- الـ Native APi يتم تصديرها من NtosKrnl.exe و مساره معروف أم أنه يتم الإعتماد على الـ Int 2E في الباراماتر الأول EAX الذي يحدد أي SDT هو المستهدف ... (البيت #12-#13) . 00 : NtosKrnl.exe SDT Win32K.sys SDTS : 01 n : 10 n : 11 بارك الله فيك ,, LoadDriver SSDT Hook - GamingMasteR - 25-11-2010 1- الترتيب صحيح ، الترتيب المعروض في الصورة بالنظام العشري ، في الـdisassembler ستجده بالنظام الست عشري . 2- لم افهم المقصود . LoadDriver SSDT Hook - GamingMasteR - 25-11-2010 كود : PWCHAR *GetSsdtStrings(VOID)
{
LOADED_IMAGE LoadedImage;
PVOID PtrImage;
PWCHAR *Result;
PUSHORT Ordinals;
PULONG ExportRva;
PCHAR FunctionString, *StringRva;
ULONG ServiceId, FunctionId;
MapAndLoad("ntdll.dll", NULL, &LoadedImage, FALSE, TRUE);
PtrImage = calloc(LoadedImage.FileHeader->OptionalHeader.SizeOfImage, sizeof(UCHAR));
CopyMemory((PUCHAR)PtrImage, LoadedImage.MappedAddress, LoadedImage.FileHeader->OptionalHeader.SizeOfHeaders);
for (WORD Index = 0; Index < LoadedImage.FileHeader->FileHeader.NumberOfSections; Index++)
{
CopyMemory((PUCHAR)PtrImage + LoadedImage.Sections[Index].VirtualAddress,
LoadedImage.MappedAddress + LoadedImage.Sections[Index].PointerToRawData,
LoadedImage.Sections[Index].SizeOfRawData
);
}
UnMapAndLoad(&LoadedImage);
LoadedImage.FileHeader = (PIMAGE_NT_HEADERS)((ULONG_PTR)PtrImage + ((PIMAGE_DOS_HEADER)PtrImage)->e_lfanew);
PIMAGE_EXPORT_DIRECTORY ExportDirectory = (PIMAGE_EXPORT_DIRECTORY)(LoadedImage.FileHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress + (ULONG_PTR)PtrImage);
StringRva = (PCHAR *)(ExportDirectory->AddressOfNames + (ULONG_PTR)PtrImage);
Ordinals = (PUSHORT)(ExportDirectory->AddressOfNameOrdinals + (ULONG_PTR)PtrImage);
ExportRva = (PULONG)(ExportDirectory->AddressOfFunctions + (ULONG_PTR)PtrImage);
Result = (PWCHAR *)calloc(KiSsdtLimit, sizeof(PWCHAR));
for (ULONG Index = 0; Index < KiSsdtLimit; Index++)
{
Result[Index] = L"Unknown Entry";
}
for (ULONG Index = 0; Index < ExportDirectory->NumberOfNames; Index++)
{
FunctionId = ExportRva[Ordinals[Index]] + (ULONG_PTR)PtrImage;
FunctionString = StringRva[Index] + (ULONG_PTR)PtrImage;
if (*(PUCHAR)FunctionId == 0xb8 &&
*(PUCHAR)(FunctionId + 5) == 0xba &&
*(PUCHAR)(FunctionId + 10) == 0xff &&
(*(PUCHAR)(FunctionId + 12) & 0xc0) == 0xc0)
{
if (FunctionString[0] == 'N' && FunctionString[1] == 't')
{
ServiceId = *(PULONG)(FunctionId + 1);
if (ServiceId < KiSsdtLimit)
{
Result[ServiceId] = (PWCHAR)calloc(256, sizeof(WCHAR));
_snwprintf_s(Result[ServiceId], 256, _TRUNCATE, L"%S", FunctionString);
}
}
}
}
free(PtrImage);
return Result;
}LoadDriver SSDT Hook - TF6M - 25-11-2010 GamingMasteR كتب :1- الترتيب صحيح ، الترتيب المعروض في الصورة بالنظام العشري ، في الـdisassembler ستجده بالنظام الست عشري .1- نعم هذا ما قصدته بالرغم من أن طريقة جلب الـ Ntxxx من الـ Ntdll تعطي ترتيب يختلف عن الذي يعرضه KD إنطلاقا من NTyieldExecution ؟؟ كود دلفي : كود : type
TDWordArray = array [0..$FFFFF] of DWORD;
var
imageinfo: LoadedImage;
pExportDirectory: PImageExportDirectory;
dirsize: Cardinal;
pDummy: PImageSectionHeader;
i: Cardinal;
pNameRVAs: ^TDWordArray;
Name: string;
_index: Word;
begin
ListFdLL.Clear; _index:= 0;
if MapAndLoad(PChar('ntdll.dll'), nil, @imageinfo, True, True) then
begin
try
pExportDirectory := ImageDirectoryEntryToData(imageinfo.MappedAddress,
False, IMAGE_DIRECTORY_ENTRY_EXPORT, dirsize);
if (pExportDirectory <> nil) then
begin
pNameRVAs := ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
DWORD(pExportDirectory^.AddressOfNames), pDummy);
for i := 0 to pExportDirectory^.NumberOfNames - 1 do
begin
Name := PChar(ImageRvaToVa(imageinfo.FileHeader, imageinfo.MappedAddress,
pNameRVAs^[i], pDummy));
If Pos('Nt',Name)=1 Then
Begin
ListFdLL.Items.Add;
ListFdLL.Items.Item[_index].Caption:= IntToStr(_index);
ListFdLL.Items.Item[_index].SubItems.Add(Name);
ListFdLL.Items.Item[_index].SubItems.Add('');
ListFdLL.Items.Item[_index].SubItems.Add('');
ListFdLL.Items.Item[_index].SubItems.Add('-');
ListFdLL.Items.Item[_index].SubItems.Add('%SystemDirectory%\ntkrnlpa.exe');
Inc(_index);
End;
end;
end;
finally
UnMapAndLoad(@imageinfo);
Label2.Caption:= IntToStr(ListFdLL.Items.Count -1 );
ListFdLL.Items.Add;
end;
end;
End;PHP كود : KiSystemLoadDriver SSDT Hook - GamingMasteR - 26-11-2010 هناك جدولين واحد خاص بالـnative threads اسمه KeServiceDescriptorTable ، واخر خاص بالـgui threads اسمه KeServiceDescriptorTableShadow . كلاهما عبارة عن مصفوفة رباعية من التركيبة SERVICE_DESCRIPTOR_TABLE : كود : [align=left]typedef struct _SERVICE_DESCRIPTOR_TABLE {
PVOID *ServiceTable;
PULONG CounterTable;
ULONG TableSize;
PUCHAR ArgumentTable;
} SERVICE_DESCRIPTOR_TABLE, *PSERVICE_DESCRIPTOR_TABLE;[/align]اذا كان الـService Index اقل من 0x1000 فيتم استعمال العنصر الاول من الـServiceTable (هي مصفوفة رباعية كما قلنا) . اكبر من او يساوي 0x1000 يتم استعمال العنصر الثاني الذي يحتوي على دوال الـGUI ، اذا كان الthread الحالي native وتم استدعاء GUI syscall لأول مرة فانه يتم تحويله الى gui thread . العنصر الثالث والرابع من SDT لا يستخدم حاليا . LoadDriver SSDT Hook - TF6M - 26-11-2010 " (البيت #12-#13) . 00 : NtosKrnl.exe SDT Win32K.sys SDTS : 01 n : 10 n : 11 " - هذا ما أشرت إليه أخي GM , بارك الله فيك على مشاركتك & التوضيح . |