概述
病毒 名称 ： Worm . Win32 . RavMon
病毒 类型 ： 蠕虫
危害 等级 ： 中
文件 长度 ： 3,513,806 字节
文件 MD5 ： 5D8CC0712927E07A1BAB416493F43036
公开 范围 ： 完全 公开
感染 系统 ： windows 98 及 以上 版本
开发 工具 ： python
病毒 描述
病毒 还 会 尝试 收集 感染 主机 的 信息 ， 如 ： 感染 的 主机 名 ， 当前 windows 版本 等 。 如果 当前 系统 为 xp ， 则 病毒 还 会 通过 运行 “ netsh firewall delete portopening TCP ” 来 删除 防火墙 端口 配置 协议 中 的 传输 控制 协议 ， 进而 降低 系统 的 安全性 。 病毒 尝试 连接 网络 ， 获取 一 个 shell ， 通过 运行 rundll32.exe 并 加载 shdocvw.dll 来 打开 一 个 URL 地址 。 病毒 还 具有 结束 进程 功能 。 此 病毒 通过 U盘 和 移动 设备 来 进行 传播 。
行为 分析
1 、 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\RavAV
键 值 : 字串 : " C : \ WINNT\RavMon.exe "
2 、 病毒 尝试 连接 网络 ， 尝试 连接 下 地址 :
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 ， 它们 以 被 单读 提供 。 放 在 dist\myscript 目录 下 。
解码 的 过程 ：
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 \ \ 并 运行 它
( 13 ) 解出 Scripts\\__main__.py 并 运行 它 （ 这里 的 __main__.py 就 是 要 打包 的 python 文件 ， 被 重 命名 为 __main__.py ）
source \ start . 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 。
