首页
社区
课程
招聘
[求助]关于驱动对象的driversection及windbg调试的奇怪问题
发表于: 2008-12-25 00:53 9976

[求助]关于驱动对象的driversection及windbg调试的奇怪问题

2008-12-25 00:53
9976
遇上一个奇怪的问题,我现在想根据驱动文件名获取,驱动对象,采用遍历driversection的方法,但现在找到驱动名之后得不到驱动对象

代码如下:

typedef struct _MODULE_ENTRY {
	LIST_ENTRY le_mod;
	DWORD  unknown[4];
	DWORD  base;
	DWORD  driver_start;
	DWORD  unk1;
	UNICODE_STRING driver_Path;
	UNICODE_STRING driver_Name;
	//...
} MODULE_ENTRY, *PMODULE_ENTRY;


MODULE_ENTRY *pPMCurrent,*pPMFirst;

	pPMCurrent=(MODULE_ENTRY*)((DWORD)DriObject + 0x14);
	pPMCurrent =  (MODULE_ENTRY*)pPMCurrent->le_mod.Flink;
	DbgPrint("Driver Name is : %ws\n", pPMCurrent->driver_Name.Buffer);
	pPMCurrent =  (MODULE_ENTRY*)pPMCurrent->le_mod.Blink;
	currentDriObj=((PDRIVER_OBJECT)((DWORD)pPMCurrent - 0x14));

最后得到的currentDriObj和DriObject不是同一个驱动对象,而且currentDriObj好像根本就不是驱动对象的地址,为何?走过去再反过来就不行了

