首页
社区
课程
招聘
[原创]发一段让我忧闷了很久的代码(win 764位regedit.exe小bug)
发表于: 2013-5-21 19:14 4976

[原创]发一段让我忧闷了很久的代码(win 764位regedit.exe小bug)

2013-5-21 19:14
4976
原因是regedit.exe处理的时候缓冲区不够,导致的越界,下面这段代码能让注册表一打开就崩溃

#include <Windows.h>
#include <Stdio.h>
#include <Tchar.h>

int _tmain(int argc, TCHAR *argv[])
{
	HKEY			hKey;
	WCHAR			szBuf[1024];//当然这里你如果清零的话就没效果了

	lstrcpyW(szBuf, L"计算机\\HKEY_CLASSES_ROOT\\*");//这里可以是任意子健
	if(RegOpenKeyW(HKEY_CURRENT_USER,
		L"Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit", 
		&hKey) == ERROR_SUCCESS)
	{
		RegSetValueExW(hKey, L"LastKey", 0, REG_SZ, (LPBYTE)szBuf, sizeof(szBuf));
		RegCloseKey(hKey);
	}

	return 0;
}

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

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 778
活跃值: (208)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
2
不知道在win8里,微软有没有修复这个bug
2013-5-21 20:21
0
雪    币: 12
活跃值: (613)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这不是微软的错,是你没看MSDN
LONG WINAPI RegSetValueEx(
  __in        HKEY hKey,
  __in_opt    LPCTSTR lpValueName,
  __reserved  DWORD Reserved,
  __in        DWORD dwType,
  __in_opt    const BYTE* lpData,
  __in        DWORD cbData
);

第五个参数的说明是:
lpData
The data to be stored.

For string-based types, such as REG_SZ, the string must be null-terminated. With the REG_MULTI_SZ data type, the string must be terminated with two null characters.

接口已经说得很详细了,你不按套路出牌当然要出问题了。
2013-5-21 20:26
0
雪    币: 778
活跃值: (208)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
4
你试试就知道了,只要你是个以空字符结尾的字符串就行了,你设置的数据是1024,但注册表只显示一个空字符串,其他的数据你读取字符串的时候会读取到的是1024长度,而不是读到一个空字符串,因此这个方法还可以把数据隐藏在字符串结尾的后面。
2013-5-21 20:32
0
雪    币: 12
活跃值: (613)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
没看明白你说的什么,需要注意的是你设置的1024不是字节,而是unicode字符,换算成字节后应该是2048,MSDN上说,设置注册表值的时候使用的是字节,读取失败可能是因为你指定的空间大小不对,看我下面的代码是不是能解决你读取注册表的问题:
#include <Windows.h>
#include <Stdio.h>
#include <Tchar.h>

int _tmain(int argc, TCHAR *argv[])
{
    HKEY      hKey;
    WCHAR      szBuf[1024];//查询结果与这里是否清零无关
    lstrcpyW(szBuf, L"计算机\\HKEY_CLASSES_ROOT\\*");//这里可以是任意子健
    if(RegOpenKeyW(HKEY_CURRENT_USER,
        L"Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\Regedit",
        &hKey) == ERROR_SUCCESS)
    {
        RegSetValueExW(hKey, L"LastKey", 0, REG_SZ, (LPBYTE)szBuf, sizeof(szBuf));
        DWORD dwType;
        DWORD size = 0;
        LONG retVal = RegQueryValueEx(hKey, L"LastKey", 0, &dwType, NULL, &size);
        WCHAR *pszRdBuf = new WCHAR[size/2];
        retVal = RegQueryValueEx(hKey, L"LastKey", 0, &dwType, (LPBYTE)pszRdBuf, &size);
        RegCloseKey(hKey);
    }

    return 0;
}
2013-5-22 11:18
0
雪    币: 382
活跃值: (362)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
6
嗯.确实有问题..栈溢出哦.
2013-5-23 14:13
0
雪    币: 382
活跃值: (362)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
7
regqueryvalueex的时候穿进去的大小是0x800,但是buffer大小却没这么大..MS的人也会犯这种错误??
2013-5-23 14:19
0
游客
登录 | 注册 方可回帖
返回
//