一、主程序流程分析:
主程序名:ctfmon.exe(仿冒微软输入法配置程序)
壳 :无壳
编写语言:汇编(估计)
1. 用GetLogicalDriveStringsA API获得所有系统盘符存放到一个字符串;
2. 读取自身文件尾部的0x1C4字节数据,并根据最后4字节的DWORD值,调用NEW函
数申请内存(为0x2A00大小);
3. 从自身文件距离尾部(0x1C4+0x2A00)字节处,读取0x2A00字节数据,存储到
上面NEW出来的内存中;
4. 关闭游戏主程序******nest.exe;
5. 根据注册表项:SOFTWARE\\snda\\dn和
Software\Microsoft\Windows\ShellNoRoam\MUICache
找到游戏所在目录生成gamewidget.dll和midimap.dll,dll,内容为第3步中的数据写
2001次,再加上文件尾部的0x1C4字节数据,共20.5 MB (21,515,204 字节)(太大
了-.-)。(因为我没有安装这个游戏,所以也没有这些注册表项目,实际当中我自己
建了一个SOFTWARE\\snda\\dn注册表项,随便给了一个路径)
6. 根据第1点里面得到的所有系统盘符字符串,用SearchTreeForFile API(盘符多,
硬盘大的时候好慢啊),查找Dnlauncher.exe程序,找到了之后在该目录下创建
gamewidget.dll和midimap.dll,因为没装游戏,我又伪造了一个Dnlauncher.exe
(-.-)
7. 本程序实现的自删除,会因机器是否安装有瑞星而有所不同。机器没有安装瑞星时
是把自己移动到程序所在盘符的RECYCLER文件夹中,并重命名成一个GetTickCount
得到的数字+.tmp后缀名的文件。在XP系统上这个文件比桌面上的回收站目录高一级,
所以点击桌面的回收站,里面会看不到这个文件。机器安装了瑞星则不做上述处理。最
后会将此文件设为下次重启电脑时删除。
二、生成的DLL模块流程分析:
1. 上面所说的gamewidget.dll和midimap.dll,dll内容都是一样,虽然文件很大(重
复写了太多次的结果),但内容还是用了UPX加壳了(UPX 0.80 - 1.24 DLL)。ESP
定律简单脱壳,PEID再查一下为Microsoft Visual C++ 6.0 DLL。
2. 该dll首先将系统目录(XP系统为\WINDOWS\system32\)下的midimap.dll文件
复制一份为lqmidimap.dll放到同一目录下,然后创建一个线程,接下来的工作都在此线
程中完成。
3. 进入线程后首先会创建一个互斥体对象防止线程多次运行,接下来比较主模块的模
块名是否是“******Nest.exe”。如果不是则退出,如果是继续以下步骤。
4. 读取自身文件最后0x1C4字节(这里就要注意脱壳后的文件最后的字节和脱壳前已
经不一样了,为了调试方便可以把脱壳前文件的尾部数据添加到脱壳后dll中),进行几
步相套的算法变换,将最后的0x1C4字节解密出来,解密出来的数据如下:
10004C48 68 74 74 70 3A 2F 2F 68 61 68 61 35 2E 68 61 6F http://haha5.hao
10004C58 72 65 6E 36 37 38 2E 63 6F 6D 3A 38 30 31 31 2F ren678.com:8011/
10004C68 66 65 6E 2F 71 6C 6E 62 32 30 2F 61 73 64 66 61 fen/qlnb20/asdfa
10004C78 67 61 73 61 73 64 66 67 7A 78 63 76 2E 61 73 70 gasasdfgzxcv.asp
10004C88 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
10004C98 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
10004CA8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
10004CB8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
10004CC8 68 74 74 70 3A 2F 2F 68 61 68 61 35 2E 68 61 6F http://haha5.hao
10004CD8 72 65 6E 36 37 38 2E 63 6F 6D 3A 38 30 31 31 2F ren678.com:8011/
10004CE8 66 65 6E 2F 71 6C 6E 62 32 30 2F 61 73 64 66 61 fen/qlnb20/asdfa
10004CF8 67 61 73 61 73 64 66 67 7A 78 63 76 2E 61 73 70 gasasdfgzxcv.asp
10004D08 68 74 74 70 3A 2F 2F 68 61 68 61 35 2E 68 61 6F http://haha5.hao
10004D18 72 65 6E 36 37 38 2E 63 6F 6D 3A 38 30 31 31 2F ren678.com:8011/
10004D28 66 65 6E 2F 71 6C 6E 62 32 30 2F 61 73 64 66 61 fen/qlnb20/asdfa
10004D38 67 61 73 61 73 64 66 67 7A 78 63 76 2E 61 00 00 gasasdfgzxcv.a..
10004D48 68 74 74 70 3A 2F 2F 68 61 68 61 35 2E 68 61 6F http://haha5.hao
10004D58 72 65 6E 36 37 38 2E 63 6F 6D 3A 38 30 31 31 2F ren678.com:8011/
10004D68 66 65 6E 2F 71 6C 6E 62 32 30 2F 61 73 64 66 61 fen/qlnb20/asdfa
10004D78 67 61 73 61 73 64 66 67 7A 78 63 76 2E 61 73 70 gasasdfgzxcv.asp
10004D88 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
10004D98 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
10004DA8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
10004DB8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
10004DC8 78 78 73 73 00 00 00 00 00 00 00 00 00 00 00 00 xxss............
10004DD8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
10004DE8 61 62 63 64 00 00 00 00 00 00 00 00 00 00 00 00 abcd............
10004DF8 31 37 34 30 39 34 38 38 00 00 00 00 00 00 00 00 17409488........
10004E08 00 2A 00 00 .*..
然后将http://haha5.haoren678.com:8011/fen/qlnb20/asdfagasasdfgzxcv.asp
最后的asdfagasasdfgzxcv.asp替换为MIBAO.ASP
即为:http://haha5.haoren678.com:8011/fen/qlnb20/MIBAO.ASP
(难道是伪造密保页面吗?-.-)
5. 接下来HOOK了"user32.dll"中的MessageBoxTimeoutW"函数,至于HOOK的目
的,干了哪些事就不知道了。
6. 接下来,查找模块gwCore.dll,HOOK了该dll中一系列位置,IDA中看这一段看的云
里雾里。查找SDOA4ClientCom.dll模块,进行一系列HOOK。
7. 从LZGSERVER.ini文件中拿到SERVER项内容,使用URLDownloadToFileA函数下
载网页http://patch.dn.sdo.com/sndalist/sndalist_new.xml
保存到本机TEMP目录下,文件名为SerList.xml,进行一番查找比较。之后线程结束。
三、后续分析:
分析到这里貌似也没什么再好分析的了,可能大家没看到木马作恶的过程有点失
望,是的,我也没看到,因为他的关键功能都是在HOOK之后所跳转到的代码里面完成
的,我大部分都是在IDA里面静态分析的,顺着流程走下来就是这样一个过程。
为了不让大家太失望,也为了让自己不至于觉得太没成就感,我又回头看了一下逆
向分析的过程,结合导入表中的函数来看了下,该木马至少有屏幕截取和网络发送数据
的嫌疑。那么就再稍微跟踪一下这两个方面吧。
1. 网络发包分析:
还记得我们在dll分析的第4步中,得到的那个网址吧
http://haha5.haoren678.com:8011/fen/qlnb20/MIBAO.ASP
用IDA看一下,什么地方还引用了这个字符串,还真的有所收获:
把sub_10002B9E这个CALL跟进去,会发现里面有HTTP协议的数据发送和接收操
作。
UPX0:10002DB7 push eax
UPX0:10002DB8 push offset aPostSHttp1_1Ac ; "POST %s HTTP/1.1\r\nAccept: text/plain, *"...
UPX0:10002DBD push ebx ; Dest
UPX0:10002DBE call sprintf
UPX0:10002DC4 add esp, 54h
UPX0:10002DC7 lea eax, [ebp+Dest]
……………………………………中间多余代码已删减………………………………………………
UPX0:10002E2C push offset aQlmmsg ; "qlmmsg"
UPX0:10002E31 push eax
UPX0:10002E32 push offset aGetSHt ; "GET %s HT"
UPX0:10002E37 push ebx ; Dest
UPX0:10002E38 call sprintf
UPX0:10002E3E push ebx ; Str
UPX0:10002E3F call strlen
UPX0:10002E44 add esp, 18h
UPX0:10002E47 mov esi, eax
UPX0:10002E49
UPX0:10002E49 loc_10002E49: ; CODE XREF: sub_10002B9E+278j
UPX0:10002E49 xor edi, edi
UPX0:10002E4B push edi ; flags
UPX0:10002E4C push esi ; len
UPX0:10002E4D push ebx ; buf
UPX0:10002E4E push [ebp+s] ; s
UPX0:10002E51 call send ; 发送数据
……………………………………中间多余代码已删减………………………………………………
UPX0:10002E86 push edi ; flags
UPX0:10002E87 push esi ; len
UPX0:10002E88 push eax ; buf
UPX0:10002E89 push [ebp+s] ; s
UPX0:10002E8C call recv ; 接收数据
UPX0:10002E92 cmp eax, 0FFFFFFFFh
UPX0:10002E95 jz short loc_10002EDB
UPX0:10002E97 mov esi, offset aHttp1_1400 ; "HTTP/1.1 400"
2. 截图过程分析:
在我们第二阶段分析dll的时候其中第6步提到了该dll HOOK了gwCore.dll。使
gwCore.dll中的流程转到了自己的dll中来了,其中最后的一个HOOK(在IDB文件里面
我命名为hook_9)里面又对另外一个dll:SDOA4ClientCom.dll进行了HOOK(命名
为hook_8),在hook_8的代码里面有如下一些行为:
2.1 首先创建一个线程,该线程的作用是枚举屏幕窗口。
2.2 对每个枚举到的屏幕窗口用GetClassName API获得其类名,比较是否匹
配"IEFrame"、"ShImgVw:CPreviewWnd"、"Afx:400000:8"这三种,如果均不匹配
则不做任何处理。
2.3 如果匹配以上三种类名之一,则进行截屏并利用GDI+方法保存为BMP,JPG图形。
2.4 如果有截屏,则会将截屏图形通过上面的网络发包方式发送出去。
四、关于如何防范这类盗号木马或类似外挂的思考
该盗号木马在功能实现上大量使用HOOK技术,防范这种攻击,作为游戏开发方应
该加强保护,例如对主程序和dll模块的保护,在一些关键位置进行必要的代码校验,如
关键代码md5验证,dll的CRC验证,dll的签名认证等。作为游戏玩家为了防止盗号类木
马入侵本机,造成盗号,应该注意少上来源不明的网站,不下载不可信的程序,及时给
系统或常用软件打补丁,避免恶意程序利用漏洞传播进入个人电脑。当然,攻与防的较
量是无止境的,“道高一尺,魔高一丈”,没有无坚不摧的防御,安全之路,任重而道
远。
五、IDA分析附件
1.ctfmon.exe:19.9 KB (20,420 字节)主程序
2.1.dll:42.5 KB (43,520 字节)生成的dll经过脱壳后的版本
3.复件 1.dll:53.4 KB (54,724 字节)生成的dll经过脱壳后,并在尾部附加需要
解密的网址数据。
- 标 题:一款盗号木马的分析
- 作 者:超然
- 时 间:2011-04-26 22:15:27
- 链 接:http://bbs.pediy.com/showthread.php?t=132981