小林告訴我他是這樣做的,寫了乙個批處理:
start d:\wechat\wechat.exe
start d:\wechat\wechat.exe
我試了一下,果然如此!
隨後我又加了一行,竟然還能啟動3個:
接著我在網路上搜了一下,原來這一招早就被人用過了,看來是我火星了。不過到底為什麼用這種方式就能多開,我倒是很想知道這個迷底。
tips:如果對技術分析部分不感興趣,可以跳過直接來到後面的真相部分。
但為什麼用上面的方式就能啟動倆呢?我們來一**竟。
做過windows平台應用程式開發的朋友可能對此比較熟悉,一般是程序啟動後建立乙個全域性唯一名字的互斥體,建立成功則正常啟動,建立失敗則判斷一下是否這個互斥體已經存在。如果已經存在則說明已經有對應程式之前啟動。
可以看到,建立這個名字的互斥體後,隨後又呼叫了getlasterror函式,並返回了0x000000b7,檢視手冊,其含義:
表示已經存在。
來看一下,這個createmutex呼叫的堆疊,看看是哪個地方的**在建立這個全域性互斥體:
接下來就要祭出神器中的神器,大名鼎鼎的反彙編軟體ida,這傢伙支援x86、x64、arm、mips等多種處理器架構和windows、linux、android、macos、jvm等多種系統平台的程式分析。
用ida開啟這個wechatwin.dll檔案,並定位到偏移0x8e271b處:
如上圖所示,建立互斥體的動作,發生在函式sub_108e26d0。
上層是sub_108e2660函式在呼叫它:
上面這張圖反映了建立互斥體後的判斷邏輯:
問題就出在上面這個判斷中,彙編**看起來有點辣眼睛,咱們f5來還原一下c**(還原效果只能湊合看,能看清楚邏輯就行):
事情到這裡就真相大白了,來總結一下。
如果不能建立互斥體:
用偽**來表示一下:
if (createmutex() == success) else else
}
而直接使用指令碼啟動的多個程序,雖然作業系統核心層面保證了互斥體的唯一,但由於啟動速度相差不大,相應的視窗還沒有來得及建立出來,導致走入上面的第二個啟動邏輯,從而可以啟動多個例項。
在分析的過程中,發現了乙個有趣的事情:
cpu明明8個核,網絡卡為啥拼命折騰一號核?
因為乙個跨域請求,我差點丟了飯碗
完了!cpu一味求快出事兒了!
雜湊表哪家強?幾大程式語言吵起來了!
乙個http資料報的奇幻之旅
微信電腦端多開
全選目標位址後滑鼠右擊選擇 複製 電腦桌面滑鼠右擊選擇 新建 選擇 文字文件 將步驟2複製的位址貼上到文字中 d program files x86 tencent wechat wechat.exe 修改文字的資訊 d program files x86 tencent wechat wechat...
itchat微信多開
所以在使用itchat的過程中,只能登陸手機,而不能登陸pc版 今天在itchat的 上看到了 使用者多開 的字眼,以為是能夠共存,測試發現不是 如下 import itchat newinstance itchat.new instance newinstance.auto login hotre...
微信協議分析 pc端記錄
首先發現這個報文是和手機端就不一樣,當手機向pc傳送訊息時,是先傳送乙個不知名報文,然後pc端返回一段比較長的報文,然後才會收到真實資料報文。通過記憶體斷點,目前發現pc端返回的斷點可能是用來給真實收到的報文解密的。具體除錯方式如下 下記憶體斷點,檢視訪問資料段的地方。這裡記憶體斷點下在靠後的部分,...