我在周末进行了一些调查,发现有超过2000个特殊exe名称会触发相同的行为,而不仅仅是
main.exe
。
资源管理器有一个名为
BroadcastDVR
的组件(位于
twinui
dll中),在进程创建时,它会将可执行文件属性与游戏的“存储”进行比较,并在匹配时启动
GameLauncher.exe
。
我还没有找到比较是在哪里完成的,因为它被隐藏在RPC调用后面,这很难逆向。
无论如何,
explorer.exe
对以下文件
C:\Users\YOUR_USERNAME\AppData\Local\Microsoft\GamesDVR\KnownGameList.bin
(
C:\Windows\broadcastdvr
中有一份副本)有一个句柄,其中列出了所有触发XBox录制弹出窗口的特殊可执行文件。你可以在这里看到
main.exe
条目(第1007条)。
![enter image description here](https://istack.dev59.com/my9gY.webp)
我已经编写了一个010模板文件来解析条目列表,在我的电脑上有2089个条目。从反转二进制文件所见,有三种类型的条目:
NB:Win32子系统不区分大小写,因此可执行文件名的大小写不重要。
这是模板(您可以从这里安装010 Editor,我想有一个评估期):
typedef struct {
BYTE Reserved[0x300];
}HEADER;
typedef struct {
WORD ByteLen;
BYTE RawString[ByteLen];
} GAME_WSTR <read=ReadGame>;
typedef struct {
DWORD Reserved;
DWORD ByteLen;
BYTE RawString[ByteLen] <fgcolor=cLtRed>;
} OPTION_STR <read=ReadOption>;
typedef struct {
local int StartAddr = FTell();
DWORD EntrySize;
GAME_WSTR GameName <fgcolor=cLtBlue>;
if (ReadUShort() == 0xca54)
WORD OptReserved;
WORD AdditionalNamesCount;
WORD SwitchOption2;
local int i =0;
for (i = 0; i < AdditionalNamesCount; i++){
OPTION_STR Option;
if (ReadUShort() == 0xca54)
WORD OptReserved;
}
local int Find20h = 0;
while(!Find20h){
Find20h = (0x20 == ReadByte());
BYTE Res;
}
GAME_WSTR GameId;
WORD Reserved;
if (FTell()-StartAddr < EntrySize)
{
switch (SwitchOption2)
{
case 3:
OPTION_STR Option3;
break;
case 2:
OPTION_STR Option2;
case 1:
break;
}
}
} ENTRY <read=ReadGameName>;
string ReadOption(OPTION_STR &Game)
{
local wstring GameName = L"";
local int i ;
for (i= 0; 2*i < Game.ByteLen; i++){
WStrcat(GameName, Game.RawString[2*i]);
}
return WStringToString(GameName);
}
string ReadGame(GAME_WSTR &Game)
{
local wstring GameName = L"";
local int i ;
for (i= 0; 2*i < Game.ByteLen; i++){
WStrcat(GameName, Game.RawString[2*i]);
}
return WStringToString(GameName);
}
string ReadGameName(ENTRY &Entry)
{
local string GameName = ReadGame(Entry.GameName);
local string OptionGameName = "";
if (Entry.AdditionalNamesCount)
OptionGameName = " : "+ReadOption(Entry.Option);
return GameName + OptionGameName;
}
LittleEndian();
Printf("Parse KnownGameList.bin Begin.\n");
HEADER UnkwownHeader <bgcolor=cLtGray>;
while(1)
{
ENTRY Entry <bgcolor=cLtPurple>;
}
Printf("Parse KnownGameList.bin End.\n");
如果这种行为让你感到烦恼,你可以通过将
ShowStartup
注册表键设置为0来全局禁用它。它位于
HKEY_CURRENT_USER\Software\Microsoft\GameBar
中。
我还没有找到如何禁用特定可执行文件触发它的方法,但可能只需查看
twinui
中的机器代码即可实现。
安全问题
我们面临的情况是,仅通过更改可执行文件的名称就可以启动进程。这可能是危险的。
游戏启动器命令行位于
HKEY_LOCAL_MACHINE\Software\Microsoft\GameOverlay
中,需要管理员级别才能写入,因此在这里没有UAC或完整性级别绕过可能。
(我没有找到来自msdn的权威链接,所以这里是一个SO答案确认它:
What registry access can you get without Administrator privleges?)