能力值:
( LV9,RANK:380 )
|
-
-
2 楼
看了不下10遍,依然不知道楼主要表达什么意思~~
ntkrlpa.exe可以用LoadLibrary来加载嘛???
片段代码,从某个kernel pe load摘出来的~~
BOOL PeLoad(WCHAR *FileFullPath,BYTE **ImageModeleBase,PDRIVER_OBJECT DeviceObject,DWORD ExistImageBase)
{
NTSTATUS Status;
HANDLE hFile;
LARGE_INTEGER FileSize;
DWORD Length;
BYTE *FileBuffer;
BYTE *ImageBase;
IO_STATUS_BLOCK IoStatus;
Status=KernelOpenFile(FileFullPath,&hFile,0x100020,0x80,1,1,0x20);
if (!NT_SUCCESS(Status))
{
return FALSE;
}
Status=KernelGetFileSize(hFile,&FileSize);
if (!NT_SUCCESS(Status))
{
ZwClose(hFile);
return FALSE;
}
Length=FileSize.LowPart;
FileBuffer=ExAllocatePool(PagedPool,Length);
if (FileBuffer==NULL)
{
ZwClose(hFile);
return FALSE;
}
Status=KernelReadFile(hFile,NULL,Length,FileBuffer,&IoStatus);
if (!NT_SUCCESS(Status))
{
ZwClose(hFile);
ExFreePool(FileBuffer);
return FALSE;
}
ZwClose(hFile);
if(!ImageFile(FileBuffer,&ImageBase))
{
ExFreePool(FileBuffer);
return FALSE;
}
ExFreePool(FileBuffer);
if(!FixImportTable(ImageBase,DeviceObject))
{
ExFreePool(ImageBase);
return FALSE;
}
if(!FixBaseRelocTable(ImageBase,ExistImageBase))
{
ExFreePool(ImageBase);
return FALSE;
}
*ImageModeleBase=ImageBase;
return TRUE;
}
|
能力值:
( LV9,RANK:380 )
|
-
-
3 楼
恢复ssdt,网上代码一箩筐~~
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
KeServiceDescriptorTable-> ServiceTableBase 这片内存 以及下面这个
KeServiceDescriptorTable->NumberOfService 变量 是在nt*.exe 内核加载的哪个阶段被填充的,
根据我个人的研究,我估计那几个东东被重定位了,说白了就是想了解他们是如何被填充的。
本人表达不清晰,原谅,原谅。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
KiInitSystem()
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
回5楼:
我研究了几个不同版本[nt4-src,xp ,win7 dbg ]
的KiInitSystem函数
通过源码或者一些反汇编,大概知道了KeServiceDescriptorTable这个确实在KiInitSystem函数中完成,
但是他们是直接这样的
//
// Initialize the system service descriptor table.
//
KeServiceDescriptorTable[0].Base = &KiServiceTable[0];
KeServiceDescriptorTable[0].Count = NULL;
KeServiceDescriptorTable[0].Limit = KiServiceLimit;
KeServiceDescriptorTable[0].Number = &KiArgumentTable[0];
for (Index = 1; Index < NUMBER_SERVICE_TABLES; Index += 1) {
KeServiceDescriptorTable[Index].Limit = 0;
}
//
// Copy the system service descriptor table to the shadow table
// which is used to record the Win32 system services.
//
RtlCopyMemory(KeServiceDescriptorTableShadow,
KeServiceDescriptorTable,
sizeof(KeServiceDescriptorTable));
而KiServiceTable 是直接被声明的
extern ULONG KiServiceTable[];
这个数组的初始化我没找到代码,,,数组里面才应该是真正的SSDT 入口。。
离成功不远了。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
参见WRK
WRK-v1.2\base\ntos\ke\i386\systable.asm
大概吧。
|
|
|