首页
社区
课程
招聘
[求助]ntkrnlpa.exe的imagesize 是多少
发表于: 2013-12-23 14:03 5742

[求助]ntkrnlpa.exe的imagesize 是多少

2013-12-23 14:03
5742
最近菜鸟学习大牛们的内核重载,下载了LAOSYS的那个发现加载蓝屏,不得已自己找原因了,windbg双机发现驱动加载后1秒就蓝了,自己看了,原因可能是重载的内核和原来的对不上(使用一个函数和原来的对比来看),怀疑是peload的时候有问题。然后我就发现一个问题,见下面:

PIMAGE_DOS_HEADER ImageDosHeader;
	PIMAGE_NT_HEADERS ImageNtHeaders;
	PIMAGE_SECTION_HEADER ImageSectionHeader;
	DWORD FileAlignment,SectionAlignment,NumberOfSections,SizeOfImage,SizeOfHeaders;
	DWORD Index;
	BYTE *ImageBase;
	DWORD SizeOfNtHeaders;
	ImageDosHeader=(PIMAGE_DOS_HEADER)FileBuffer;
	if (ImageDosHeader->e_magic!=IMAGE_DOS_SIGNATURE)
	{
 
		return FALSE;
	}
	ImageNtHeaders=(PIMAGE_NT_HEADERS)(FileBuffer+ImageDosHeader->e_lfanew);
	if (ImageNtHeaders->Signature!=IMAGE_NT_SIGNATURE)
	{
 
		return FALSE;
	}
	FileAlignment=ImageNtHeaders->OptionalHeader.FileAlignment;//文件对齐
	SectionAlignment=ImageNtHeaders->OptionalHeader.SectionAlignment;//内存对齐
	NumberOfSections=ImageNtHeaders->FileHeader.NumberOfSections;//节的个数
	SizeOfImage=ImageNtHeaders->OptionalHeader.SizeOfImage;//映像大小  断在这里发现SizeOfImage=0020E000 
	SizeOfHeaders=ImageNtHeaders->OptionalHeader.SizeOfHeaders;//头大小

	SizeOfImage=AlignSize(SizeOfImage,SectionAlignment);//对齐后大小

	ImageBase=(BYTE*)ExAllocatePool(NonPagedPool,SizeOfImage);


但是用studpe和peid 看ntkrnlpa.exe,SizeOfImage都是0020D000 ,请问这个是什么原因,这个应该不是蓝屏的原因,不过我卡在这里了,蓝屏的原因有知道的也请帮忙分析下,多谢了~

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 112
活跃值: (201)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
建议你看看这篇文章,
http://bbs.pediy.com/showthread.php?t=177555
里面解说重载内核的ntkrnlpa.exe的方法很清楚
我按它里面的方法基本也可以重载了ntkrnlpa.exe这个内核,不过我按里面的方法对win32k.sys重载就经常蓝屏,
我还遇到一个问题,就是重载后了,如果你想让你的程序跑新内核,上面那篇文章的源码里
display得改一下
我的就这样的

ULONG display(ULONG ServiceTableBase,ULONG FuncIndex,ULONG OrigFuncAddress)
{

        if (ServiceTableBase==(ULONG)KeServiceDescriptorTable.ServiceTableBase)
        {//比较当前调用的进程是不是ce
                if (PanDuanProcessName("cheatengine-i38.exe")||
                        PanDuanProcessName("MHScn.exe")||
                        PanDuanProcessName("windbg.exe")||
                        PanDuanProcessName("OllyDBG.EXE")||
                        PanDuanProcessName("bianyi.exe")||
                        PanDuanProcessName("W-P-E.exe")||
                        PanDuanProcessName("AAA.exe"))
                {
                        if (FuncIndex<0x1000)
                        {
       
                                ULONG aaa= pNewSSDT->ServiceTableBase[FuncIndex];
                                return aaa;
                        }       
                       
                }
               
               
        }
        return OrigFuncAddress;
}

BOOLEAN PanDuanProcessName(char *szName)
{
        int nEProcess;
        CHAR szProessaName[1024]={0};
        nEProcess=(int)PsGetCurrentProcess();
        strcpy(szProessaName,(char*)(nEProcess+0x174));
        if(strcmp(szProessaName,szName)==0)
        {
                //DbgPrint("aaaaaaaaaaaaaaaaaaaaaaaaaaaa\n");
                return TRUE;
        }
        return FALSE;
}

最关键就是这个FuncIndex参数,因为我们只是重截了ntkrnlpa.exe这个内核,而且也修复了ssdt,但是我们没有重载win32k.sys,听说一些界面的gui函数都是往win32k.sys跑的
网上看到说funcindex这个参数小于0x1000都是跑ssdt里的函数,大于就跑其它的了
所以不加这一句
                        if (FuncIndex<0x1000)
                        {
       
                                ULONG aaa= pNewSSDT->ServiceTableBase[FuncIndex];
                                return aaa;
                        }
