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