Hier, j'ai accidentellement appris de mon bon ami Xiao Lin (compte officiel WeChat : Xiao Lin Coding) que son ordinateur peut en fait ouvrir deux comptes WeChat en même temps.
Ouvrez plusieurs WeChat sur le téléphone mobile. Je sais que les systèmes de téléphonie mobile tels que Huawei et Xiaomi l'ont pris en charge, mais comment activer deux WeChat sur un ordinateur exécutant le système Windows a éveillé ma curiosité.
Xiao Lin m'a dit qu'il avait fait cela et avait écrit un processus par lots :
<code>start D:\WeChat\WeChat.exe<br>start D:\WeChat\WeChat.exe</code>
Puis il a directement double-cliqué sur le fichier batch pour démarrer deux processus WeChat.
Je l'ai essayé, et bien sûr, ça marche !
Puis j'ai ajouté une autre ligne, et 3 autres ont été activées :
Ensuite, j'ai cherché sur Internet et découvert que cette astuce avait été utilisée par d'autres il y a longtemps. Il semblait que j'avais Mars. Mais pourquoi pouvez-vous ouvrir plus de portes de cette façon ? Je veux vraiment connaître le mystère.
CONSEILS : Si la partie analyse technique ne vous intéresse pas, vous pouvez sauter et passer directement à la partie vérité à la fin.
Dans des circonstances normales, vous pouvez directement double-cliquer sur l'icône WeChat pour démarrer. Le processus démarré plus tard vérifiera le mode singleton global si un processus WeChat existe déjà, la fenêtre WeChat du correspondant. Le processus sera activé directement. Accédez à l’avant du bureau et quittez.
Mais pourquoi pouvons-nous activer les deux en utilisant la méthode ci-dessus ? Découvrons-le.
Tout d’abord, analysons comment l’instance unique de WeChat décrite ci-dessus est implémentée.
Les amis qui ont développé des applications sur la plate-forme Windows le savent peut-être. Généralement, un mutex avec un nom globalement unique est créé après le démarrage du processus. Si la création réussit, elle démarrera normalement. sera jugé si le mutex existe déjà. S'il existe déjà, cela signifie que le programme correspondant a déjà été démarré.
Avec cette conjecture, utilisez l'outil procexp pour vérifier tous les objets du noyau ouverts par le processus WeChat et trouver la partie mutex :
Effectivement, il existe un mutex nommé _WeChat_App_Instance_Identity_Mutex_Name À partir de ce nom, nous pouvons deviner que cela est définitivement lié au mode singleton de WeChat.
Ensuite, démarrez l'artefact APIMonitor, qui peut vous aider à surveiller les appels API du processus spécifié, et vérifiez les deux fonctions API Windows CreateMutex et GetLastError. Lorsque WeChat est déjà en cours d'exécution, utilisez cet outil pour démarrer un autre processus WeChat et jetez un œil aux appels de fonction :
Vous pouvez voir qu'après avoir créé le mutex avec ce nom, la fonction GetLastError a ensuite été appelée et 0x000000b7 a été renvoyé. Vérifiez le manuel pour sa signification :
signifie existe déjà.
Jetons un coup d'œil à la pile d'appels de ce CreateMutex et voyons où le code crée ce mutex global :
On peut voir sur la pile que l'appel provient d'une bibliothèque dynamique WeChatWin.dll dans le répertoire WeChat. La position spécifique est l'instruction précédente au décalage 0x8e271b.
La prochaine étape consiste à introduire l'artefact parmi les artefacts, le célèbre logiciel de désassemblage IDA. Ce type prend en charge plusieurs architectures de processeur telles que x86, x64, ARM, MIPS, etc. et divers systèmes tels que Windows, Linux, Android, MacOS, JVM, etc. Analyse du programme de plateforme.
Ouvrez le fichier WeChatWin.dll avec IDA et localisez-le au décalage 0x8e271b :
Comme le montre la figure ci-dessus, l'action de création d'un mutex se produit dans la fonction sub_108e26d0.
La couche supérieure est la fonction sub_108e2660 qui l'appelle :
L'image ci-dessus reflète la logique de jugement après la création du mutex :
Si la valeur de retour de sub_108e26d0 est 0, cela signifie qu'il n'y a pas d'erreur et la fonction actuelle renvoie également 0 directement.
如果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导出:
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!