而且自己用windbg调试的时候,用watch查看pPMCurrent时,看不到,出现couldn`t resolve error,感觉这些应该都是小异常,但是就是找不出来,希望知道的指点一下,多谢

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
2
pPMCurrent=(MODULE_ENTRY*)((DWORD)DriObject + 0x14);
应该是
pPMCurrent=(MODULE_ENTRY*)(*(DWORD*)((DWORD)DriObject + 0x14));吧..
2008-12-25 08:23
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[/CODE]多谢,sysnap牛,不过应该不是那的问题,因为这样就没问题:

[CODE]pPMCurrent=(MODULE_ENTRY*)((DWORD)DriObject + 0x14);
pcurrentDriObj=(DRIVER_OBJECT *)((DWORD)pPMCurrent - 0x14);

这样的话,DriObject和pcurrentDriObj就一样,就是同一个驱动对象

但是通过我的试验仍然有以下疑问:

1.
pPMFirst=pPMCurrent;
	DbgPrint("pmfirst: %x\n", pPMFirst);
	DbgPrint("pPMCurrent: %x\n", pPMCurrent);
	pPMCurrent =  (MODULE_ENTRY*)pPMCurrent->le_mod.Flink;
	pPMCurrent =  (MODULE_ENTRY*)pPMCurrent->le_mod.Blink;
	DbgPrint("pmfirst1: %x\n", pPMFirst);
	DbgPrint("pPMCurrent1: %x\n", pPMCurrent);


这里按说先Flink再Blink应该,应该是pPMCurrent不变,但是pPMCurrent变化了,这里不太清楚什么原因?LIST_ENTRY不是双向链表吗?往前走一步再退一步,为何就变了呢?

2.比如我现在知道sysaudio的驱动对象为:SysAudioDriObject
通过
SysAudioPM=(MODULE_ENTRY*)((DWORD)SysAudioDriObject + 0x14);
得到了sysaudio这个驱动对象的SysAudioPM,再通过
pPMCurrent =  (MODULE_ENTRY*)SysAudioPM->le_mod.Flink;
	DbgPrint("Current Driver File Name is: %ws\n",  pPMCurrent->driver_Name.Buffer);

可以显示出sysaudio驱动的驱动文件名为sysaudio.sys

但是下面我采用遍历pPMCurrent时,

for(int i=0;i<200;i++)
	{
		// This works on Windows XP SP1 and Windows 2003.
		if ((pPMCurrent->unk1 != 0x00000000) && (pPMCurrent->driver_Path.Length != 0))
		{
			UNICODE_STRING sysName;
			RtlInitUnicodeString(&sysName,L"sysaudio.sys");
			if(RtlCompareUnicodeString(&pPMCurrent->driver_Name,&sysName,TRUE)==0)
			{
[COLOR="Red"]此处的pPMFirst和SysAudioPM竟然不一样,驱动对象当然也不对,难道一个驱动对象有两个循环的链?[/COLOR]
				DbgPrint("pPMFirst is: %x\n", pPMFirst);
				pcurrentDriObj=(DRIVER_OBJECT *)((DWORD)pPMFirst - 0x14);				
 				DbgPrint("Driverobjectname: %x\n", pcurrentDriObj);
			}
		}
		pPMFirst=pPMCurrent;
		DbgPrint("pPMFirst is: %x\n", pPMFirst);
		pPMCurrent =  (MODULE_ENTRY*)pPMCurrent->le_mod.Flink;
	}


主要就这两个疑问,而且现在的问题是用windbg调试,看不到这些变量的值,符号文件也对的啊
2008-12-25 10:42
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这是windbg调试时的截图:




第一个图的pPMCurrent查看不到值,第二图显示pdb文件也正确啊,为何呢?
上传的附件:
2008-12-25 10:52
0
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
driversection貌似是个_LDR_DATA_TABLE_ENTRY这样的结构
f52K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3&6S2L8X3!0@1K9s2W2D9L8q4)9J5k6i4y4H3j5h3y4W2M7#2)9J5k6h3I4A6N6X3g2Q4x3X3g2U0L8$3#2Q4x3V1k6n7L8r3!0Y4i4K6u0r3j5$3&6K6i4K6t1I4x3@1q4o6c8U0c8q4x3U0S2r3z5o6x3#2y4e0y4o6b7W2)9J5x3e0p5%4x3W2)9J5k6h3g2F1N6s2u0&6
2008-12-25 11:18
0
雪    币: 581
活跃值: (149)
能力值: ( LV12,RANK:600 )
在线值:
发帖
回帖
粉丝
6
PLDR_DATA_TABLE_ENTRY pDriverSection;
        PLDR_DATA_TABLE_ENTRY  pListHead;
       
        pDriverSection = pDriverObject->DriverSection;

        pListHead = (PLDR_DATA_TABLE_ENTRY)pDriverObject->DriverSection;

         pDriverSection = (PLDR_DATA_TABLE_ENTRY)pListHead->InLoadOrderLinks.Flink;

  

        while(pDriverSection != pListHead)
        {
                DbgPrint("0x%x %ws",pDriverSection->DllBase,pDriverSection->FullDllName.Buffer);
               
                pDriverSection = (PLDR_DATA_TABLE_ENTRY)pDriverSection->InLoadOrderLinks.Flink;
        }
2008-12-25 11:19
0
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
楼主看的是Rootkits - Subverting the Windows Kernel?

引用8d9K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4y4E0j5i4c8J5K9i4S2Q4x3X3g2G2M7X3N6Q4x3V1k6T1j5Y4y4Q4x3V1k6J5k6h3q4V1i4K6u0W2M7r3S2H3i4K6y4r3N6r3W2V1i4K6y4p5y4o6M7H3x3g2!0q4y4q4!0n7z5q4!0m8c8q4!0q4z5g2)9&6y4#2!0n7y4q4!0q4y4q4!0n7z5q4)9^5x3q4!0q4y4W2!0m8c8g2!0n7y4g2!0q4z5q4!0m8c8W2)9&6c8l9`.`.
===============================================
现在再回过来看《Rootkits - Subverting the Windows Kernel》第七章,你就会觉得,他们所说的“MODULE_ENTRY”结构纯粹是给狗熊的玉米,因为我Google了所谓的 “MODULE_ENTRY”(DDK、导出符号中均没有这样的东西),它的定义是这样的:
/*MODULE_ENTRY struct*/
typedef struct _MODULE_ENTRY {
    LIST_ENTRY le_mod;
    DWORD unknown[4];
    DWORD base;
    DWORD driver_start;
    DWORD sectionsize;
    UNICODE_STRING driver_Path;
    UNICODE_STRING driver_Name;
} MODULE_ENTRY, *PMODULE_ENTRY;

其实就是一个简化的“_LDR_DATA_TABLE_ENTRY”,搞出这种东西的意义也就是:“熊~ 给你一个玉米,吃去吧,你就别打破沙锅问到底了。”
我们答曰:想的美!
=========================================================

2008-12-25 11:42
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
MODULE_ENTRY应该算是一个简化的_LDR_DATA_TABLE_ENTRY结构

sysnap给的方法也是取出驱动文件名称,但是从_LDR_DATA_TABLE_ENTRY结构要得到驱动对象,还是要自己减去0x14吧,根据驱动加载的基地址,应该不能直接得到驱动对象吧,其实对我上面的问题,我主要是觉得应该也可以,但是结果却和我的期望不是一样的,所以有一些疑问
2008-12-25 12:26
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
对,我是根据《Rootkits - Subverting the Windows Kernel》用的那个结构,怎么了?这个结构有问题吗?

搞出这种东西的意义也就是:“熊~ 给你一个玉米,吃去吧,你就别打破沙锅问到底了。”
我们答曰:想的美!


还有这是什么意思?不太明白,呵呵,就是说这种方法行不通??
2008-12-25 12:33
0
游客
登录 | 注册 方可回帖
返回