[原创]一个典型的游戏盗号木马逆向分析(有样本)
兵法有云:知已知彼,百战不殆。攻克敌人从了解敌人开始。
小弟新作,一个老病毒,练手用,大鸟勿喷!IDB,样本,文档随后附上。
------------------------------------------------------------
病毒大小23KB左右,为游戏盗号木马,采用UPX加壳,开机自启动。运行期间监视游戏帐号和密码等信息的输入,发送到指定的URL,导致游戏帐号和密码的泄露。
一、感染环境
Windows xp,windows 7能感染(其它环境没有测试)
二、感染特征
1、文件行为:
- 在%systemroot%\system32下创建:91C7DF6D.dll和91C7DF6D.cfg,其中91C7DF6D.dll为木码盗号DLL,91C7DF6D.cfg为加密的URL内容。解密后为:
http://www.y0uku1.com/cia/bike.asp
在%Temp%目录下,创建前缀为live的临时文件。
删除C:\WINDOWS\system32\VErCLSiD.exe文件。
2、进程行为:
- 设置全局钩子,令91C7DF6D.dll注入所有进程。
结束杀软进程,删除杀软托盘图标和结束游戏进程。
3、注册表行为:
- 创建键值:
hKey = HKEY_LOCAL_MACHINE
Subkey =”Software\microsoft\windows\currentversion\Explorer\shellexecutehooks”
Value name=”{91C7DF6D-AEF5-4136-9252-AF030D7A5931}”
hKey = HKEY_CLASSES_ROOT
Subkey = "CLsID\{91C7DF6D-AEF5-4136-9252-AF030D7A5931}\InprocServer32"
Value date=”91C7DF6D.dll”
hKey = HKEY_CLASSES_ROOT
Subkey = "CLsID\{91C7DF6D-AEF5-4136-9252-AF030D7A5931}\InprocServer32"
Value name=”ThreadingModel”
Value date=”Apartment”
4、网络行为:
- 访问URL:http://www.y0uku1.com/cia/bike.asp
三、执行流程图

四、过程分析
1、创建进程同步事件对象,然后创建新线程

- 创建子线程是病毒核心功能,运行结束后,才释放事件对象。
2、创建91C7DF6D.cfg和写入数据
- 在字符串"91C7DF6D-AEF5-4136-9252-AF030D7A5931”取出91C7DF6D,加上cfg拼成文件 名91C7DF6D.cfg,调用GetSystemDirectoryA得到系统目录,最后拼接成文件路径。%systemroot%\ststem32\91C7DF6D.cfg
申请堆空间,加载源文件到堆空间,返回堆指针。如下图

在源文件offset=9fc4处读出92字节大小的数据。去掉0D 0A得到数据如下:
2DB2C93C09AD60F3BC9A2C35EDF1D148220000002200000072F18A7B04B578B3FCDA357BEAB38D0A2BAB9D6453B534ADEA82796BB1A3C81E69F572F18A7B04B578B3FCDA357BEAB38D0A2BAB9D6453B534ADEA82796BB1A3C81E69F5
如果91C7DF6D.cfg文件存在,执行下一步;如果不存在在%systemroot%\ststem32\创建91C7DF6D.cfg文件,写入以上数据。
3、创建91C7DF6D.dll文件,然后写入数据
- 在字符串"91C7DF6D-AEF5-4136-9252-AF030D7A5931”取出91C7DF6D,加上dll拼成文件 名91C7DF6D.dll,调用GetSystemDirectoryA得到系统目录,最后拼接成文件路径。%systemroot%\system32\91C7DF6D.dll
申请堆空间,加载源文件到堆空间,返回堆指针。然后在%systemroot%\ststem32\91C7DF6D.dll创建文件,在文件offset=67C0h(脱壳后的)处,读出数据14336B大小数据写入文件。如下图:


