Windows 10 : 命名程序 main.exe 使它们弹出
Windows 10 : naming programs main.exe cause them to show pop up
On windows 10 当我们创建名为 main.exe 的程序或将程序重命名为 main.exe,程序将显示一个弹出窗口,如下所示:
有 2 个不同的弹出窗口无法显示:
-游戏栏一(法英版):
-截图一:
(英文:Win + Alt + PrintScreen 截屏)
我最初是在使用 python 和 cx_freeze、
时发现问题的
我已经在多个程序上对此进行了测试,包括(如上所示)将 notepad++.exe 重命名为 main.exe,每次都会弹出一个窗口在那里,
我们还可以注意到弹出窗口交替出现(弹出一个游戏,然后弹出一个截图,然后弹出一个游戏...)
我运行 windows10通过virtual box,但是如下所述,这个问题也发生在物理机上。
知道这是怎么发生的吗?
注意: BoltClock 也测试了它(在物理机器上),发现在他的机器上这种行为只发生在 "Main.exe" 而,在我的机器上,行为发生了 "main" 的 uppercase/lowercase 分布(即:它适用于 main.exe、Main.exe 甚至 MaIN.exe)
我在周末进行了一些挖掘,发现了超过 2000 个会触发相同行为的特殊 exe 名称,而不仅仅是 main.exe
。
Explorer 有一个名为 BroadcastDVR
的组件(位于 twinui
dll 中),该组件在创建进程时会将可执行属性与 "store" 游戏进行比较并启动GameLauncher.exe
如果有匹配项。
我没能确定比较是在哪里完成的,因为它隐藏在一个 RPC 调用的后面,这是一个需要反转的 PITA。
无论如何,explorer.exe
对以下文件 C:\Users\YOUR_USERNAME\AppData\Local\Microsoft\GamesDVR\KnownGameList.bin
有句柄(C:\Windows\broadcastdvr
中有一个副本),其中列出了所有触发 XBox 记录器弹出窗口的特殊可执行文件。您可以在此处查看 main.exe
条目(条目 #1007):
我写了一个 010 模板文件来解析条目列表,它在我的电脑上有 2089 个条目。从我通过反转二进制文件看到的,有三种类型的条目:
"simple" 只有可执行文件名称匹配的一个。
例如:main.exe
或 ai.exe
更复杂的是,可执行文件名称与存储路径的匹配必须包含一些字符串。
例如:acu.exe
必须位于 Assassin's Creed Unity
.
的子文件夹中
- 有些条目有额外的字符串可以匹配,但我还没有找到如何为它们触发游戏 DVR 弹出窗口。
注意:Win32 子系统不区分大小写,因此可执行文件名称的大小写无关紧要。
模板在这里(you can install 010 Editor from here,我觉得有评估期):
typedef struct {
BYTE Reserved[0x300];
}HEADER;
typedef struct {
WORD ByteLen;
BYTE RawString[ByteLen];
//local string sName=ReadWString(RawString);
} 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;
// Executable game name
GAME_WSTR GameName <fgcolor=cLtBlue>;
// Optional magic
if (ReadUShort() == 0xca54)
WORD OptReserved;
// Optional structs based on switch values
WORD AdditionalNamesCount;
WORD SwitchOption2;
// Additional names (probably like a hint).
local int i =0;
for (i = 0; i < AdditionalNamesCount; i++){
OPTION_STR Option;
if (ReadUShort() == 0xca54)
WORD OptReserved;
}
// Look for a magic
local int Find20h = 0;
while(!Find20h){
Find20h = (0x20 == ReadByte());
BYTE Res;
}
GAME_WSTR GameId;
WORD Reserved;
// Sometimes there is an additionnal name
// sometimes not. I check the current entry
// is at less than the EntrySize declared.
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("Entry : %s -> %d.\n",ReadGameName(Entry) ,Entry.AdditionalNamesCount);
}
Printf("Parse KnownGameList.bin End.\n");
如果该行为让您烦恼,您始终可以通过将 ShowStartup
注册表项设置为 0 来全局禁用它。它位于 HKEY_CURRENT_USER\Software\Microsoft\GameBar
.
我还没有找到如何专门禁用可执行文件触发它的方法,但我可能只需查看 twinui
.
中的机器代码就可以了
安全问题
我们有一种情况,我们可以通过更改可执行文件的名称来启动进程。那可能很危险。
游戏启动器命令行位于HKEY_LOCAL_MACHINE\Software\Microsoft\GameOverlay
,需要管理员级别写入,所以这里不可能绕过UAC或Integrity级别。
(我没有从 msdn 中找到权威的 link,所以这里有一个 SO 答案来确认它:What registry access can you get without Administrator privleges?)
On windows 10 当我们创建名为 main.exe 的程序或将程序重命名为 main.exe,程序将显示一个弹出窗口,如下所示:
有 2 个不同的弹出窗口无法显示:
-游戏栏一(法英版):
-截图一:
(英文:Win + Alt + PrintScreen 截屏)
我最初是在使用 python 和 cx_freeze、
时发现问题的我已经在多个程序上对此进行了测试,包括(如上所示)将 notepad++.exe 重命名为 main.exe,每次都会弹出一个窗口在那里,
我们还可以注意到弹出窗口交替出现(弹出一个游戏,然后弹出一个截图,然后弹出一个游戏...)
我运行 windows10通过virtual box,但是如下所述,这个问题也发生在物理机上。
知道这是怎么发生的吗?
注意: BoltClock 也测试了它(在物理机器上),发现在他的机器上这种行为只发生在 "Main.exe" 而,在我的机器上,行为发生了 "main" 的 uppercase/lowercase 分布(即:它适用于 main.exe、Main.exe 甚至 MaIN.exe)
我在周末进行了一些挖掘,发现了超过 2000 个会触发相同行为的特殊 exe 名称,而不仅仅是 main.exe
。
Explorer 有一个名为 BroadcastDVR
的组件(位于 twinui
dll 中),该组件在创建进程时会将可执行属性与 "store" 游戏进行比较并启动GameLauncher.exe
如果有匹配项。
我没能确定比较是在哪里完成的,因为它隐藏在一个 RPC 调用的后面,这是一个需要反转的 PITA。
无论如何,explorer.exe
对以下文件 C:\Users\YOUR_USERNAME\AppData\Local\Microsoft\GamesDVR\KnownGameList.bin
有句柄(C:\Windows\broadcastdvr
中有一个副本),其中列出了所有触发 XBox 记录器弹出窗口的特殊可执行文件。您可以在此处查看 main.exe
条目(条目 #1007):
我写了一个 010 模板文件来解析条目列表,它在我的电脑上有 2089 个条目。从我通过反转二进制文件看到的,有三种类型的条目:
"simple" 只有可执行文件名称匹配的一个。 例如:
main.exe
或ai.exe
更复杂的是,可执行文件名称与存储路径的匹配必须包含一些字符串。 例如:
acu.exe
必须位于Assassin's Creed Unity
. 的子文件夹中
- 有些条目有额外的字符串可以匹配,但我还没有找到如何为它们触发游戏 DVR 弹出窗口。
注意:Win32 子系统不区分大小写,因此可执行文件名称的大小写无关紧要。
模板在这里(you can install 010 Editor from here,我觉得有评估期):
typedef struct {
BYTE Reserved[0x300];
}HEADER;
typedef struct {
WORD ByteLen;
BYTE RawString[ByteLen];
//local string sName=ReadWString(RawString);
} 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;
// Executable game name
GAME_WSTR GameName <fgcolor=cLtBlue>;
// Optional magic
if (ReadUShort() == 0xca54)
WORD OptReserved;
// Optional structs based on switch values
WORD AdditionalNamesCount;
WORD SwitchOption2;
// Additional names (probably like a hint).
local int i =0;
for (i = 0; i < AdditionalNamesCount; i++){
OPTION_STR Option;
if (ReadUShort() == 0xca54)
WORD OptReserved;
}
// Look for a magic
local int Find20h = 0;
while(!Find20h){
Find20h = (0x20 == ReadByte());
BYTE Res;
}
GAME_WSTR GameId;
WORD Reserved;
// Sometimes there is an additionnal name
// sometimes not. I check the current entry
// is at less than the EntrySize declared.
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("Entry : %s -> %d.\n",ReadGameName(Entry) ,Entry.AdditionalNamesCount);
}
Printf("Parse KnownGameList.bin End.\n");
如果该行为让您烦恼,您始终可以通过将 ShowStartup
注册表项设置为 0 来全局禁用它。它位于 HKEY_CURRENT_USER\Software\Microsoft\GameBar
.
我还没有找到如何专门禁用可执行文件触发它的方法,但我可能只需查看 twinui
.
安全问题
我们有一种情况,我们可以通过更改可执行文件的名称来启动进程。那可能很危险。
游戏启动器命令行位于HKEY_LOCAL_MACHINE\Software\Microsoft\GameOverlay
,需要管理员级别写入,所以这里不可能绕过UAC或Integrity级别。
(我没有从 msdn 中找到权威的 link,所以这里有一个 SO 答案来确认它:What registry access can you get without Administrator privleges?)