昨日、親友のシャオ リン (WeChat 公開アカウント: シャオ リン コーディング) から、彼のコンピューターが実際にログインできることを偶然知りました。同時に 2 つの WeChat ID。
携帯電話で WeChat を起動します。Huawei や Xiaomi などの携帯電話システムがこれをサポートしていることは知っています。しかし、Windows システムを実行しているコンピュータで 2 つの WeChat を起動するにはどうすればよいでしょうか? これは本当に懸念を呼び起こしました。興味深いです。
Xiao Lin は、これを実行してバッチ プロセスを作成したと私に言いました:
<code>start D:\WeChat\WeChat.exe<br>start D:\WeChat\WeChat.exe</code>
次に、バッチ ファイルを直接ダブルクリックして 2 つの WeChat プロセスを開始しました。
試してみたら、本当にその通りでした!
次に別の行を追加すると、さらに 3 行を開始できました:
その後、インターネットで検索してみると、このトリックは昔、他の人が使っていたことがわかり、まるで火星にいるような気分になりました。しかし、なぜこのようにしてさらに多くの扉を開けることができるのでしょうか?その謎を知りたいです。
ヒント: テクニカル分析の部分に興味がない場合は、スキップして最後の真実の部分に直接進んでください。
通常の状況では、WeChat アイコンを直接ダブルクリックして開始できます。後で開始されるプロセスにより、グローバル シングルトン モード チェックが実行されます。プロセスがすでに存在する場合は、対応するプロセスの WeChat ウィンドウを直接アクティブ化し、デスクトップの前面に配置してから終了します。
しかし、なぜ上記の方法を使用して両方を開始できるのでしょうか?確認してみましょう。
まず、上記の WeChat の単一インスタンスがどのように実装されているかを分析しましょう。
Windows プラットフォーム アプリケーションの開発を行ったことのある友人はこれに精通しているかもしれません。通常、プロセスの開始後に、グローバルに一意な名前を持つミューテックスが作成されます。作成が成功すると、通常どおりに起動します。作成に失敗した場合は、ミューテックスが同じであるかどうかが判断されます。リペラはすでに存在します。すでに存在する場合は、対応するプログラムが以前に起動されたことを意味します。
この推測により、ツール procexp を使用して、WeChat プロセスによって開かれたすべてのカーネル オブジェクトをチェックし、ミューテックス部分を見つけます:
案の定、_WeChat_App_Instance_Identity_Mutex_Name という名前のミューテックスがあります。この名前から、これは間違いなく WeChat のシングルトン モードに関連していると推測できます。
次に、アーティファクト APIMonitor を起動します。これは、指定されたプロセスの API 呼び出しを監視するのに役立ち、2 つの Windows API 関数 CreateMutex と GetLastError を確認します。 WeChat がすでに実行されている場合は、このツールを使用して別の WeChat プロセスを開始し、関数呼び出しを確認します:
この名前でミューテックスを作成した後、GetLastError 関数が呼び出され、0x000000b7 が返されたことがわかります。その意味についてはマニュアルを確認してください:
はすでに存在することを意味します。
この CreateMutex 呼び出しのスタックを見て、コードがこのグローバル ミューテックスを作成している場所を確認してみましょう:
スタックから、呼び出しが WeChat ディレクトリ内のダイナミック ライブラリ WeChatWin.dll から行われていることがわかります。特定の場所は、オフセット 0x8e271b にある前の命令です。
次に、成果物中の成果物、有名な逆アセンブリ ソフトウェア IDA を紹介します。この男は、x86、x64、ARM、MIPS などのプロセッサ アーキテクチャと、Windows、Linux、Android、MacOS、JVM のプログラム解析をサポートしています。さまざまなシステムプラットフォーム上で。
IDA を使用して WeChatWin.dll ファイルを開き、オフセット 0x8e271b を見つけます。
#上の図に示すように、ミューテックスを作成するアクションは、次の場所で発生します。関数sub_108e26d0。
上位層は、それを呼び出す sub_108e2660 関数です:
上の図は、ミューテックス作成後の判定ロジックを示しています。
sub_108e26d0 の戻り値が 0 の場合、エラーがないことを意味し、現在の関数は直接0を返します。
如果sub_108e26d0的返回值不为0,表示出现了错误,则依次判断 WeChatMainWndForPC和 WeChatLoginWndForPC两个窗口是否存在,如果存在则使用 BringWindowToTop函数将其置顶弹出。这两个窗口分别代表的是微信的主界面窗口和登陆界面窗口,如果一个微信实例已经存在,则势必处于这两种状态之一。
问题就出在上面这个判断中,汇编代码看起来有点辣眼睛,咱们F5来还原一下C代码(还原效果只能凑合看,能看清楚逻辑就行):
上面图片的注解已经说明了,函数sub_108e2660的返回值将决定是否启动微信实例进程,还是直接退出。
事情到这里就真相大白了,来总结一下。
微信判断是否启动的2个条件:
如果能成功创建互斥体对象,则启动微信
如果不能创建互斥体:
如果找到对应窗口,则置顶之,自己退出
如果没有找到,则启动微信
用伪代码来表示一下:
<code>if (CreateMutex() == SUCCESS) {<br> 启动微信<br>} else {<br> if (FindWindow() == SUCCESS) {<br> 将已有窗口置顶<br> } else {<br> 启动微信<br> }<br>}</code>
而直接使用脚本启动的多个进程,虽然操作系统内核层面保证了互斥体的唯一,但由于启动速度相差不大,相应的窗口还没有来得及创建出来,导致走入上面的第二个启动逻辑,从而可以启动多个实例。
在分析的过程中,发现了一个有趣的事情:
在WeChatWin.dll中,上面的创建互斥体再上一级函数名字叫StartWaChat,也是作为导出函数被该DLL导出:
以上がJava を使用して WeChat PC で複数のアカウントを開くにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。