4、加载91C7DF6D.dll,然后运行DLL的s200函数。
- 调皮LoadLibraryA加载91C7DF6D.dll,然后用GetProcAddress得到S200函数,然后调用它。如下图:

5、修改注册表
查看
HKEY_CLASSES_ROO\Software\microsoft\windows\currentversion\Explorer\shellexecutehooks\{91C7DF6D-AEF5-4136-9252-AF030D7A5931}是否存在。如不存在,下面创建键值。如下图:

通过CreateToolhelp32Snapshot,Process32First和Process32Next查找MD5为:AF 9C 01 04 86 7E D2 84 13 89 16 7E 77 5B 83 32 的进程,找到终止它,如下图。MD5的计算通过 CryptAcquireContextA,CryptCreateHash,CryptHashData和CryptGetHashParam等系列函数计算得到。

删除%systemroot%\system32\verclsid.exe文件,防止自创建CLSID时verclsid.exe认证。
调用RegOpenKeyEx,RegCreateKeyA和RegSetValueExA等API分别在注册表创建以下值:
hKey = HKEY_CLASSES_ROOT
Subkey = "CLsID\{91C7DF6D-AEF5-4136-9252-AF030D7A5931}\InprocServer32"
Valve data =”91C7DF6D.dll”
hKey = HKEY_CLASSES_ROOT
Subkey = "CLsID\{91C7DF6D-AEF5-4136-9252-AF030D7A5931}\InprocServer32"
Valve Name=”ThreadingModel”
Valve date=”Apartment”
hKey = HKEY_LOCAL_MACHINE
Subkey = "Software\microsoft\windows\currentversion\Explorer\shellexecutehooks"
Valve Name=”{91C7DF6D-AEF5-4136-9252-AF030D7A5931}”
设置访问权限为“SeBackupPrivilege”,创建前缀为live_开头的临时文件,调用RegSavaKeyA保存Software\microsoft\windows\currentversion\Explorer\信息。然后设置访问权限为“SeRestorePrivilege”,调用RegRestoreKeyA从临时文件中恢复注册表信息。调用RegFlushKey将修改的注册表信息实际写入磁盘,删除临时文件。重复一次相同操作,确定修改注册表成功。如下图:



6、调用QueryRegKey查看
Software\microsoft\windows\currentversion\Explorer\shellexecutehooks\{91C7DF6D-AEF5-4136-9252-AF030D7A5931}是否已存在。如不存在再次调用LoadLibraryA加载91C7DF6D.dll,运行S200函数。
7、调用GetTickCount查看系统历经时间,如果小于30分钟,继续返回第6步,直到重复三次,每次Sleep 3秒钟。为了确保dll加载运行。
8、退出子线程
9、自删除
GetModuleFileName和GetShortPathNameA得到源文件的短形式路径,通过GetEnvironmentVariableA得到CMD.exe路径,用cmd.exe运行命令,"/c del [短路径] >> NUL"实现自删除。
91C7DF6D.dll的行为:
10、终止杀软进程
通过GetModuleFileNameA得到寄主路径,最后得到程序名32位MD5值,与下列MD5值对比:
04D1C083134C2EBECA57A9724B0855D4 (360tray.exe)
AE33A1F2459A12A09EC75D71D14B5E89
3ABD7CD8928FE1F3EB563F43B913CA4B
B9E9786EAC82378D3A6E05FCC1E15D2C (smartup.exe)
D7DB952BB0FA044F2B9A22FEADB37973
1C085B8E02B137AA4EAFBE38CCF3D199
如果匹配成功,调用TerminateProcess中止它。如下图

MD5的计算用CryptAcquireContextA,CryptCreateHash等一系列函数。如下图

11、删除杀软托盘图标和进程注入
创建无限循环子线程:
通过CreateToolhelp32Snapshot创建快照,寻找进程名MD5为下列值的进程。然后把访问权限设为SeDebug特权,通过一套函数FindWindowA,FindWindowExA,GetWindowThreadProcessId和SendMessage等来删除托盘。
通过GetProcAddress,WriteProcessMemory,CreateRemoteThread等系列函数,把DLL注入到游戏主进程。如下图:

