在Windows 10上创建名为 main.exe 的程序或将程序重命名为 main.exe 时,程序将显示如下所示的弹出窗口:< / p>
有两种不同的弹出窗口可以显示:
- 游戏栏一(法语和英语版):
- 屏幕截图一:
(英文:按Win + Alt + PrintScreen截图)
我最初在使用python和cx_freeze时发现了这个问题,
我已经在多个程序上测试了这个,包括(如上所示)将notepad ++。exe重命名为main.exe ,每次都有一个弹出窗口,
我们还可以注意到弹出窗口会出现(一个弹出游戏,然后弹出一个sreenshot,然后弹出一个游戏......)
我通过虚拟机框运行windows10,但如下所述,问题也发生在物理机器上。
关于这是怎么发生的任何想法?
注意: BoltClock也测试了它(在物理机器上)并发现,在他的机器上,这种行为只发生在&#34; Main.exe&#34;而在我的机器上,行为发生的任何可能是&#34; main&#34;的大写/小写分布。 (IE:它适用于main.exe,Main.exe甚至MaIN.exe)
答案 0 :(得分:3)
我周末做了一些挖掘工作,我发现了超过2000个特殊的exe名称会引发相同的行为,而不只是main.exe
。
Explorer有一个名为BroadcastDVR
的组件(位于twinui
dll中),在创建进程时,它会将可执行属性与游戏的“商店”进行比较,并将启动{{1}如果有匹配。
我没有设法确定比较的位置,因为它隐藏在RPC调用之后,这是一个要反转的PITA。
无论如何,GameLauncher.exe
有一个处理以下文件explorer.exe
(C:\Users\YOUR_USERNAME\AppData\Local\Microsoft\GamesDVR\KnownGameList.bin
中有一个副本),其中列出了触发XBox记录器弹出窗口的所有特殊可执行文件。您可以在此处看到C:\Windows\broadcastdvr
条目(条目#1007):
我写了一个010模板文件来解析条目列表,它在我的计算机上有2089个条目。从我通过反转二进制文件看到的,有三种类型的条目:
只有可执行文件名匹配的“简单”文件。
例如:main.exe
或main.exe
更复杂的一个,在可执行文件名和存储exe的路径上匹配必须包含一些字符串。
例如:ai.exe
必须位于acu.exe
的子文件夹中。
注意:Win32子系统不区分大小写,因此可执行文件的大小写无关紧要。
这是模板(you can install 010 Editor from here,我认为有一个评估期):
Assassin's Creed Unity
如果该行为让您烦恼,您可以通过将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");
注册表项设置为0来全局禁用它。它位于ShowStartup
。
我还没有找到如何通过触发它来专门禁用可执行文件,但我可以通过查看HKEY_CURRENT_USER\Software\Microsoft\GameBar
中的机器代码来实现。
我们可以通过更改可执行文件的名称来启动进程。那可能很危险。
游戏启动器命令行位于twinui
,需要管理员级别才能写入,因此此处不存在UAC或完整性级别旁路。
(我没有找到来自msdn的授权链接,所以这里有一个SO答案确认它:What registry access can you get without Administrator privleges?)