Rumah >Java >javaTutorial >Bagaimana untuk menggunakan Java untuk membuka berbilang akaun pada WeChat PC?
Semalam, saya secara tidak sengaja mengetahui daripada rakan baik saya Xiao Lin (akaun awam WeChat: Xiao Lin Coding) bahawa komputernya sebenarnya boleh membuka dua WeChat ID pada masa yang sama.
Buka WeChat pada telefon mudah alih Saya tahu bahawa sistem telefon mudah alih seperti Huawei dan Xiaomi menyokong ini, tetapi bagaimana untuk memulakan dua WeChat pada komputer yang menjalankan sistem Windows Ini benar-benar menimbulkan rasa ingin tahu saya.
Xiao Lin memberitahu saya bahawa dia melakukan ini dan menulis proses kelompok:
<code>start D:\WeChat\WeChat.exe<br>start D:\WeChat\WeChat.exe</code>
Kemudian dia terus mengklik dua kali fail kelompok untuk memulakan dua proses WeChat.
Saya mencubanya, dan pasti ia berkesan!
Kemudian saya menambah baris lain, dan saya dapat mengaktifkan 3 lagi:
Kemudian saya mencari di Internet dan mendapati bahawa helah ini telah digunakan oleh orang lain sejak dahulu lagi. Tetapi mengapa anda boleh membuka lebih banyak pintu dengan cara ini saya benar-benar ingin tahu misterinya.
TIPS: Jika anda tidak berminat dengan bahagian analisis teknikal, anda boleh langkau dan pergi terus ke bahagian kebenaran di penghujung.
Dalam keadaan biasa, anda boleh terus klik dua kali pada ikon WeChat untuk memulakan proses yang dimulakan kemudian akan melakukan semakan mod tunggal global Jika didapati bahawa WeChat proses sudah wujud, ia akan terus Mengaktifkan tetingkap WeChat proses yang sepadan, meletakkannya di hadapan desktop, dan kemudian keluar sendiri.
Tetapi kenapa ia boleh diaktifkan menggunakan kaedah di atas? Mari kita ketahui.
Mula-mula, mari kita analisa cara satu contoh WeChat yang diterangkan di atas dilaksanakan.
Rakan yang telah membuat pembangunan aplikasi platform Windows mungkin biasa dengan ini, mutex dengan nama unik secara global dibuat selepas proses dimulakan, ia akan bermula seperti biasa penciptaan gagal, ia akan dinilai sama ada mutex adalah sama. repeller sudah wujud. Sekiranya ia sudah wujud, bermakna program yang berkaitan telah dimulakan sebelum ini.
Dengan tekaan ini, gunakan alat procexp untuk menyemak semua objek kernel yang dibuka oleh proses WeChat dan mencari bahagian mutex:
Sudah pasti, terdapat mutex bernama _WeChat_App_Instance_Identity_Mutex_Name Daripada nama ini, kita boleh mengagak bahawa ini pasti berkaitan dengan mod tunggal WeChat.
Seterusnya, mulakan APIMonitor artifak, yang boleh membantu anda memantau panggilan API bagi proses yang ditentukan. Semak dua fungsi API Windows CreateMutex dan GetLastError. Apabila WeChat sudah berjalan, gunakan alat ini untuk memulakan proses WeChat yang lain dan lihat pada panggilan fungsi:
Seperti yang anda lihat, selepas mencipta mutex dengan nama ini, fungsi GetLastError kemudiannya dipanggil dan 0x000000b7 telah dikembalikan, maksudnya:
bermaksud ia sudah wujud.
Mari kita lihat susunan panggilan CreateMutex ini dan lihat di mana kod mencipta mutex global ini:
Daripada timbunan, dapat dilihat bahawa panggilan itu datang daripada perpustakaan dinamik WeChatWin.dll dalam direktori WeChat. Kedudukan khusus ialah arahan sebelumnya pada offset 0x8e271b.
Langkah seterusnya ialah memperkenalkan artifak di kalangan artifak, perisian pembongkaran terkenal IDA Lelaki ini menyokong x86, x64, ARM, MIPS dan seni bina pemproses lain serta Windows, Linux, Android, MacOS, Program JVM. analisis pada pelbagai platform sistem.
Buka fail WeChatWin.dll dengan IDA dan cari di offset 0x8e271b:
Seperti yang ditunjukkan dalam rajah di atas, tindakan mencipta mutex, Berlaku dalam fungsi sub_108e26d0.
Lapisan atas ialah fungsi sub_108e2660 yang memanggilnya:
Gambar di atas mencerminkan logik penghakiman selepas mencipta mutex:
Jika nilai pulangan sub_108e26d0 ialah 0, ia bermakna tiada ralat dan fungsi semasa akan kembali terus 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导出:
Atas ialah kandungan terperinci Bagaimana untuk menggunakan Java untuk membuka berbilang akaun pada WeChat PC?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!