首页
社区
课程
招聘
[原创]以下驱动代码蓝屏求解!-----根据特征码搜索未导出函数。
发表于: 2012-6-14 19:15 7617

[原创]以下驱动代码蓝屏求解!-----根据特征码搜索未导出函数。

2012-6-14 19:15
7617
ULONG GetPspTerminateProcessAddress()
{
    ULONG ntoskrnlAddr, sizeofNtoskrnl, endNtoskrnlAddr ,i;
    ULONG opcode1=0x8b55ff8b, opcode2=0xa16456ec, opcode3=0x00000124, opcode4=0x3b08758b;
	
    KeSetSystemAffinityThread(1); //使当前线程运行在第一个处理器上
    __asm{
        push eax
            push ebx
            mov eax,fs:[0x34]   ;得到KdVersionBlock的地址
            add eax,18h      ;得到指向PsLoadedModuleList的地址
            mov eax,[eax]      ;得到PsLodedModuleList的地址
            mov eax,[eax]      ;取出PsLoadedModuleList里面的内容,即KLDR_DATA_TABLE_ENTRY结构
            mov ebx,[eax+18h]  ;取出DllBase,即ntoskrnl.exe的基地址
            mov ntoskrnlAddr, ebx
                  mov ebx, [eax+20h] ;取出模块的大小
            mov sizeofNtoskrnl, ebx
                  pop ebx
                  pop eax
	}
    KeRevertToUserAffinityThread();//恢复线程运行的处理器


	endNtoskrnlAddr = ntoskrnlAddr + sizeofNtoskrnl;
	DbgPrint("ntoskrnlAddr: 0x%08x\nsizeofntoskrnl: %ul\n", ntoskrnlAddr,sizeofNtoskrnl);
	
                for (i=ntoskrnlAddr; i<endNtoskrnlAddr; i++)
	{
		if (*(PULONG)i==opcode1 && *(PULONG)(i+4)==opcode2
			&& *(PULONG)(i+8)==opcode3 && *(PULONG)(i+12)==opcode4)
		{
			DbgPrint("PspTerminateProcess: 0x%08X\n", i);
                                                return i;
		}
	}
 
	DbgPrint("我擦,找了半天没找到~ 可能是Windows版本的问题.\n");
                return 0;
}


不知道怎么回事,我朋友说可以用的,但是我却怎么也蓝屏。
及时不用这种方法进行特征码搜索也会蓝屏....任何方法都无法使用。

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

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
Ntoskrnl的地址和大小,在XT中查看对比没错。

中间的那个for循环被我注释掉了,只要一不注释,马上蓝。
2012-6-14 19:16
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
哪位高手能看下。在线等哦!~。
2012-6-14 20:15
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
4
发现个问题,首先你不检查i 是否可以访问,就直接*(PULONG)i,不蓝才怪。其他同理。还有你这样子做法不效率,应该从上层函数搜。或者用符号pdb,其次,蓝屏了用windbg很容易就定位到这类常见蓝屏,要么50,要么7e错误。
2012-6-14 23:23
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
5
DbgPrint("我擦,找了半天没找到~ 可能是Windows版本的问题.\n");
你这个输出语句也太搞了吧!
2012-6-15 01:06
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
6
这个蓝屏的问题很明白的告诉你,
问题的根本原因是INIT节执行完之后映射就取消了,访问不存在的内存必然要蓝!
即使用SHE也一样会蓝屏。不管mov ebx, [eax+20h] ;取到的模块大小是对齐后的大小还是实际大小,都会蓝!原因就是上面我说的INIT节的问题。具体解决办法很简单。。

使用ZwMapViewOfSection来自己映射到r3即可,具体可以参考我的代码。。

把你的邮箱留下,我发到你邮箱!
2012-6-15 01:16
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
7
看我的帖子,这是一个比较好的解决办法。
http://bbs.pediy.com/showthread.php?t=152144
2012-6-15 02:34
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
[QUOTE=小覃;1080154]这个蓝屏的问题很明白的告诉你,
问题的根本原因是INIT节执行完之后映射就取消了,访问不存在的内存必然要蓝!
即使用SHE也一样会蓝屏。不管mov ebx, [eax+20h] ;取到的模块大小是对齐后的大小还是实际大小,都会蓝!原因就是上面我说的INIT节的问题。具体解决办法很简单。。

...[/QUOTE]

需要重定位内核么?
2012-6-15 06:31
0
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=小覃;1080163]看我的帖子,这是一个比较好的解决办法。
http://bbs.pediy.com/showthread.php?t=152144[/QUOTE]

我就是不明白,如果说我映射了ntoskrnl.exe内核后,映射后需要进行模块重定位么?.....
据说对内核的重定位多达上万处。。。。要一个一个来- -
高手解释下。
2012-6-15 07:02
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
10
本站搜索 A盾 代码
2012-6-15 10:23
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
11
楼主标题说搜索“未导出函数”,导出函数当然可以直接GetProcAddress()
2012-6-16 12:36
0
雪    币: 615
活跃值: (172)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
12
不需要~                  。
2012-6-16 12:39
0
雪    币: 94
活跃值: (40)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
MmIsAddressValid 判断一下,应该就可以了
2012-6-18 08:53
0
雪    币: 585
活跃值: (578)
能力值: ( LV13,RANK:290 )
在线值:
发帖
回帖
粉丝
14
呵呵,这个问题我当初也遇到了

最好是读nt文件到内存,
然后自己再扫描,这样就不会蓝了,而且还避免了由于别人对nt的修改而导致扫描不到的情况。
2012-6-18 09:04
0
雪    币: 6564
活跃值: (4361)
能力值: ( LV10,RANK:163 )
在线值:
发帖
回帖
粉丝
15
你特征码写的有问题,一直搜索不到,所以蓝了.
2012-6-18 09:11
0
游客
登录 | 注册 方可回帖
返回
//