首页
社区
课程
招聘
[求助]求助ntoskrnel.exe 重定位问题
发表于: 2010-8-16 21:04 7485

[求助]求助ntoskrnel.exe 重定位问题

2010-8-16 21:04
7485
由于对nt内核以及pe文件了解不够深入,目前自己写代码恢复ssdt的时候出现了一些问题。

大概如下:
  KeServiceDescriptor是由nt*.exe导出,该结构的第一个个数据描述了SSDT在内存中的起始VA, 当nt被加载到内存的时候KeServiceDescriptor 这个结构体是被PE加载器赋值的还是通过其他?
  然后第一个指针指向的内容就是系统服务函数的入口了,这一系列的函数入口是由谁来填充的?
直接在文件中,我暂时还不知道怎么找,感觉和重定位有关,但是想不透。
  我做了一个比较猥琐的实验,直接通过LoadLibrary将 ntkrlpa.exe 加载到内存,加载是成功的,并且也能通过GetProcAddress 获取到KeServiceDescriptor的VA,但是该结构体内容在ring3为空的?
  按照PE的加载原则,该结构体应该能够被赋值的呀,可是全0.不明白

本人大概想做的事情是:
  拿NtReadVirtualMemory来说吧,该函数在nt*.exe中一定能找到代码,在被PE装载到内存后,nt通过某方法将该入口地址传给KeServiceDescriptor所描述的某个项。
   本人大概想自己通过定位PE的方法修复SSDT中所有变量的值,以及恢复SSDT inline hook,网上虽然有很多工具,但是没能找到开源的代码,逆向他们比登天还难,那些大牛基本是把nt和pe玩转了,我这样的小菜无法逆向他们,就自己分析pe了。

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 796
活跃值: (370)
能力值: ( 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;
}
2010-8-18 04:50
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
3
恢复ssdt,网上代码一箩筐~~
2010-8-18 04:51
0
雪    币: 64
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
KeServiceDescriptorTable-> ServiceTableBase 这片内存 以及下面这个
KeServiceDescriptorTable->NumberOfService 变量 是在nt*.exe 内核加载的哪个阶段被填充的,
根据我个人的研究,我估计那几个东东被重定位了,说白了就是想了解他们是如何被填充的。
本人表达不清晰,原谅,原谅。。。
2010-8-18 22:03
0
雪    币: 998
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
KiInitSystem()
2010-8-19 01:03
0
雪    币: 64
活跃值: (11)
能力值: ( 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 入口。。

离成功不远了。
2010-8-21 02:17
0
雪    币: 49
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
参见WRK
WRK-v1.2\base\ntos\ke\i386\systable.asm
大概吧。
2010-12-3 13:38
0
游客
登录 | 注册 方可回帖
返回
//