首页
社区
课程
招聘
[求助]驱动DUMP分析
发表于: 2011-8-17 17:27 6102

[求助]驱动DUMP分析

2011-8-17 17:27
6102
object=*(PULONG)(table2+(i-0x800)*2);

if(MmIsAddressValid((PULONG)((table2+(i-0x800)*2)+NEXTFREETABLEENTRY)))
{
NextFreeTableEntry=*(PULONG)((table2+(i-0x800)*2)+NEXTFREETABLEENTRY);

WINDBG  加载了源程序 SYMBOL SRC 和Image 路径  然加载DUMP文件 分析

自动跳出上面最后一句  意思就是 这里导致的崩溃吧。担怎么都没看明白这里哪错了

高手指点啊。

下面是 WINDBG  分析结果

*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

Use !analyze -v to get detailed debugging information.

BugCheck 10000050, {e3941000, 0, a745a02f, 1}

Could not read faulting driver name
Probably caused by : ProcessHide.sys ( ProcessHide+102f )

Followup: MachineOwner
---------

1: kd> !analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

PAGE_FAULT_IN_NONPAGED_AREA (50)
Invalid system memory was referenced.  This cannot be protected by try-except,
it must be protected by a Probe.  Typically the address is just plain bad or it
is pointing at freed memory.
Arguments:
Arg1: e3941000, memory referenced.
Arg2: 00000000, value 0 = read operation, 1 = write operation.
Arg3: a745a02f, If non-zero, the instruction address which referenced the bad memory
        address.
Arg4: 00000001, (reserved)

Debugging Details:
------------------

Could not read faulting driver name

READ_ADDRESS:  e3941000

FAULTING_IP:
ProcessHide+102f
a745a02f 8b944104f0ffff  mov     edx,dword ptr [ecx+eax*2-0FFCh]

MM_INTERNAL_CODE:  1

CUSTOMER_CRASH_COUNT:  1

DEFAULT_BUCKET_ID:  DRIVER_FAULT

BUGCHECK_STR:  0x50

PROCESS_NAME:  System

LAST_CONTROL_TRANSFER:  from a745b0e9 to a745a02f

STACK_TEXT:  
WARNING: Stack unwind information not available. Following frames may be wrong.
ba507c74 a745b0e9 00000000 a745b23e ba507d54 ProcessHide+0x102f
ba507c84 8058239d 8991b030 886b6000 00000000 ProcessHide+0x20e9
ba507d54 805824ad 800014b0 00000001 00000000 nt!IopLoadDriver+0x66d
ba507d7c 805397cb 800014b0 00000000 89bf3020 nt!IopLoadUnloadDriver+0x45
ba507dac 805d0fa8 a6c76c44 00000000 00000000 nt!ExpWorkerThread+0xef
ba507ddc 8054715e 805396dc 00000001 00000000 nt!PspSystemThreadStartup+0x34
00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x16

STACK_COMMAND:  kb

FOLLOWUP_IP:
ProcessHide+102f
a745a02f 8b944104f0ffff  mov     edx,dword ptr [ecx+eax*2-0FFCh]

SYMBOL_STACK_INDEX:  0

SYMBOL_NAME:  ProcessHide+102f

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: ProcessHide

IMAGE_NAME:  ProcessHide.sys

DEBUG_FLR_IMAGE_TIMESTAMP:  4e1810fc

FAILURE_BUCKET_ID:  0x50_ProcessHide+102f

BUCKET_ID:  0x50_ProcessHide+102f

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
((PULONG)((table2+(i-0x800)*2)+NEXTFREETABLEENTRY)))
这个地址都是经过  MmIsAddressValid  判断是否可读写了啊
2011-8-17 17:31
0
雪    币: 1050
活跃值: (1208)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
Even if MmIsAddressValid returns TRUE, accessing the address can cause page faults unless the memory has been locked down or the address is a valid nonpaged pool address.
2011-8-17 17:57
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
恩,这个问题意思就是页面错误。  估计就是访问的内存是分页内存  

似乎解决办法就是 1 锁定内存 来达到访问的效果。但是怎么操作还是不知道

继续寻找答案。我也在积极BAIDU  希望有高手能给出解决办法
2011-8-18 10:26
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
PULONG pulAddrTmp=(PULONG)((table2+(i-0x800)*2)+NEXTFREETABLEENTRY);

PMDL MDLSystemCall;
PVOID *MappedSCT;
MDLSystemCall = MmCreateMdl(NULL, PULONG, 4);    //创建一个 MDL
if(!MDLSystemCall)
    return STATUS_UNSUCCESSFUL;
MmBuildMdlForNonPagedPool(MDLSystemCall);       //将对应的VA映射到物理内存  转化成非分页内存
MDLSystemCall->MdlFlags = MDLSystemCall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA; //可写
MappedSCT = MmMapLockedPages(MDLSystemCall, KernelMode);

//NextFreeTableEntry=*(PULONG)((table2+(i-0x800)*2)+NEXTFREETABLEENTRY);
NextFreeTableEntry=*pulAddrTmp;

网上搜索了一个解决方法来  用MDL处理  看得不是很明白  是不是加这几句就可以了啊  大牛们给点意见啊
2011-8-18 10:49
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
MDLSystemCall = MmCreateMdl(NULL, pulAddrTmp, 4);    //创建一个 MDL

这句发错了
2011-8-18 10:50
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
http://apps.hi.baidu.com/share/detail/19511905
http://www.cppblog.com/sleepwom/archive/2009/09/24/97105.html
这两篇 MDL 的文章讲解得很好 不过我打算把他们的方法写成宏的时候 却想到了另一个问题

MDL虽好 但是不可能在每个自己需要修改的内存上都写那么多的代码  所以我想写成函数

但是想了一下  好像这2篇文章都只将了如何创建 映射 和锁定MDL  但是当不需要这些的时候

应该怎么处理呢。他们没讲 是因为局部变量作用消失了就自动恢复是吧。 怎么写恢复的函数呢

下面贴出我的代码  希望高手能给个恢复的代码 谢谢

PMDL   pmdlsyscall;
PVOID *MappedSCT;
PVOID  pDstAddr;
ULONG  ulLen;
BOOLEAN SAFE_DEAL_MEM_Begin(PMDL pmdlsyscall,PVOID *MappedSCT,PVOID  pDstAddr,ULONG  ulLen)      
{   
        pmdlsyscall = MmCreateMdl(NULL,pDstAddr,ulLen);
        if ( NULL==pmdlsyscall )
        {
                return  FALSE;
        }
        MmBuildMdlForNonPagedPool( pmdlsyscall );
        pmdlsyscall->MdlFlags = pmdlsyscall->MdlFlags | MDL_MAPPED_TO_SYSTEM_VA;
        MappedSCT = MmMapLockedPages(pmdlsyscall,KernelMode);
        return   TRUE;
}
2011-8-18 11:43
0
雪    币: 88
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你是做SSDT HOOK?你修改了CR0吗?
2011-8-19 10:27
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不是做SSDT HOOK 是练习文件过滤

2楼也说了是对分页内存操作引发的问题。但是没说怎么解决

我百度出来似乎应该先用MDL映射一下,锁定需要访问的地址。然后再操作对应的内存地址

但是心头总是玄的。不知道正确否。 而且怎么映射了MDL 不释放呢  我没搞懂
2011-8-19 13:33
0
游客
登录 | 注册 方可回帖
返回
//