首页
社区
课程
招聘
[讨论] WTSEnumerateSessionsExA 当用户名为中文时不能正确获取
2023-2-28 14:51 5050

[讨论] WTSEnumerateSessionsExA 当用户名为中文时不能正确获取

2023-2-28 14:51
5050


WTSEnumerateSessionsExA 函数 遇到用户名为中文时获取不正确的名称
WTSEnumerateSessionsExW 函数 获取用户名是正确的
反汇编



STRSAFEAPI StringCchLengthW(
[in] STRSAFE_PCNZWCH psz,
[in] size_t cchMax,
[out] size_t *pcchLength
);
确定字符串是否超过指定的长度(以字符为单位)。
[in] psz
要检查其长度的字符串。
[in] cchMax
psz 中允许的最大字符数,包括终止 null 字符。 此值不能超过
[out] pcchLength
psz 中的字符数,不包括终止 null 字符。 仅当 pcch 不 为 NULL 且函数成功时,此值才有效
StringCchLengthW获取的是字符长度 当遇见中文时 字符串长度不等于字节长度 出现错误


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞1
打赏
分享
最新回复 (13)
雪    币: 6113
活跃值: (4016)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
黑洛 1 2023-2-28 15:05
2
0
你在说什么,A底层也是调用W,windows底层是unicode,编码的问题非要赖api
雪    币: 630
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
yuechu 2023-2-28 16:39
3
0
黑洛 你在说什么,A底层也是调用W,windows底层是unicode,编码的问题非要赖api
A底层是W,但A不兼容中文
雪    币: 4119
活跃值: (1500)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Boring勇哥 2023-3-1 09:17
4
0

确实是api实现的问题,开发过程中没有考虑一个字符占多个字节的情况,无论是中文还是日文韩文都存在这个情况。StringCchLength输出的长度是字符的个数,而不是保存字符串所需的字节数。

雪    币: 6113
活跃值: (4016)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
黑洛 1 2023-3-1 15:04
5
0
Boring勇哥 确实是api实现的问题,开发过程中没有考虑一个字符占多个字节的情况,无论是中文还是日文韩文都存在这个情况。StringCchLength输出的长度是字符的个数,而不是保存字符串所需的字节数。
那有没有可能你把unicode改成多字节字节集就没有问题了呢?
雪    币: 4438
活跃值: (2304)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Foodie 2023-3-1 16:30
6
0


最后于 2023-3-1 16:46 被Foodie编辑 ,原因: 。
雪    币: 4438
活跃值: (2304)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Foodie 2023-3-1 16:56
7
0
Boring勇哥 确实是api实现的问题,开发过程中没有考虑一个字符占多个字节的情况,无论是中文还是日文韩文都存在这个情况。StringCchLength输出的长度是字符的个数,而不是保存字符串所需的字节数。
确实是,把 StringCchLengthW 换成 RtlUnicodeToMultiByteSize 就可以了。
雪    币: 4119
活跃值: (1500)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Boring勇哥 2023-3-1 18:51
8
0
黑洛 那有没有可能你把unicode改成多字节字节集就没有问题了呢?

建议你看看WTSEnumerateSessionsExA的反汇编,自己调用一下StringCchLengthW和RtlUnicodeToMultiByteN试试。

我把项目的字符集设置成了多字节,但它仍然不工作。

最后于 2023-3-1 18:52 被Boring勇哥编辑 ,原因:
雪    币: 3673
活跃值: (3693)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Mxixihaha 2023-3-1 22:38
9
0
	if (S_OK == StringCchLengthW(wcs , STRSAFE_MAX_CCH, &size))
	{
		PCHAR buf = (PCHAR)LocalAlloc(0x40 , size + 1);
		ULONG newSize;
		NTSTATUS status = RtlUnicodeToMultiByteN(buf,size+1,&newSize,wcs,sizeof(wcs));
		printf("%s\n",buf);
		LocalFree(buf);
	}


修改为


if (S_OK == StringCchLengthW(wcs , STRSAFE_MAX_CCH, &size))

{

PCHAR buf = (PCHAR)LocalAlloc(0x40 , size*2 + 1);     // 1 UNICODE = 2 x CHAR

ULONG newSize;

NTSTATUS status = RtlUnicodeToMultiByteN(buf,size*2+1,&newSize,wcs,sizeof(wcs));

printf("%s\n",buf);

LocalFree(buf);

}


雪    币: 204
活跃值: (714)
能力值: ( LV9,RANK:195 )
在线值:
发帖
回帖
粉丝
palkiver 2023-3-2 14:32
10
0

。。。感觉楼主没有进行过系统化的开发训练,这是windows开发的常识。
字符串相关的API结尾带A说明本接口只支持解析ASCII码,W结尾说明支持解析UNICODE码。

windows的API命名除了极少数是历史原因导致的无法更改名称,只能将错就错了,99.9%的API名称的前缀后缀都是有标准含义的。

最后于 2023-3-2 14:36 被palkiver编辑 ,原因:
雪    币: 4119
活跃值: (1500)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Boring勇哥 2023-3-2 17:21
11
0
palkiver 。。。感觉楼主没有进行过系统化的开发训练,这是windows开发的常识。字符串相关的API结尾带A说明本接口只支持解析ASCII码,W结尾说明支持解析UNICODE码。windows的API命名除了极 ...
你可能搞错了。win32api中A结尾表示字符编码为ansi,而非ascii。而ansi是支持中文的。
参考:https://en.wikipedia.org/wiki/Chinese_Character_Code_for_Information_Interchange
https://learn.microsoft.com/en-us/windows/win32/intl/unicode-in-the-windows-api
雪    币: 6113
活跃值: (4016)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
黑洛 1 2023-3-2 18:01
12
0
Boring勇哥 你可能搞错了。win32api中A结尾表示字符编码为ansi,而非ascii。而ansi是支持中文的。 参考:https://en.wikipedia.org/wiki/Chinese_Charac ...
看过了,系统实现确实有问题
雪    币: 204
活跃值: (714)
能力值: ( LV9,RANK:195 )
在线值:
发帖
回帖
粉丝
palkiver 2023-3-2 18:23
13
0
Boring勇哥 你可能搞错了。win32api中A结尾表示字符编码为ansi,而非ascii。而ansi是支持中文的。 参考:https://en.wikipedia.org/wiki/Chinese_Charac ...
我没搞错,你非要说这么严格的话,那就严格来说ansi在不同的操作系统中以及不同国家代表着不同的编码方式,开发人员很多时候不能假定用户环境,最好的办法就是将A理解为ASCII,非ASCII直接上UNICODE,这是最保险的方式。
雪    币: 4119
活跃值: (1500)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
Boring勇哥 2023-3-2 19:23
14
0
palkiver 我没搞错,你非要说这么严格的话,那就严格来说ansi在不同的操作系统中以及不同国家代表着不同的编码方式,开发人员很多时候不能假定用户环境,最好的办法就是将A理解为ASCII,非ASCII直接上UNIC ...
你说的对,使用宽字符是一个好的做法,微软也推荐使用。
游客
登录 | 注册 方可回帖
返回