私は週末にいくつかの調査を行いました。 main.exe
だけでなく、同じ動作を引き起こします。
Explorerは、プロセス作成時に、ゲームの「店」に対して実行特性を比較し、一致がある場合GameLauncher.exe
を起動する(twinui
DLLである)BroadcastDVR
と呼ばれる成分を有します。
私はRPC呼び出しの後ろに隠れているので、比較が行われた場所を特定することはできませんでした。これは逆行するPITAです。
とにかく、explorer.exe
は、次のファイルC:\Users\YOUR_USERNAME\AppData\Local\Microsoft\GamesDVR\KnownGameList.bin
のハンドルを持っているXboxのレコーダーのポップアップをトリガーするすべての特別な実行ファイルを一覧表示する(C:\Windows\broadcastdvr
でコピーがあります)。私は、エントリのリストを解析するために010テンプレートファイルを書いて、それは私のコンピュータ上の2089件のエントリが付属しています

:あなたはここにmain.exe
エントリ(エントリ#1007)を参照してくださいすることができます。
NB:Win32サブシステムは大文字と小文字を区別しないため、実行可能ファイル名の大文字と小文字は区別されません。あなたは、あなたが常にグローバルで0にShowStartup
レジストリキーを設定することで、それを無効にすることができ、その動作を悩ますが、それがある場合
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");
:ここ
がテンプレートである(
you can install 010 Editor from here、私が考える評価期間があります)
HKEY_CURRENT_USER\Software\Microsoft\GameBar
にあります。
具体的には実行可能ファイルを無効にする方法が見つかりませんでしたが、twinui
のマシンコードを調べるだけで可能です。
セキュリティが問題
私たちはただ実行可能ファイルの名前を変更することで、プロセスを起動することができ、状況があります。それは危険かもしれません。
ゲーム起動ツールのコマンドラインは、管理者レベルの書き込みが必要なHKEY_LOCAL_MACHINE\Software\Microsoft\GameOverlay
にありますので、ここではUACまたは完全性レベルのバイパスはできません。
(私はSOにそれを確認答えるので、ここでは、MSDNからの権威のリンクが見つかりませんでした:What registry access can you get without Administrator privleges?)
これは面白いです.....私はそれをテストすることができますので、私は本当にあなたのプログラムを見てみたいです – danidee
Razer Game BoosterまたはCortexがインストールされていますか? –
私はRazer Game Boosterをインストールしていませんが、Cortexの場合はわかりませんが、少なくとも私はそれを見つけることができません。 –