首页
社区
课程
招聘
[原创]Windows XP /2003 /VISTA / WIN7所有版本全补丁存在的一个BUG
发表于: 2009-3-25 20:08 7304

[原创]Windows XP /2003 /VISTA / WIN7所有版本全补丁存在的一个BUG

2009-3-25 20:08
7304

打开注册表编辑器,选择任意一个键,选择导入,文件类型为所有文件,导入一个非REG格式的文件

此时会提示这个文件不是一个支持的格式

接着,注册表编辑的导出文本文件功能将出问题,选择任意键,选择导出,文件类型选择"文本文件”,此时本来是 导出操作,但是注册表编辑器却会提示 无法导入,这个文件不是一个支持的格式。但是实际上这个文件却导出成功了~

BUG分析:

RegEdit中的导入导出等功能使用g_FileErrorStringID来标志错误号,实际会用LoadStringW来根据StringID来显示指定的错误号,在函数RegEdit_ExportRegFile中,根据用户选择不同的保存格式,会分别调用ExportRegedit32File , Export_SaveAsSubTree , ExportWin40RegFile , ExportWinNT50RegFile

各个函数进入前应将g_FileErrorStringID设为0X88,如果有出错,再设置g_FileErrorStringID为错误文字的StringId,再这些函数调用完成后,如果判断g_FileErrorStringID为有效的错误ID,则弹框提示

代码如下:

int __stdcall RegEdit_ExportRegFile(int a1, int a2, char lpFileName, unsigned __int16 *lpsz)
{
char v4;

const void *v5;  

const WCHAR *v6;

int v7;   char v8;
int result;

v4 = lpFileName;
if ( !lpFileName )
{
    v8 = lpFileName;
    v7 = 16;
    v6 = (const WCHAR *)16;
    v5 = (const void *)43;
    return InternalMessageBox(g_hInstance, a1, v5, v6, v7, v8);
}
switch ( RegSaveType )
{
    case 2:
      ExportRegedt32File((LPCWSTR)lpFileName, lpsz);
      break;
    case 3:
      RegEdit_SaveAsSubtree((LPCWSTR)lpFileName, (int)lpsz);
      break;
    case 4:
      ExportWin40RegFile((LPCWSTR)lpFileName, lpsz);
      break;
    default:
      ExportWinNT50RegFile((LPCWSTR)lpFileName, lpsz);
      break;
}
result = g_FileErrorStringID;
if ( g_FileErrorStringID != 0x88 && g_FileErrorStringID != 0xE4 )
{
    v8 = v4;
    v7 = 16;
    v6 = (const WCHAR *)16;
    v5 = (const void *)(unsigned __int16)g_FileErrorStringID;
    return InternalMessageBox(g_hInstance, a1, v5, v6, v7, v8);
}
return result;
}

但是Export_SaveAsSubTree ,也就是保存为文本文件的这个子函数中,没有预先设置g_FileErrorStringID ,这样,上次导入/导出出错后,这个函数无论成功与否都会使用上次导入失败的StringID,最终导致了显示了错误的提示信息

代码如下:

int __stdcall RegEdit_SaveAsSubtree(LPCWSTR NumberOfBytesWritten, int a2)
{
HLOCAL v2;
HANDLE v3;
void *v4;

v2 = LocalAlloc(0x40u, 0x4000u);
SavedSubTreeTextContext = v2;
if ( v2 )
{
    *(_WORD *)v2 = 0xFFFFFEFFu;
    dword_101CB30 = 0x2000u;
    dword_101CB34 = 1;
    s_PrintIo = 1;
    dword_101CB04 = 0;
    dword_101CB38 = (int)L"\r\n";
    RegPrintSubtree();
    v3 = CreateFileW(NumberOfBytesWritten, 0x40000000u, 0, 0, 2u, 0x80u, 0);
    v4 = v3;
    if ( v3 == (HANDLE)-1 )
    {
      dword_101CB04 = 138;
    }
    else
    {
      NumberOfBytesWritten = 0;
      if ( !WriteFile(v3, SavedSubTreeTextContext, 2 * dword_101CB34, (DWORD *)&NumberOfBytesWritten, 0) )
        dword_101CB04 = 141;
      CloseHandle(v4);
    }
    LocalFree(SavedSubTreeTextContext);
}
return PrintToSubTreeError(dword_101CB04);
}


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (9)
雪    币: 183
活跃值: (282)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
-_-!   -_-!
2009-3-25 20:21
0
雪    币: 382
活跃值: (352)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
3
先试试看 __
2009-3-25 20:22
0
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
SF和板凳都没了,就坐地板上学习吧@_@
顶王小姐一个。
2009-3-25 21:14
0
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
强大的IDA,强大的F5,强大的王小姐
2009-3-25 21:15
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
6
太强大了~~
2009-3-25 21:57
0
雪    币: 200
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
强大啊!!!这都能发现。
2009-3-27 08:24
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我去测试一下
2009-3-28 01:57
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
郑文彬什么时候成王小姐了
2009-3-28 17:51
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
膜拜王小姐和偶像MJJ
2009-3-28 18:17
0
游客
登录 | 注册 方可回帖
返回
//