而只是这样
                                ULONG aaa= pNewSSDT->ServiceTableBase[FuncIndex];
                                return aaa;
就会造成蓝屏,
2013-12-23 16:16
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我也参照的这篇文章+A盾源码,重载内核hook了 KiFastCallEntry(测试环境是win7 32位), 返回的都是我重载的KeServiceTable->Base[index],不会蓝屏啊,但是卸载会蓝屏(我已经先恢复hook代码了,也没用),除非自己重载的内存段不释放。求大侠指点一二。
2013-12-24 10:39
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢楼上的,我再研究下。这个问题我已经知道了,原来它load的是已经保存在buffer中的ntkrnlpa,而不是实际的那个,只是奇怪为什么不直接用系统的的ntkrnlpa.exe,而拷贝他的二进制?
2013-12-25 15:58
0
雪    币: 8
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这边的load不是完全重新加载一个内核。。涉及到很多初始化。
使用硬盘文件映射和拷贝内存没什么区别的,区别在于是否需要分段读入缓存
2013-12-28 09:59
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
仿造原来的xxxxxxx.cpp重新弄了ntkrnlpa.exe和win32k.sys

char MYSTRA[] ={0x4D,0x5A,0x90,0x0,0x3,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0xFF,0xFF,0x0,0x0,0xB8,0x0,0x0,0x0,0x0,0x0,0x0,....};
char MYW32SKSTRA[] ={0x4D,0x5A,0x90,0x0,0x3,0x0,0x0,0x0,0x4,0x0,0x0,0x0,0xFF,0xFF,0x0,....};

加载驱动,这次过了5秒蓝屏,用楼上的方法检验,看得出内核应该是正确加载了:

nt!IoCreateFile:
8057791c 8bff            mov     edi,edi
8057791e 55              push    ebp
8057791f 8bec            mov     ebp,esp
80577921 83ec0c          sub     esp,0Ch
80577924 53              push    ebx
80577925 56              push    esi
80577926 33f6            xor     esi,esi
80577928 8975fc          mov     dword ptr [ebp-4],esi
8057792b 8b1db8a05580    mov     ebx,dword ptr [nt!KeI386MachineType+0x3634 (8055a0b8)]
80577931 f6c301          test    bl,1
///////////////////////////
0: kd> u 8425091C l a
8425091c 8bff            mov     edi,edi
8425091e 55              push    ebp
8425091f 8bec            mov     ebp,esp
84250921 83ec0c          sub     esp,0Ch
84250924 53              push    ebx
84250925 56              push    esi
84250926 33f6            xor     esi,esi
84250928 8975fc          mov     dword ptr [ebp-4],esi
8425092b 8b1db8a05580    mov     ebx,dword ptr [nt!KeI386MachineType+0x3634 (8055a0b8)]
84250931 f6c301          test    bl,1

这次蓝屏的位置:

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - 0x%08lx

FAULTING_IP:
LAOSYS!OrigDbgkUnMapViewOfSection+3
ba6238b3 894818          mov     dword ptr [eax+18h],ecx

EXCEPTION_RECORD:  f7a36be8 -- (.exr 0xfffffffff7a36be8)
ExceptionAddress: ba6238b3 (LAOSYS!OrigDbgkUnMapViewOfSection+0x00000003)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 00000001
   Parameter[1]: 00000018
Attempt to write to address 00000018

CONTEXT:  f7a368e4 -- (.cxr 0xfffffffff7a368e4)
eax=00000000 ebx=e1037008 ecx=8063cee4 edx=b07a6a2a esi=e101d7ec edi=00000000
eip=ba6238b3 esp=f7a36cb0 ebp=f7a36cb8 iopl=0         nv up ei pl zr na pe nc
cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00010246
LAOSYS!OrigDbgkUnMapViewOfSection+0x3:
ba6238b3 894818          mov     dword ptr [eax+18h],ecx ds:0023:00000018=????????
Resetting default scope

PROCESS_NAME:  System

ERROR_CODE: (NTSTATUS) 0xc0000005 - 0x%08lx

EXCEPTION_PARAMETER1:  00000001

EXCEPTION_PARAMETER2:  00000018

WRITE_ADDRESS:  00000018

FOLLOWUP_IP:
LAOSYS!OrigDbgkUnMapViewOfSection+3
ba6238b3 894818          mov     dword ptr [eax+18h],ecx

BUGCHECK_STR:  0x7E

DEFAULT_BUCKET_ID:  NULL_CLASS_PTR_DEREFERENCE

LAST_CONTROL_TRANSFER:  from e103722c to ba6238b3

OrigDbgkUnMapViewOfSection这个函数蓝屏了,这个就有点难了,希望大牛指点下阿,这是什么情况?
2013-12-29 14:24
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
原因找到了,他是直接使用的地址和我的版本对不上。驱动成功加载,结贴了。
2013-12-29 15:26
0
游客
登录 | 注册 方可回帖
返回
//