首页
社区
课程
招聘
[讨论]sfilter中的一段代码看不明白
发表于: 2011-3-3 16:15 4657

[讨论]sfilter中的一段代码看不明白

2011-3-3 16:15
4657
交代一些结构体:
typedef struct _GET_NAME_CONTROL {
    PCHAR allocatedBuffer;
    CHAR smallBuffer[256];   
} GET_NAME_CONTROL, *PGET_NAME_CONTROL;

typedef struct _OBJECT_NAME_INFORMATION {
  UNICODE_STRING Name;
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;

typedef struct _LSA_UNICODE_STRING {
  USHORT Length;
  USHORT MaximumLength;
  PWSTR  Buffer;
} LSA_UNICODE_STRING, *PLSA_UNICODE_STRING, UNICODE_STRING, *PUNICODE_STRING;

PGET_NAME_CONTROL NameControl;

POBJECT_NAME_INFORMATION nameInfo = (POBJECT_NAME_INFORMATION)NameControl->smallBuffer;
这样就是用一个UNICODE_STRING的指针指向了一个CHAR数组,这样怎么可以的?

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

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 49
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
RtlInitEmptyUnicodeString(
                (PUNICODE_STRING)&NameControl->smallBuffer,
                (PWCHAR)(NameControl->smallBuffer + sizeof(UNICODE_STRING)),
                (USHORT)(sizeof(NameControl->smallBuffer) - sizeof(UNICODE_STRING)) );

            return (PUNICODE_STRING)&NameControl->smallBuffer;

紧接着他就是吧256的BUFFER当做UNICODE看的
2011-3-5 00:21
0
雪    币: 195
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
但是毕竟UNICODE_STRING第一、二个成员是USHORT 的类型,这样赋值,并不会赋进Buffer中。
2011-3-6 13:46
0
雪    币: 49
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
也许他有自己的打算
并没打算把CHAR BUFFER的起始地址当做UNICODE的buffer地址
你尝试WINDBG 调试下  SMALLBUFFER的构成是什么样子并跟踪下 是怎么形成的就清晰多了
2011-3-6 14:10
0
雪    币: 195
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感觉想sfilter这样的代码是不会吧CHAR[XX] 只当个指针来用的 否则他一定会声明指针类型。很纠结。。。
2011-3-8 12:50
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
完全不用纠结,根本原因是OBJECT_NAME_INFORMATION这个东西,操作系统在处理的时候不太合常规。
正常情况下你提供一个UNICODE_STRING结构,然后系统会把返回数据放在UNICODE_STRING的Buffer成员指向的缓冲区里,通常都是这样的。
但是,这个ObQueryNameString在处理传入的缓冲区时,是把这个缓冲区当作一个整体,以下是wrk中的部分代码,ObjectNameInfo就是传入的缓冲区参数,类型是POBJECT_NAME_INFORMATION。
OriginalBuffer = (PWCH)((PCH)ObjectNameInfo + sizeof( OBJECT_NAME_INFORMATION ));
...
ObjectNameInfo->Name.MaximumLength = (USHORT)BufferLength;
ObjectNameInfo->Name.Length = (USHORT)(BufferLength - sizeof( UNICODE_NULL ));
ObjectNameInfo->Name.Buffer = OriginalBuffer;
...
 RtlMoveMemory(OriginalBuffer, StringBuffer, BufferLength);

注意观察系统对ObjectNameInfo的成员的初始化,就知道这个buffer到底是怎么用的了。系统是把这个buffer作为一个整体,然后在buffer开头保留一个UNICODE_STRING结构,然后把剩下的部分作为了这个UNICODE_STRING的Buffer,也就是说,你只要提供一块足够的缓冲区就行了,系统会自已把这个结构初始化成一个UNICODE_STRING,调用完成后,ObjectNameInfo->Name.Buffer里就是你想要的内容,而不需要你为这个UNICODE_STRING再额外申请缓冲区。

可能会有很多人自己先填充一个UNICODE_STRING结构,自己提供这个结构里的Buffer,这样反而会出错,也许这算是一个特例吧,使用ObQueryNameString/ZwQueryObject查询对象名称时注意就行了,不清楚的自己调试或者看Wrk~~
2011-3-9 12:55
0
雪    币: 195
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
多谢 catface 和 achillis
achillis讲了ObQueryNameString缓冲区的知识,的确收益匪浅。
经过我反复阅读代码发现CHAR smallBuffer[256]的确只是起到了一个指针的作用,指向一个UNICODE。这样也许就是在填充的时候不在分配缓冲区而简化操作的用途。
2011-3-10 11:15
0
游客
登录 | 注册 方可回帖
返回
//