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.exeai.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?