病毒名称:Worm.Win32. RavMon
病毒类型:蠕虫
危害等级:中
文件长度:3,513,806 字节
文件MD5:5D8CC0712927E07A1BAB416493F43036
公开范围:完全公开
感染系统:windows 98 及以上版本
开发工具:python
病毒描述:
该病毒属蠕虫类,病毒作者通过python2exe来编译的病毒,python2exe使用python的modualfinder来调入要运行的scripts寻找并运行它所需要的所有python模块和扩展模块。病毒运行后会复制原病毒体到%windir%RavMon.exe,而后调用注册表相关函数,将该病毒副本添加到启动项,达到随系统启动的目的。病毒还会尝试收集感染主机的信息,如:感染的主机名,当前windows版本等。如果当前系统为xp,则病毒还会通过运行“netsh firewall delete portopening TCP”来删除防火墙端口配置协议中的传输控制协议,进而降低系统的安全性。病毒尝试连接网络,获取一个shell,通过运行rundll32.exe并加载shdocvw.dll来打开一个URL地址。病毒还具有结束进程功能。此病毒通过U盘和移动设备来进行传播。
行为分析:
1、HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRunRavAV
键值: 字串: "C:WINNTRavMon.exe"
2、病毒尝试连接网络,尝试连接以下地址:
http://natrocket.kmip.net:5288
http://natrocket.9966.org:5288
http://scipaper.kmip.net:80
3、开启本机一个随机端口并发送获得的计算机信息。如:计算机名、端口、版本信息等。
4、猜测该病毒的某些功能对应的python模块文件名:
终止进程对应的python模块名为:killProcName.pyo
url地址对应的python模块名为: urllib.pyo、urlparse.pyo
获取目标主机信息对应的python模块名为:os.pyo
http相关的python模块名为:httplib.pyo
删除cookiess对应的python模块名为:cookiess.pyo
base64/quopri编码功能对应的python模块名为:base64.pyo
cmd功能对应的python模块名为:cmd.pyo
修改注册表对应的python模块名为:copy_reg.pyo
ftp相关的python模块名为:ftplib.pyo
调用socket相关的python模块名为:socket.pyo
usb相关的python模块名为:usb.pyo
--------------------------------------------------------------------------------
代码分析 :
python2exe使用python的modualfinder来调入要运行的scripts并且寻找运行它所需要的所有python模块和扩展模块。
纯python的模块在临时目录里被编译成.pyc(debug)和.pyo(optimized)的文件。编译后的扩展模块pyd文件也能找到。
最后生成一个与zip兼容的包,包含一个dependency目录和你的script,这个包最后提供给一个py2exe自带的python解释器。
运行生成的程序,将建立一个重要的关联,这样在script开始运行的时候,必要的模块可以从包中的正确地import。
由于扩展模块不能从zip包中包含或import,它们以被单读提供。放在distmyscript目录下。
解码的过程:
main, winmain调用start函数。
start:
(1) 获得目录名和文件名(GetModuleFileName)
(2) 取出执行文件的数据(MapExistingFile)
(3) 获得script的信息(GetScriptInfo)
(4) 用_putenv设置用户的环境变量(PYTHONHOME,PYTHONPATH,PYTHONOPTIMIZE,PYTHONDEBUG等)
(5) 将scriptinfo种的信息来设置python内部变量(Py_NoSiteFlag, Py_VerboseFlag等)
(6) Py_Initialize()
(7) PySys_SetArgv(argc, argv)
(8) 调用BuildToc获得toc(dict对象)
(9) 调用PyRun_SimpleString执行"import sys; sys.path=[r'%s']"
(10)调用Load_Module调入imputil模块,调用PyRun_SimpleString执行"import imputil"
(11)Py_InitModule("__main__", methods);
(12)解出Scripts\support.py并运行它
(13)解出Scripts\__main__.py并运行它(这里的__main__.py就是要打包的python文件,被重命名为__main__.py)
sourcestart.c:
1. MapExistingFile:用文件映像的方法打开文件,读处理里面的内容。
2. GetScriptInfo: 从archive.h中定义的(central directory record)格式的数据中取出script info(optimize, verbose, tag)到全局变量p_script_info中。
3. BuildToc:构造一个新的dict对象,在arch文件中做一个循环,取出所有的name放入dict中(PyDict_SetItem),其中调用了fixpath来解决""和"/"的统一问题,并将dict返回(注意,name好像是不带后缀的)。
4. extract_data: 使用zlib.h中定义的zstream结构,从archive结构中获得指定的长度的数据 5. GetContentsFromOffset:计算位置,调用extract获得数据。
6. GetContents:利用PyDict_GetItemString从toc中得到指定的名字的文件的位置,调用GetContentsFromOffset获得数据。
7. Load_Module:检查p_script_info->optimize,判断文件名的后缀是".pyo"还是".pyc",调用GetContents从数据中调出这个文件。
8. get_code:指定名字,获得这个文件的内容:GetContents + PyString_FromString。