Gestern habe ich zufällig von meinem guten Freund Xiaolin (öffentliches WeChat-Konto: Xiaolin Coding) erfahren, dass sich sein Computer tatsächlich anmelden kann auf zwei Computern gleichzeitig.
Ich weiß, dass Mobiltelefonsysteme wie Huawei und Xiaomi dies unterstützen, aber wie man zwei WeChat auf einem Computer mit Windows-System startet, hat für einige Verwirrung gesorgt.
Xiao Lin erzählte mir, dass er dies getan und einen Batch-Prozess geschrieben hat:
<code>start D:\WeChat\WeChat.exe<br>start D:\WeChat\WeChat.exe</code>
Dann doppelklickte er direkt auf die Batch-Datei, um zwei WeChat-Prozesse zu starten.
Ich habe es versucht und es ist wahr!
Dann habe ich eine weitere Zeile hinzugefügt und konnte 3 weitere aktivieren:
Dann habe ich im Internet gesucht und herausgefunden, dass dieser Trick schon vor langer Zeit von anderen angewendet wurde. Es kam mir vor, als wäre ich auf dem Mars. Aber warum kann man auf diese Weise mehr Türen öffnen? Ich möchte das Geheimnis wirklich erfahren.
TIPPS: Wenn Sie sich nicht für den Teil mit der technischen Analyse interessieren, können Sie ihn überspringen und am Ende direkt zum Teil mit der Wahrheit übergehen.
Unter normalen Umständen können Sie direkt manuell auf das WeChat-Symbol doppelklicken, um den später gestarteten Prozess zu starten Wenn festgestellt wird, dass bereits ein WeChat-Prozess vorhanden ist, wird das WeChat-Fenster des entsprechenden Prozesses direkt aktiviert, an der Vorderseite des Desktops positioniert und dann automatisch beendet.
Aber warum können sie mit der oben genannten Methode aktiviert werden? Finden wir es heraus.
Lassen Sie uns zunächst analysieren, wie die oben beschriebene einzelne Instanz von WeChat implementiert wird.
Freunde, die sich mit der Entwicklung von Windows-Plattformanwendungen beschäftigt haben, kennen dies möglicherweise. Im Allgemeinen wird nach dem Start des Prozesses ein Mutex mit einem global eindeutigen Namen erstellt. Wenn die Erstellung fehlschlägt, wird beurteilt, ob dieser Mutex bereits vorhanden ist. Wenn es bereits vorhanden ist, bedeutet dies, dass das entsprechende Programm bereits zuvor gestartet wurde.
Verwenden Sie mit dieser Vermutung das Tool procexp, um alle vom WeChat-Prozess geöffneten Kernelobjekte zu überprüfen und den Mutex-Teil zu finden:
Tatsächlich gibt es einen Mutex namens_WeChat_App_Instance_Identity_Mutex_Name Anhand dieses Namens können Sie vermuten, dass dies definitiv mit dem Singleton-Modus von WeChat zusammenhängt.
Starten Sie als Nächstes das Artefakt APIMonitor, das Ihnen bei der Überwachung der API-Aufrufe des angegebenen Prozesses helfen kann. Überprüfen SieCreateMutex und GetLastError Windows API Funktion. Wenn WeChat bereits läuft, starten Sie mit diesem Tool einen weiteren WeChat-Prozess und sehen Sie sich die Funktionsaufrufe an:
Sie können sehen, dass nach dem Erstellen des Mutex mit diesem Namen anschließend die Funktion GetLastError aufgerufen und 0x000000b7 zurückgegeben wurde. Überprüfen Sie das Handbuch, seine Bedeutung: #🎜🎜 #Werfen wir einen Blick auf den Aufrufstapel dieses
CreateMutexund sehen, wo der Code diesen globalen Mutex erstellt: # 🎜🎜#
im WeChat-Verzeichnis stammt. Der spezifische Speicherort ist die vorherige Anweisung am Offset 0x8e271b.Als nächstes stellen wir das Artefakt unter den Artefakten vor, die berühmte Demontagesoftware IDA. Dieser Typ unterstützt x86, x64, ARM, MIPS und andere Prozessorarchitekturen sowie Windows, Linux, Android, MacOS, JVM und andere Systemplattformen, Programmanalyse.
Öffnen Sie die Datei WeChatWin.dll mit IDA und suchen Sie sie am Offset 0x8e271b: Die obere Ebene ist die Funktion sub_108e2660, die sie aufruft:Wenn der Rückgabewert von sub_108e26d0 0 ist, bedeutet dies, dass es keinen gibt Fehler, die aktuelle Funktion gibt auch direkt 0 zurück.
如果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导出:
Das obige ist der detaillierte Inhalt vonWie verwende ich Java, um mehrere Konten auf einem WeChat-PC zu eröffnen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!