首页
社区
课程
招聘
[求助]帮忙看下为什么蓝屏
发表于: 2008-4-16 18:35 11962

[求助]帮忙看下为什么蓝屏

2008-4-16 18:35
11962
我想遍历acpi.sys的导出表......已经得到它在内存中的正确地址hMod

    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);
   
    if( NULL == pDataEntryAddress) return 0;
               
    pszModName = (char*)((DWORD)hMod + pDataEntryAddress->Name);----->>>这一句就蓝屏...请教大家给个提示
   DbgPrint(" %s \n",pszModName);

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (23)
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
2
pszModName= (char *)((PBYTE)hMod+pDataEntryAddress->Name) ;
2008-4-16 18:54
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
3
不行啊,,,,,,,原先就是用(PBYTE)hMod的.......还是蓝屏..我也觉得奇怪..平时都没什么问题
蓝屏信息提示是 PAGE_FAULT_IN_NONPAGE_AREA
2008-4-16 18:59
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
那我估计原因不在后面的部分。
可能是你的 pszModName变量定义有问题。
2008-4-16 19:14
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
5
char* pszModName;
这次我真晕....就是不知道为什么
2008-4-16 19:15
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
IAT hook而已嘛。
赋值出错,而且后面部分又没有问题,只能这么怀疑了。
你把你的代码多贴一些
2008-4-16 19:18
0
雪    币: 581
活跃值: (149)
能力值: ( 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;
}
2008-4-16 22:13
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
8
郁闷中......没头绪
2008-4-17 07:45
0
雪    币: 191
活跃值: (41)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
9
PAGE_FAULT_IN_NONPAGE_AREA
从这个错误码来看,可能访问的内存被换出去了。看看蓝屏时的 irql,是不是太高了。用 !pte 命令看看当前访问的内存是不是有效。
2008-4-17 09:09
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
10
这个代码应该没有运行在DISPATCH_LEVEL级别上吧...缺页应该不会蓝屏.....不知道是不是我机器的原因.........而且我试了降低级别也不行........郁闷
下面是蓝屏截图还有dmp文件
上传的附件:
2008-4-17 09:31
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
11
因为之前HOOK驱动程序的IAT..........所以想检测内核模块IAT HOOK........可是就是不能遍历内核模块的导入函数................可能有一些东西我不知道.....麻烦大家指教下........我发现一些anti-rootkit没有这个功能...是不是不可能实现????
2008-4-18 17:36
0
雪    币: 2134
活跃值: (14)
能力值: (RANK:170 )
在线值:
发帖
回帖
粉丝
12
GetDriverBaseAdress返回的地址你输出看看,用MmIsAddressValid看看有效性,

另外这个 opthdr =(IMAGE_OPTIONAL_HEADER *) ((BYTE*)hMod+dosheader->e_lfanew+24);也用IMAGE_NT_HEADERS,不要手写偏移
2008-4-18 19:22
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
13
返回地址是正确的......我也试了IMAGE_NT_HEADERS...不过还是蓝屏..正郁闷...遍历内核模块的导入表怎么老出问题
2008-4-18 20:31
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
14
因为那块内存被丢弃了。。。所以蓝屏
2008-4-18 23:48
0
雪    币: 1946
活跃值: (303)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
15
加锁  加锁
2008-4-18 23:51
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
加锁也没用。。。已经被丢弃了。。。不是被换出去了
2008-4-18 23:52
0
雪    币: 1946
活跃值: (303)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
17
原来是这样,断水流好棒呀。
2008-4-18 23:54
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
18
这个问题我真的很郁闷.........不运行在DISPATCH_LEVEL级别怎么缺页会蓝...........
而且任何内核模块...除了ntdll.dll都会蓝....就是不明白真正的原因
2008-4-18 23:58
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
19
那是不是驱动被IAT HOOK了...就不能检测了???......指的是磁盘文件跟内存的比较
2008-4-19 00:00
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
那段内存被丢弃了,跟IRQL没关系。。。
2008-4-19 10:14
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
21
可以检测啊,自己读取文件呗
2008-4-19 10:15
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
22
读取文件我读了...可以....但是想跟内存做比较......但内存遍历就这样了...蓝
2008-4-19 10:20
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
23
比较的时候注意跳过被丢弃的内存
2008-4-19 10:27
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
24
哦.....谢谢提醒..这么说不是整个导入表被丢弃....还有一些在内存..........我试看
2008-4-19 10:30
0
游客
登录 | 注册 方可回帖
返回