QQProtect進(jìn)程簡單分析
首先,本分析只供拋磚引玉,本人并非專業(yè)安全人員,分析可能有疏漏。并且由于程序代碼量巨大,只能挑關(guān)鍵部分分析,不排除有暗中留后門的可能。
安裝包為我手頭有的QQ,我沒有去專門試tim的QQProtect,但我認(rèn)為兩者不會有區(qū)別。
那么,先說結(jié)論,單就ReadProcessMemory這個(gè)函數(shù)的調(diào)用來說,有問題的可能性不大,其寫法更像一個(gè)基于特征碼的殺毒軟件??赡茉谝郧癚Q盜號盛行的年代會對賬號安全有一定幫助。當(dāng)然相同技術(shù)只是換一個(gè)關(guān)鍵字也是有檢測用戶行為的能力,不過鑒于他的檢測范圍不包括堆和棧,這種應(yīng)用場景比較受限,可能性不大。
包含了虛擬機(jī)檢測,眾多其他公司軟件的檢測,這里可能會有一些問題。我沒有細(xì)究,不知道有沒有人接上。
另外,拋開TX的作風(fēng)不談,這個(gè)程序運(yùn)行在SYSTEM權(quán)限下,并且還有驅(qū)動加持,擁有系統(tǒng)的最高權(quán)限,結(jié)構(gòu)又極度復(fù)雜,包括了自動更新,掃碼,服務(wù)器通信等非常多功能,在最高權(quán)限下跑這種復(fù)雜任務(wù)還是比較讓人擔(dān)心的(提權(quán)漏洞等)。(雖然包括了掃碼,但是掃碼登錄又不依賴這個(gè)程序,不知道是不是簡單的代碼復(fù)用導(dǎo)致的。甚至qq進(jìn)程脫離了QQProtect也是能正常工作的,只是需要一些方法讓他不主動退出。)
關(guān)于讀內(nèi)存部分的程序結(jié)構(gòu):
程序某處通過vtable調(diào)用接口,啟動監(jiān)控線程。由于這里vtable的存在,我沒辦法反向追過去。但這并不是刻意為了隱藏行為,只是一種典型的程序?qū)懛ā?br>
創(chuàng)建了兩個(gè)線程,按照日志中的名字,分別叫為MonitorThread和DubiousMonitorThread。(進(jìn)程監(jiān)視線程和可疑進(jìn)程監(jiān)視線程)
這兩個(gè)線程分別運(yùn)行,但是似乎共用了一套關(guān)鍵字,使用消息與某處進(jìn)行通信(掃描哪些進(jìn)程是由發(fā)過來的消息決定的)。
線程中有三種掃描,起名為ScanCode,ScanMemPatch,還有一種還沒分析功能,起名ScanUnknownThing。
ScanCode中有兩種掃描,一種起名CloudProcess,一種LocalProcess。ScanMemPatch函數(shù)結(jié)構(gòu)看起來與ScanCode相似,看名字可能是掃描hook用的。
CloudProcess我沒有細(xì)致分析,名字是他的日志中寫的。大概操作似乎是計(jì)算模塊Hash,文件名等,可能會發(fā)往服務(wù)器分析。這個(gè)函數(shù)中不包含讀取其他進(jìn)程內(nèi)存的操作。
LocalProcess中包括對目標(biāo)進(jìn)程枚舉模塊,并使用關(guān)鍵字掃描模塊內(nèi)存的操作。這里的模塊內(nèi)存指PE文件頭,.code,.data,.bss等區(qū)段,不包括堆、棧。對于瀏覽器,文檔編輯器等,這些區(qū)段由于空間大小固定,一般不會放需要動態(tài)加載的東西(網(wǎng)頁內(nèi)容,文檔等),即有敏感信息的可能比較小。但是用戶名,密碼等短長度內(nèi)容有可能出現(xiàn)。
在掃描內(nèi)存時(shí),會先讀取64K內(nèi)存,之后每次以63K為長度進(jìn)行遍歷。開頭1K的內(nèi)容一直保留在buffer中參與后續(xù)計(jì)算。不知道為何如此設(shè)計(jì)。掃描算法疑似KMP。
如果發(fā)現(xiàn)有關(guān)鍵字,會結(jié)束目標(biāo)進(jìn)程(疑似)。
流程圖,藍(lán)底部分為本分析中的流程。字很小,不知道圖片會不會糊掉。左下角為入口的VTable,之后流程從左上到右下。

以上是靜態(tài)分析,由于靜態(tài)分析找不到調(diào)用源,所以找不到關(guān)鍵字。下面是動態(tài)調(diào)試。
環(huán)境win10 vmware,似乎程序里面有檢測虛擬機(jī)的字眼,但這部分我沒有去專門研究。
動態(tài)調(diào)試這里,需要解決幾個(gè)問題,一個(gè)是程序通常是以服務(wù)運(yùn)行的,所以很難抓到啟動流程,另外程序有個(gè)自校驗(yàn)。
解決方案是先把自校驗(yàn)爆破掉,然后程序開頭寫一個(gè)死循環(huán)。任務(wù)管理器里選擇啟動服務(wù)之后附加調(diào)試器,手動跳出死循環(huán)。通過修改日志函數(shù)(TXLog_DoTXLogVW),刪除了日志級別的限制,并把日志通過DebugString打印至調(diào)試器。這種方法的話只能看服務(wù)啟動時(shí)的日志。打不開QQ,要能打開qq,就不能在入口點(diǎn)加死循環(huán)。但是可以先正常啟動服務(wù),然后附加。這時(shí)候可以啟動qq看之后的日志。兩者正好互補(bǔ)。
啟動階段日志內(nèi)容:運(yùn)行時(shí)候的我懶得再去截了,沒什么特殊東西。
https://pastebin.com/jyxrz8wM
在代碼中,如果開啟了監(jiān)視線程,則一定會打印這句話。但是我沒有抓到。并且斷點(diǎn)也沒有命中。所以一定程度上說明這個(gè)功能可能是云端關(guān)掉了。無從分析。(不排除我操作不對沒抓到的可能)

但是抓到了另一些有趣的內(nèi)容:

涉及到多個(gè)進(jìn)程和對應(yīng)的公司名,瀏覽器,網(wǎng)易云音樂,百度網(wǎng)盤,wps等等,不知道是干什么的。希望能有個(gè)解釋。
最后,附上idb文件。涉及到的主要邏輯在QQProtect.dll里,做了標(biāo)注,一些結(jié)構(gòu)體也分析了一下。有幾個(gè)調(diào)用程序里面直接壓棧傳了個(gè)大結(jié)構(gòu)體,ida分析不動,我好像也沒改對。
https://pan.baidu.com/s/1dpwHN7hxplBRDBzyyVF_jQ
x6sx