
对于那些已经对
crackme拼图足够玩的人,我们带来了一个新的Trojan。 在野外,仍然可以在其自然栖息地-垃圾邮件中找到Hancitor下载程序。 当前,它被积极地用于下载熊猫银行木马,这是臭名昭著的宙斯的一种改进。
一个寒冷的夏天晚上,我们面对面见了他,看着垃圾邮件。 如果您想观看恶意软件的内幕,请阅读我们的新反向解析。
我们的恶意文档如下所示:

默认情况下,宏被阻止,因此系统警告:“宏已被禁用。” 但是,消息的内容表明应包含宏。 好吧,让我们做吧。 单击“启用内容”按钮后,计算机被感染。 现在,让我们看看执行哪种宏以及感染如何发生。 可以通过在“视图”->“ Vacros” \“查看宏”选项卡中立即在Word中完成此操作。

您可以做的更专业-使用oletools软件包中的olevba。 您可以在链接处安装软件包。 接下来,键入olevba doc_file –c –decode> source.txt并获取宏源。

通过代码,我立即想说木马属于下载程序类。 该脚本只是从某个地方散播到Malwara。 为了证明这一点,让我们解码base64字符串。 对于我们来说,通过hiew立即执行此操作更为方便,这样我们就不会复制粘贴一百次。 为此,我们使用一个特殊的插件,在此进行介绍。 这是发生了什么:

这是一个恶意脚本,分为两个部分并另存为1.hta。 原则上,我们对其运作方式并不特别感兴趣。 这都是很平常的事。 唯一重要的一点是确定下载恶意文件的URL。 让我们尝试找到他,因为此信息可能对
安全性有用。 他们可以添加网络规则以阻止对此类URL的请求,从而可以避免公司受到感染。
哈! 没有链接。 但是6.exe文件从哪里开始(以1.hta开始)? 是时候再看一下hiew中的dock文件了,但是要更加小心:

是的,dock文档中内置了exe-shnik。 是的,而且包装很重。 让我们解释发生了什么。 宏将恶意的1.hta脚本放到Temp文件夹中并启动它,然后1.hta从其目录中启动6.exe。 显然,6.exe是我们在屏幕上看到的相同的打包PE-shnik。 但是现在我们想知道6.exe如何降低%temp%。 发生这种情况的原因是Microsoft Office套件中的一项有趣功能。 事实是,在任何OLE文档中,都可以嵌入Ole10Native格式的任何其他文件。
如果是这种情况,则在启动时,MS-Office本身会以Ole10Native结构头中指定的名称将以此方式生成的文件拖放到%temp%文件夹中。 让我们看一下这个对象。 FAR-manager-
OLE2Viewer插件帮助我们。 我们在插件中打开恶意文档,转到ObjectPool \ _1593522492目录,然后看到以下内容:

复制此文件(Ole10Native)并在hiew中打开。

在这里,我们看到OLE对象的名称-5c.pif将放入%temp%文件夹中。 现在回到我们的宏。 他的任务是启动一个醉酒的exe-shnik。

实际上,确切地说,该宏并不总是通过1.hta来启动删除的文件,而是还像这样:Shell“ cmd.exe / c ping localhost -n 100 &&”&Environ(“ Temp”)&“ \ 6 .pif“,vbHide

如我们所见,启动方法取决于系统中是否存在以下进程:bdagent.exe和PSUAMain.exe。 为什么然后需要ping localhost -n 100? 以防万一,这是古希腊人为制造人为延迟的技巧。 通常,它的变体用于自我删除。
在此阶段,我们检查了恶意文档的操作。 一眼看上去,该文件本身并不属于Trojan-Downloader类型的恶意软件,但它适合Trojan-Dropper类型。 这是启动时发生的事情:

现在仍然需要自行拆卸有效载荷。 我们已经意识到木马已经打包,因此我们必须先将其解压缩。 通常,此过程分为两个阶段:
1.卸下解压缩的转储+恢复导入表。
2.分析和纯化全局变量。
我们需要第二阶段,因为有许多API函数会由于它们的工作而将非重复值返回给我们。 例如,CreatHeap将向我们返回一个堆描述符,该描述符将进一步用于工作。 通常,代码中会进行类型检查:
如果堆描述符== 0,则获取堆描述符,否则使用已经初始化的堆描述符 。 但是在转储时,包含给定描述符的变量已经由他初始化,并且那时描述符是有效的。 当我们尝试开始转储时,带有描述符的变量将包含旧值,即不等于0,这意味着测试将通过。
此后,一旦程序尝试使用此描述符,操作系统将引发异常,程序将因错误而崩溃。 因此,为避免这种情况,您需要将这些变量清零。 它们通常位于数据的可写部分。 可能您建议在十六进制编辑器中打开此部分并用零覆盖所有内容? 您的观点是正确的,但您不应轻率地采取行动。 有一些木马程序检查变量不是在0上,而是在随机DWORD上。 并且根据测试是否被测试,采取各种措施。 您不必走得太远,例如。 只需看一下
Cridex (最近它就已经从雷达中消失了,显然已经完全升级到了EMOTETA)。
因此,让我们运行示例(当然是在虚拟机中)。 还希望将离开虚拟机的流量通过VPN。
我们启动了特洛伊木马程序,该程序只是挂起。 太好了! 通常,木马会快速执行操作,然后立即结束并自我毁灭。 因此,您必须在代码中寻找负责这些操作的位置,暂停它们,然后转储。 就我们而言,我们可以那样做。
对于转储,我们使用了出色的实用程序-Process Dump,可在
此处找到。 该实用程序不仅找到所有隐藏的可执行模块并将其转储,而且还还原了导入表本身。 该实用程序必须以管理员身份通过以下方式运行:pd / pid xxxx,其中xxxx是Trojan进程的ID。 之后,该实用程序将转储所有过程模块。 我们删除了多余的,剩下的就是:

