能力值:
( LV9,RANK:610 )
|
-
-
2 楼
pszModName= (char *)((PBYTE)hMod+pDataEntryAddress->Name) ;
|
能力值:
( LV12,RANK:600 )
|
-
-
3 楼
不行啊,,,,,,,原先就是用(PBYTE)hMod的.......还是蓝屏..我也觉得奇怪..平时都没什么问题
蓝屏信息提示是 PAGE_FAULT_IN_NONPAGE_AREA
|
能力值:
( LV9,RANK:610 )
|
-
-
4 楼
那我估计原因不在后面的部分。
可能是你的 pszModName变量定义有问题。
|
能力值:
( LV12,RANK:600 )
|
-
-
5 楼
char* pszModName;
这次我真晕....就是不知道为什么
|
能力值:
( LV9,RANK:610 )
|
-
-
6 楼
IAT hook而已嘛。
赋值出错,而且后面部分又没有问题,只能这么怀疑了。
你把你的代码多贴一些
|
能力值:
( LV12,RANK:600 )
|
-
-
7 楼
刚上完课....IAT HOOK我已经在编程版块贴过了
这是我的代码...帮忙一下....就是修改了我以前IAT HOOK的代码
#include "ntddk.h"
#include "hookiat.h"
#pragma comment(lib,"ntdll.lib")
PVOID GetDriverBaseAdress(char* driverName)
{
ULONG size,index;
PULONG buf;
NTSTATUS status;
PSYSTEM_MODULE_INFORMATION module;
PVOID driverAddress=0;
ZwQuerySystemInformation(SystemModuleInformation,&size, 0, &size);
if(NULL==(buf = (PULONG)ExAllocatePool(PagedPool, size)))
{
DbgPrint("failed alloc memory failed \n");
return 0;
}
status=ZwQuerySystemInformation(SystemModuleInformation,buf, size , 0);
if(!NT_SUCCESS( status ))
{
DbgPrint("failed query\n");
return 0;
}
module = (PSYSTEM_MODULE_INFORMATION)(( PULONG )buf + 1);
for (index = 0; index < *buf; index++)
if (_stricmp(module[index].ImageName + module[index].ModuleNameOffset, driverName) == 0)
{
driverAddress = module[index].Base;
DbgPrint("Module found at:%x\n",driverAddress);
}
ExFreePool(buf);
return driverAddress;
}
VOID GetIATPointerRVAFromBase()
{
HANDLE hMod;
PVOID BaseAddress ;
char* pszModName;
IMAGE_DOS_HEADER * dosheader;
IMAGE_OPTIONAL_HEADER * opthdr;
IMAGE_IMPORT_DESCRIPTOR * pDataEntryAddress;
BaseAddress= GetDriverBaseAdress("acpi.sys");
hMod = BaseAddress;
dosheader = (IMAGE_DOS_HEADER *)hMod;
opthdr =(IMAGE_OPTIONAL_HEADER *) ((BYTE*)hMod+dosheader->e_lfanew+24);
pDataEntryAddress = (IMAGE_IMPORT_DESCRIPTOR *)((BYTE*)dosheader+ opthdr->DataDirectory[1].VirtualAddress);
pszModName= (char *)((PBYTE)hMod+pDataEntryAddress->Name) ;---------------------------->>>>>>>>>蓝屏
DbgPrint(" %s \n",pszModName);
}
VOID Unload(PDRIVER_OBJECT DriverObject)
{
DbgPrint("Unload Called \r\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING str)
{
GetIATPointerRVAFromBase( );
DriverObject->DriverUnload = Unload;
return STATUS_SUCCESS;
}
|
能力值:
( LV12,RANK:600 )
|
-
-
8 楼
郁闷中......没头绪
|
能力值:
( LV12,RANK:210 )
|
-
-
9 楼
PAGE_FAULT_IN_NONPAGE_AREA
从这个错误码来看,可能访问的内存被换出去了。看看蓝屏时的 irql,是不是太高了。用 !pte 命令看看当前访问的内存是不是有效。
|
能力值:
( LV12,RANK:600 )
|
-
-
10 楼
这个代码应该没有运行在DISPATCH_LEVEL级别上吧...缺页应该不会蓝屏.....不知道是不是我机器的原因.........而且我试了降低级别也不行........郁闷
下面是蓝屏截图还有dmp文件
|
能力值:
( LV12,RANK:600 )
|
-
-
11 楼
因为之前HOOK驱动程序的IAT..........所以想检测内核模块IAT HOOK........可是就是不能遍历内核模块的导入函数................可能有一些东西我不知道.....麻烦大家指教下........我发现一些anti-rootkit没有这个功能...是不是不可能实现????
|
能力值:
(RANK:170 )
|
-
-
12 楼
GetDriverBaseAdress返回的地址你输出看看,用MmIsAddressValid看看有效性,
另外这个 opthdr =(IMAGE_OPTIONAL_HEADER *) ((BYTE*)hMod+dosheader->e_lfanew+24);也用IMAGE_NT_HEADERS,不要手写偏移
|
能力值:
( LV12,RANK:600 )
|
-
-
13 楼
返回地址是正确的......我也试了IMAGE_NT_HEADERS...不过还是蓝屏..正郁闷...遍历内核模块的导入表怎么老出问题
|
能力值:
( LV4,RANK:50 )
|
-
-
14 楼
因为那块内存被丢弃了。。。所以蓝屏
|
能力值:
(RANK:330 )
|
-
-
15 楼
加锁 加锁
|
能力值:
( LV4,RANK:50 )
|
-
-
16 楼
加锁也没用。。。已经被丢弃了。。。不是被换出去了
|
能力值:
(RANK:330 )
|
-
-
17 楼
原来是这样,断水流好棒呀。
|
能力值:
( LV12,RANK:600 )
|
-
-
18 楼
这个问题我真的很郁闷.........不运行在DISPATCH_LEVEL级别怎么缺页会蓝...........
而且任何内核模块...除了ntdll.dll都会蓝....就是不明白真正的原因
|
能力值:
( LV12,RANK:600 )
|
-
-
19 楼
那是不是驱动被IAT HOOK了...就不能检测了???......指的是磁盘文件跟内存的比较
|
能力值:
( LV4,RANK:50 )
|
-
-
20 楼
那段内存被丢弃了,跟IRQL没关系。。。
|
能力值:
( LV4,RANK:50 )
|
-
-
21 楼
可以检测啊,自己读取文件呗
|
能力值:
( LV12,RANK:600 )
|
-
-
22 楼
读取文件我读了...可以....但是想跟内存做比较......但内存遍历就这样了...蓝
|
能力值:
( LV4,RANK:50 )
|
-
-
23 楼
比较的时候注意跳过被丢弃的内存
|
能力值:
( LV12,RANK:600 )
|
-
-
24 楼
哦.....谢谢提醒..这么说不是整个导入表被丢弃....还有一些在内存..........我试看
|
|
|