-
-
[原创]SanforBotScan逆向笔记
-
发表于: 2019-6-5 23:17 4116
-
这几天清理硬盘,整理资料发现一份两年前分析SanforBotScan的分析笔记,本身没多大技术含量,思路上可能有点借鉴意义,留着没有意义,没准哪儿天就删了,分享出来,留给有需要的人,大牛轻拍。
当时应该是有需求分析一下友商产品中的规则(rule)。
首先,看一下文件目录,如下所示(一些类型相同的文件以...代替):
根据经验判断,***.enc可能为保存规则信息的文件,010editor打开看一下,发现是经过加密的文件。首先想到的常规思路是逆向加密算法解密enc文件,获取rule,这种方式工作量比较大。
下面尝试运行一下程序,点击根目录下的SangforSeachBotGUI.exe,功能很简单,界面如下:
尝试点击快速扫描或系统扫描,发现会启动子进程SangforBotScan.exe和SangforForensicsMain.exe,子进程应该就是在做具体的扫描操作。进入bin目录看一下,发现存在SangforBotScan.exe和SangforForensicsMain.exe,SangforSeachBotGUI.exe应该只是个壳子,这两个进程应该才是主要的程序逻辑所在,初步猜测程序扫描过程应该为读取文件然后根据规则去做匹配。
扫描的过程应该是要访问规则文件的,通常的思路是对读文件相关的函数进行下断然后分析处理流程,我这里首先并没有这样做,而是尝试了一种更直接的方法,删除input\sf-base\virus目录下的rule文件,程序找不到rule文件应该会有一些提示信息,如果能触发异常更好,这样的话可以分析异常时的栈回溯信息寻找进一步的线索。
下面尝试删除input\sf-base目录,windbg中打开SangforBotScan.exe,运行之后果然触发异常,现场信息如下:
ida里面初步分析一下7-10行的几个地址,没有找到头绪。看一下SangforBotScan.exe界面上显示的信息,如下所示:
根据上面的异常信息,进入C:\Users\test\AppData\Local\Temp\_MEI26562\查看,目录结构如下:
根据文件名称推断可能用到了压缩算法和AES加密,ida里面粗略看了一下上面的pyd和dll并没有发现什么有价值的线索。
根据上面的异常信息推断SangforBotScan.exe是python写的,很有可能是使用pyinstaller等打包工具打包成exe的,google一下python的反编译工具看能不能反编译成源码,使用pyinstxtractor.py解包SangforBotScan.exe发现_MEI***目录下的文件就是从SanforBotScan.exe里面释放出来的,拖到ida里面F5看了一下,确实如此。之后就是反编译从exe里面获取到的一堆pyc,通过uncompyle反编译看了一下,文件有点多,对python也不熟,并且没有发现SangforBotScan.py,看了一堆东西之后放弃了这个思路。
尝试对常用的读文件函数下断,发现SangforBotScan.exe是通过MSVCR90!fopen函数读取enc文件的。
bp MSVCR90!fopen
查看栈回溯如下:
看一下python27!PyType_ClearCache+0x178是从哪个函数调用的。
再向上回溯看一下:
bp python27!PyType_ClearCache+0x176
python27!PyEval_GetGlobals+0x897处对应代码如下:
再向上回溯:
bp python27!PyEval_GetGlobals+0x892
python27!PyEval_GetGlobals+0x3c8处对应代码:
继续:
bp python27!PyObject_Call
没有找到重要信息,查api手册看一下上面分析过程涉及到的这些函数的描述信息,看看有没有线索。
PyObject* PyEval_EvalCode(PyObject *co, PyObject *globals, PyObject *locals)
Return value: New reference.
This is a simplified interface to PyEval_EvalCodeEx(), with just the code object, and the dictionaries of global and local variables. The other arguments are set to NULL.
PyObject * PyMarshal_ReadObjectFromString(const char *string, Py_ssize_t len)
参数string为地址,len为buffer的长度;成功返回一个新引用,失败返回NULL。
int PySys_SetObject(char *name, PyObject *v)
Set name in the sys module to v unless v is NULL, in which case name is deleted from the sys module. Returns 0 on success, -1 on error.
PyObject* PyDict_GetItemString(PyObject *p, const char *key)
Return value: Borrowed reference.
This is the same as PyDict_GetItem(), but key is specified as a char*, rather than a PyObject*.
PyObject* PyEval_EvalFrame(PyFrameObject *f)
Evaluate an execution frame. This is a simplified interface to PyEval_EvalFrameEx, for backward compatibility.
.........
一头雾水,还是没有线索。
之前排查目录下的文件时发现Temp\_MEI26562目录下存在yara.pyd,由此想到规则可能是yara格式,拖到ida里面看一下yara.pyd,排查一下导出表里面的函数,因为不熟悉还是要对着api手册看。链接如下:
http://yara.readthedocs.io/en/v3.5.0/capi.html
函数不多,一个一个看,没想到运气比较好,第二个函数就引起了我的注意,函数原型如下:
Compile rules from a string. Rules are put into the specified namespace, if namespace is NULL they will be put into the default namespace. Returns the number of errors found during compilation.
注意这个:Compile rules from a string.
感觉柳暗花明,赶紧对这个函数下个断:
bp yara!yr_compiler_add_string
因为是在子进程里面处理,下这个断点需要注意,步骤如下:
(1) windbg运行SangforBotScan.exe,勾选debug child process also
(2) 输入命令.childdbg
(3) F5运行断在子进程
(4) bp yara!yr_compiler_add_string,F5运行断在yr_compiler_add_string函数
代码如下:
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课