Trojan进程的可执行文件的名称是1.exe。 事实证明,解压后的木马位于0x2C0000。 在hiew中打开它:

只是眼睛高兴! 现在该文件已解压缩,清晰可见。 导入表也被识别。 让我们在IDA-PRO中打开它。

在对示例进行排序时,我们已经重命名了一些函数。 特洛伊木马首先要做的就是确定其模块的加载地址。 真的:他怎么知道他的存根打开了什么地址? 这是通过一种古老的行之有效的技术完成的-将内存页面相对于当前地址的位置翻转回0x1000,直到遇到“ MZ”字节为止。 这是可行的,因为可执行模块始终将OS加载到0x1000倍数的地址上。 自己检查一下。 在我们的情况下,设置的剥离限制为100。

如果某人不了解哪里有倒退,那么这里是:
结果+ = 0xFFFFF000等效于结果-= 0x1000。
收到其模块的下载地址后,解包的特洛伊木马会收到其操作所需功能的地址。 首先,搜索两个函数的地址-LoadLibraryA和GetProcAddress。 知道了这些功能的地址后,您就可以使用它们来获取所有剩余的功能。 这些函数在kernel32库中。 通过读取环形列表的第一个(零-ntdll,第一个kernelbase等)元素来获取其地址,该元素描述了使用_LDR_DATA_TABLE_ENTRY结构按初始化顺序加载的所有模块。 指向列表的指针是从PEB中提取的。

接收到地址kernel32.dll(从Windows 7开始-kernelBase.dll)后,木马可以手动解析其导出表并找到必要的两个功能,这些功能可以在sub_EF1E60子例程中执行。

现在看一下我们称为getHeap的函数。

在这里,我们仅观察到上述情况。 在转储时,hHeap变量包含的值为600000h。 因此,将不会调用GetProcessHeap。 相反,程序将转到loc_EF11DD标签,在该标签中使用无效的句柄调用HeapAlloc,这将给我们带来错误。 因此,我们采用十六进制编辑器并将此数字清零。 我们计算了六个类似的地方。
接下来,乐趣开始了。 特洛伊木马根据硬盘的序列号和MAC地址生成唯一的“客户端” ID。 此处收到的信息:

我们还会得到以下信息:IP地址,操作系统版本,网络名称和用户名。 基于所有这些,将向管理面板生成一个HTTP请求,我们尚不知道其地址。 它不在生产线上(即使是未包装的形式)。 但是它不存在,因为它已在配置中加密。 可以从代码中提取其地址:

该配置的权重为0x2008字节,格式如下:前8个字节是RC4密钥,0x2000字节是加密数据。

从以下清单中可以清楚地看到使用RC4加密算法的事实:

请注意,仅前8个字节并不是RC4的关键。 关键是这些字节的SHA1哈希。 您还需要注意函数CryptDeriveKey的标志0x280011。 MSDN关于此标志有免责声明:

从中可以明显看出,该标志的高16位以位为单位设置密钥大小。 也就是说,密钥大小以字节为单位:(0x280011 >> 16)/ 8 =5。因此,密钥将是配置的前八个字节中哈希值的前五个字节。 让我们转储配置并编写一个Python脚本,它将为我们解密。 该脚本如下所示:

他的工作结果就是config.rc4文件。 在hiew中打开它:

我们看到一个解密的管理区域列表。 第一个单词是“ 19nep07”-内部版本号。 为此分配了16个字节。 接下来是用“ |”分隔的管理URL列表。
因此,第一次调用管理面板将采用以下格式:
GUID = 3068075364164635648&BUILD = 19nep07&INFO = WIN-56G04BL06SL @ WIN -56G04BL06SL \反向&IP = 35.0.127.52&TYPE = 1&WIN = 6.1(x32

然后,首先在管理面板列表中发送生成的请求。

接下来,如果仍然有效,则读取来自管理员的响应。 答案应为base64编码。 如果不是这种情况,则使用列表中的下一个管理员。 有时现场管理员会返回一个奇怪的答案:

很熟悉,不是吗? 是的,这些是相同的
数字 ! 实际上,一位作者知道为什么管理员开始退还他们! 正常情况下,命令返回。 不幸的是,由于没有流量,所以不可能完全确定地说响应格式是什么,所有管理员都死了。 解码后的文件将另外解码为0x7A:

响应中应包含一个命令。 如果不是,请转到下一个管理面板。 命令代码编码为“ x:”,其中x是编码特定命令的字母。 其中有7个:“ r”,“ l”,“ e”,“ b”,“ d”,“ c”,“ n”。 考虑“ b”和“ r”命令。
这些命令的处理程序具有相同的功能。 我们将其命名为GetExe。 看起来是这样的:

我认为这里一切都清楚了。 特洛伊木马发出http请求,并以压缩形式返回可执行文件作为响应,然后将其解压缩。 这样就有可能出现变化。 对于“ b”命令,将发生以下三个操作:
1.以冻结形式创建svchost进程
2.注入下载模块过程的地址空间
3.控制权转移到注入的模块
对于r命令,将发生以下三个操作:
1.通过调用GetExe函数下载可执行文件。
2.将下载的文件以随机名称保存到临时文件夹中。
3.启动删除的文件。

完成
PS下次我们可以解析Panda或某些加密器。 在评论中写下您最感兴趣的恶意软件(当然,是出于研究目的)。