12、设立全局钩子
- 调用SetWindowSHookExA设下WH_CBT类型全局钩子,如下图,目的是把自身(91C7DF6D.dll)注入所以进程中去,得以寄生,不易被终止。
13、注册表的修改
创建限循环子线程不断监视注册表:
首先查找%systemroot%\system32\VErCLSiD.exe,存在的话就删除它,防止验证。用RegCreateKeyEx检测是否存在
HKEY_LOCAL_MACHINE\Software\microsoft\windows\currentversion\Explorer\shellexecutehoos\{91C7DF6D-AEF5-4136-9252-AF030D7A5931}键值。如果不存在,接着创建如下键值(exe主程序一样的做法):
hKey = HKEY_LOCAL_MACHINE
Subkey =“Software\microsoft\windows\currentversion\Explorer\shellexecutehooks”
Value name=”{91C7DF6D-AEF5-4136-9252-AF030D7A5931}”
hKey = HKEY_CLASSES_ROOT
Subkey = "CLsID\{91C7DF6D-AEF5-4136-9252-AF030D7A5931}\InprocServer32"
Value date=”91C7DF6D.dll”
hKey = HKEY_CLASSES_ROOT
Subkey = "CLsID\{91C7DF6D-AEF5-4136-9252-AF030D7A5931}\InprocServer32"
Value name=”ThreadingModel”
Value date=”Apartment”14、查找游戏进程,记录信息然后发送帐号与密码信息。
查看寄主MD5值是否为:AF9C0104867ED2841389167E775B8332(猜测为游戏进程名MD5值,有谁帮我破解下),如果是就结束该游戏进程。然后通过过程,键盘,鼠标钩子监视输入的游戏帐号与密码。
然后读取%systemroot%\system32\91C7DF6D.cfg的数据如下:
2DB2C93C09AD60F3BC9A2C35EDF1D148220000002200000072F18A7B04B578B3FCDA357BEAB38D0A2BAB9D6453B534ADEA82796BB1A3C81E69F572F18A7B04B578B3FCDA357BEAB38D0A2BAB9D6453B534ADEA82796BB1A3C81E69F5
- 分成两段:Key()=2DB2C93C09AD60F3BC9A (共10个字节)
C()=72F18A7B04B578B3FCDA357BEAB38D0A2BAB9D6453B534ADEA82796BB1A3C81E69F5
解密过程(如下图):
设i=1;
C(i)=Key( i%10 ) Xor C(i)
C(i)= C(i) Xor 37h
i++继续第2步,直到C()解密结束
最后得到明文:P()=http://www.y0uku1.com/cia/bike.asp

通过调用InternetOpen等API以
Re=&s=&A=&P=&MB=&wwwww=v&H=&PIN=&R=&RG=-1&M=-1&M1=-1&mac=&RG1=-1&Z=:格式发送记录到的信息。
五、手动查杀方法
1、在安全模式下或PE环境里,删除%system32%\system32\91C7DF6D.dll和91C7DF6D.cfg
2、删除键值:
hKey = HKEY_LOCAL_MACHINE
Subkey =“Software\microsoft\windows\currentversion\Explorer\shellexecutehooks”
Value name=”{91C7DF6D-AEF5-4136-9252-AF030D7A5931}”
hKey = HKEY_CLASSES_ROOT
Subkey = "CLsID\{91C7DF6D-AEF5-4136-9252-AF030D7A5931}\InprocServer32"
Value date=”91C7DF6D.dll”
hKey = HKEY_CLASSES_ROOT
Subkey = "CLsID\{91C7DF6D-AEF5-4136-9252-AF030D7A5931}\InprocServer32"
Value name=”ThreadingModel”
Value date=”Apartment”
附件.zip
