能力值:
( LV3,RANK:30 )
|
-
-
2 楼
ULONG EnrtyAddr;//拼写错误
EntryAddr=(ULONG*);->EntryAddr=(ULONG*)DriverEntry;
|
能力值:
( LV8,RANK:120 )
|
-
-
3 楼
学习一下..
|
能力值:
( LV9,RANK:165 )
|
-
-
4 楼
谢谢提醒,这里本来是要注释掉的,忘记了,感谢补全!
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
挺好的知识普及帖,感谢了!
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
学习一下,总结是非常必要的。
|
能力值:
( LV3,RANK:20 )
|
-
-
7 楼
搜内存原理是这样的。
在DriverEntry内取得返回地址。
(为什么可以取返回地址,想一想驱动的加载过程具体说就nt!IopLoadDriver内那句Call dword ptr [edi+2c])而这个返回地址就在内核文件内部。然后以返回地址为起点,按页对齐(对齐只是为了加快搜索速度,不对齐也行)向前搜。直到匹配了PE特征。而第一个匹配PE特征的地址就是内核文件基地址。
明白了原理相信C代码就很容易了。我顺带贴一个。
BOOLEAN
FindBaseAndSize(
IN PVOID SomePtr,
OUT PVOID *BaseAddress OPTIONAL,
OUT ULONG *ImageSize OPTIONAL
)
{
ULONG SomeAddress = (ULONG) SomePtr;
for ( SomeAddress &= 0xFFFFF000 ; ; SomeAddress -= PAGE_SIZE )
{
if(MmIsAddressValid ((PVOID)SomeAddress) && *(USHORT*)SomeAddress == IMAGE_DOS_SIGNATURE ) // MZ signature?
{
PVOID NtHeader = RtlImageNtHeader ((PVOID)SomeAddress);// + ((IMAGE_DOS_HEADER*)SomeAddress)->e_lfanew;
if (MmIsAddressValid ((PVOID)NtHeader) && *(ULONG*)NtHeader == IMAGE_NT_SIGNATURE) // PE signature?
{
if (ARGUMENT_PRESENT (BaseAddress))
*BaseAddress = (PVOID)SomeAddress;
if (ARGUMENT_PRESENT (ImageSize))
*ImageSize = ((IMAGE_NT_HEADERS*)NtHeader)->OptionalHeader.SizeOfImage;
return TRUE;
}
}
}
return FALSE;
}
在DriverEntry内调用的时候FindBaseAndSize(DriverEntry返回地址,XXX,XXX)。
备注:
一、实际上也不一定非取得返回地址,内核内任意一个函数的地址都可以作为起点。
二、我顺手贴的这个代码不支持X64.
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
很好的基础知识,学习了。
|
能力值:
( LV5,RANK:60 )
|
-
-
9 楼
学习写驱动。标记慢慢看。。
|
能力值:
( LV9,RANK:165 )
|
-
-
10 楼
[QUOTE=傷遺忘;991319]搜内存原理是这样的。
在DriverEntry内取得返回地址。
(为什么可以取返回地址,想一想驱动的加载过程具体说就nt!IopLoadDriver内那句Call dword ptr [edi+2c])而这个返回地址就在内核文件内部。然后以返回地址为起点,按页对齐(对齐只是为了加快搜索速度,不对...[/QUOTE]
感谢讲解
我这样试了试,估计有错误,指针什么的
void Method3(ULONG Base)//,OUT PVOID* BaseAddress,OUT PVOID* ImageSize)//搜索内存,从0x80000000-----0xa0000000
{
for(Base&=0xfffff000;;Base-=PAGE_SIZE)
{
if(MmIsAddressValid((PVOID)Base)&&*(USHORT*)Base==IMAGE_DOS_SIGNATURE ) //MZ标识
{
PVOID NTHeader=RtlImageNtHeader((PVOID)Base);//获得NT头指针
if(MmIsAddressValid((PVOID)NTHeader)&&*(ULONG*)NTHeader==IMAGE_NT_SIGNATURE) //PE文件标识
{
//MSDN:The ARGUMENT_PRESENT macro takes an argument pointer and returns FALSE if the pointer is NULL, TRUE otherwise.
/*if (ARGUMENT_PRESENT (BaseAddress))
*BaseAddress = (PVOID)SomeAddress;
if (ARGUMENT_PRESENT (ImageSize))
*ImageSize = ((IMAGE_NT_HEADERS*)NtHeader)->OptionalHeader.SizeOfImage;*/
DbgPrint("地址:%8X\n",Base);
}
}
DbgPrint("搜索%8X中...\n",Base);
if(Base<0x80000000)
{
DbgPrint("搜索失败!\n");
break;
}
}
}
结果WinDbg看输出都一个小时了才到 搜索E88C4000中...
|
能力值:
( LV9,RANK:165 )
|
-
-
11 楼
能不能说说上面的代码有哪些问题
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
mark!!
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
不错不错,学习~
|
能力值:
( LV9,RANK:165 )
|
-
-
14 楼
驱动的返回地址是这么得到的吗?好像不是啊,基础太差了
EntryAddr=(ULONG)DriverEntry;
DbgPrint("%8X\n",EntryAddr);
得到的是: 驱动返回地址:F8D14990
明显不在内核文件范围内,求指教
|
能力值:
( LV9,RANK:165 )
|
-
-
15 楼
方法3终于搞定了
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
楼主灰常辛苦
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
学习学习~
|
|
|