如何在Labeless的帮助下,全方位解析LockPoS恶意软件

Labeless是一个用于IDA和流行调试器的插件,是研究人员工具包中一个非常宝贵的工具。
Labeless的介绍
Labeless是一个用于IDA和流行调试器的插件,你可以点此下载。
Labeless允许我们在IDA中使用动态调试信息来丰富研究数据库,不过这些信息在静态分析中是不可用的。
以下是我们在Labeless帮助下解决的一些任务:
1.在不重构导入地址表的情况下,自动解析LockPos销售点恶意软件中的WinAPI调用;
2.在不知道加密算法的情况下解密Boleto银行恶意软件中的字符串;
3.在不知道哈希算法的情况下,通过Ramnit木马中的哈希解析函数名称。
Labeless的主要特点是节省研究人员的时间,以下是不使用Labeless分析恶意软件的流程:

使用Labeless,分析相同恶意软件样本的情况。

虽然Labeless不是万能的,但它肯定能够轻松提取关键的恶意软件细节。
该插件的其他功能包括:
1.使用自动解析WinAPI调用转储已调试的进程内存区域,忽略当前或不存在的导入地址表(IAT),这在以下情况下非常有用:
1.1当调试进程已提取或临时或注入模块时,而模块列表中没有显示该模块时;
1.2当具有无效PE标头的可执行文件驻留在此内存区域中时;
1.3当这样的可执行文件的IAT被破坏时;
2.将IDA数据库中的名称和注释发送到调试器,而这不依赖于IDA和调试器中映像库的可能差异。
2.1从IDA到调试器的一键式代码导航辅助功能,反之亦然。
3.Python脚本具有以下可能性:
3.1在调试器中动态执行代码,读取内存和寄存器,将这些结果发送到IDA端。
3.2完整的IDA脚本,具有将动态代码执行结果应用于静态IDA数据库的功能。
4.Labeless插件支持PE 或 AMD64二进制文件;
接下来,我们将结合实际示例,更详细地讨论每个方面。目录如下:
如何安装和使用Labeless
在这一部分,我们将指导你完成Labeless的安装。下面还提供了安装后步骤,以验证安装是否正确完成。
当然,如果你对所有Labeless内容都不熟悉,请参阅本系列的此文章。
安装环境配置
首先,让我们先讲解一些术语,我们将使用以下几个术语:
· 主机:IDA所在的设备;
· 后台:带调试器的设备;
虽然主机和后台可能是相同的,但我不建议这样做。在实践中,最好单独使用一台设备进行快照调试,另一台设备用于存储研究数据。这样一来,如果你想恢复到某些已保存的设备状态,将不会丢失研究结果。因为,这些结果会被安全地存储在另一台设备上的IDA数据库中,而它通常在主机上。然后,你可以将它们发送回调试器,并从此处继续分析。
下面,我们将介绍确保正确安装Labeless的所有步骤。
首先,你必须选择使用哪个版本的Labeless。
最新版本
你可以在此处找到包含最新版本二进制文件的链接。

此压缩文件包含适当文件夹中调试器和IDA所需的所有二进制文件:

例如,Olly 1.10的二进制文件位于 `.OllyDbg110plugins`中:

他的“AdvancedOlly”插件可以防止Olly 1.10在Windows 7上崩溃。这就是为什么它也存在于压缩文件中,以防你想在这个操作系统上用Olly 1.10测试Labeless。
例如,IDA 7.x的二进制文件位于 `.IDA7Xplugins`中:

最新开发的版本
带有二进制文件的压缩文件作为构建模块已被保留在“appveyor”服务上,你可以通过以下步骤找到。
首先,转到Labeless'`devel`,你可以点此进入GitHub页面。然后,点击最近提交的绿色复选标记:

然后会出现以下选项,我们对第一个的细节很感兴趣。

进入“appveyor”网站,点击“Artifacts”按钮。

现在,你可以在那里下载二进制文件。

该压缩文件包含所有必需的Labeless二进制文件,包括IDA和调试器。


Labeless安装步骤
使用二进制文件获取压缩文件后,应在主机和后台上执行安装步骤。它们将在下面的下一节中介绍。
拥有IDA的主机端
只需将IDA端插件(适用于x86和x64版本)复制到插件文件夹即可:

重新启动IDA,你将看到Labeless菜单。

请记住,只有在IDA中打开数据库时,Labeless中的许多选项才有效。
拥有调试器的后台
本节由两部分组成:
1. 一次性Labeless环境部署;
2.使用带有Labeless插件的调试器;
由于Labeless支持的调试器在Windows上运行,因此我考虑了这个操作系统。请注意,Labeless也支持用于Linux的IDA。
一次性Labeless环境部署
在开始使用Labeless之前,本节中描述的所有内容只能进行一次。执行此操作后,可以使用VM快照,以避免重复这个进程
首先,必须安装Python 2.7.x,它可以在这里下载。
然后,确保安装了`pip`,它包含在上面的包中,所以应该没有问题。
现在就开始Labeless部署,下面我们将会提供了两个单独的安装进程:一个用于Windows XP,另一个用于Windows Vista 及更高版本。
请注意,如果要使用x64版本的调试器,则必须对Python x64重复以下所有步骤。
Windows Vista 及更高版本
`Labeless`包可以通过`pip install`命令安装为任何其他包:
pip install labeless
控制台窗口中显示的输出如下:

注意:这个安装版本不能在Windows XP上工作,因为它还没有得到官方支持,并且目前还没有已发行的可信根证书,从而导致以下错误。

虽然有一些解决此问题的方法,但最简单的方法,就是为Windows XP提供单独的安装说明。
Windows XP
先从GitHub 下载最新版本的压缩文件,获取`deploy`文件夹并将其复制到计算机上的任何位置:

接着,我们将使用`C:Tempdeploy`文件夹:

现在是Python时间,首先,必须通过在`cmd`中执行这些命令来安装`protobuf`:
cd C:Tempdeploy
c:Python27python.exe setup_protobuf.py
结果应如下所示:

然后必须通过包含的`* .whl`文件安装Labeless:
c:Python27Scriptspip install labeless-1.1.2.48-py2.py3-none-any.whl
在使用`pip install`命令(上面的命令中的`1.1.2.48`,但在以后的版本中可能会更改)时,请注意Labeless版本。
出现以下内容,就表示安装成功。

运行带有调试器的Labeless
现在必须将插件复制到所选调试器的相应`plugin`目录中,可以采用列表中的任何调试器(如上所示)。
· OllyDbg 1.10
· OllyDbg 2.01
· x64dbg
让我们以Olly 1.10为例:

此时,插件菜单中应该出现新的条目。

注意:如果你没有在环境变量中设置Python27路径并且仅为当前用户安装了Python,请确保将`python27.dll`放在根调试器文件夹中。

将IDA连接到调试器
我们必须确保IDA看到调试器示例,因为IDA想知道后台设备的IP和端口。
通过以下`ipconfig`命令获得IP:

在调试器示例中设置端口:

默认情况下它等于3852:


在IDA中打开可执行文件,然后进入Labeless设置(Alt+Shift+E):

在相应的字段中输入给定值,然后点击“测试连接”。

然后会出现下面的窗口:

里面的内容表示:从IDA到调试器示例的已经成功连接。现在可以使用IDA获取来自调试器的信息,并且IDA可以将信息发送到调试器。
注意:别忘了按下选项窗口底部的“保存和关闭”按钮来保存输入数据。

Labeless的更新
要使后台的Labeless插件保持最新,只需输入以下命令执行即可
pip install -upgrade labeless
在命令行中,它将执行更新Labeless插件的所有必要步骤。注意:必须手动复制主机端IDA的更新二进制文件。
如何转储并自动解析LockPos恶意软件中的WinAPI调用
在本节中,我们将介绍如何转储并自动解析LockPos恶意软件中的WinAPI调用。
使用Labeless后,我们不需要手动重建一个损坏的导入地址表,只提取研究数据库中包含所有调用的目标代码部分。
本节我们还演示了如何自动将研究数据库中的信息发送回调试器,以便动态地监控已经研究过的LockPoS有效载荷中的恶意代码。
什么是LockPoS恶意软件?
LockPoS于2017年7月被以色列Cyberbit网络安全公司的研究人员首次发现,安全研究人员发现,LockPoS窃取与PoS信用卡扫描仪连接的电脑内存中的信用卡数据,之后将其发送至命令与控制(C&C)服务器。
此恶意软件本质上非常简单,主要包含以下功能(以版本1.0.0.4为例)。

如上图所示,分析的主要进程是打开样本并获得其有效载荷,使用的技巧包括:
1.通过`int 0x2E`指令调用某些函数,使hook看起来完全没用,更多信息请点击这里;
2. 在x86进程上下文中执行x64代码的可能性,如果它在x64操作系统中运行,那么调试器就会失败,WinDbg除外,更多信息请点击这里;
3.使用损坏的导入地址表后,恢复转储;
下面,我们将演示第三个技巧。
1.将进程内存转储到IDA
如上所述,我们发现样本已封装,跳转到原始入口点(OEP)准备转储。然而,这个进程并不顺利,因为一般情况下需要修复IAT。现在,我们在ImpRec中得到这个:

以下是在Scylla的情况:

显然,需要对流程内部进行更深入的研究。根据我们的经验,需要重建IAT来获得一个转储。
但我们是想获得一个有效的转储还是有效载荷,如果是获得有效载荷,那么与半手工的imprec /Scylla方法相比,Labeless方法更容易。因为在这种情况下,没有可用的物理转储文件来作为可执行文件或库,不过其代码将完全存在于IDB中。
当我们想要使用Labeless进行转储时,必须想好一个问题:是存储一个包含原始代码和转储内存的对应数据库还是将转储数据库与原始代码分开?
如果选择将转储数据库与原始代码分开,我们必须将它们保留在没有可用于构建数据库的原始可执行文件的位置。
这意味着现有数据库的副本应仅用作新创建的转储的容器。还有一种方法,就是在内置的Labeless选项的帮助下创建一个空的存根数据库。
1.1创建存根数据库
当IDA中没有打开数据库时,存根数据库用作转储内存的容器。此选项可在菜单中找到:

选择“是”后,下一个对话框建议选择要创建的数据库和名称。选择文件夹和名称后,就可以看到打开可执行文件后显示的相同对话框。

IDA将从屏幕上消失一段时间后,会再次显示创建的新空数据库。

1.2转储内存
与调试器建立连接后,我们可以进入以下菜单项。

“IDADump”菜单项下有两个选项:
1.删除所有现有内容并导入…
2.保持现有内容并导入……
第一种方法会删除整个数据库并导入选定的内存区域,第二种方法保存现有数据库并将导入的内存区域添加到其中。
我们选择了第一个选项(见截图),因为它将不同的模块保存在不同的数据库中,并且不会使一个主IDB与许多函数或名称或注释混乱。如果你想在代码执行的不同阶段的不同模块之间,构建一个带有引用的对应IDB ,请使用第二个选项。


整个进程内存都在这里,我们可以按原样转储内存区域,也可以选择手动模式并自行输入内容。
接下来的问题是究竟要转储什么?如果我们想手动重建IAT,可以转储我们要转储的相同区域。Labeless将处理其他所有事情,重建WinAPI调用就是最生动的示例。
在以下示例中选择一个区域:

选择内存区域后,会出现如下窗口:

然后Labeless会警告我们尝试重写IDB。我们选择`Overwrite`并继续。然后需要一些时间来完成该进程,完成后,输出窗口将显示神奇的`IDADump::nextState: done` 字符串。

打开导入窗口,解析WinAPI调用。

这与我们在ImpRec和Scylla中看到的完全相反。
有时会有消息说,在内存中遇到了类似函数地址的东西:

在这种情况下,“创建外部”意味着将内存解析为一个函数地址,而这正是我们想要的,现在可以像从可执行文件中打开转储内存一样来研究转储内存。
2.将IDA数据库信息发送到调试器
在IDA中研究数据库并不是分析恶意代码的最快方法。通常,引用动态分析(在调试器中)是很有用的,如果反汇编列表中包含符号的信息,那就更好了。
它只需用名称和注释填充调试器列表即可,比如Olly 1.10中的这个无名列表。

这一点并不明显,让我们转到IDA中的Labeless设置(Alt + Shift + E)并测试插件的可能性。

出现以下窗口:

列出的每一项要素的说明如下:
1:IP代表调试器中Labeless示例的端口;
2:打开或关闭自动名称同步标记,以在IDB内重命;
3:进程内存中目标模块(必须使用符号)的图像库;
4:必须以标签的形式发送到调试器的内容;
5:必须以注释的形式发送到调试器的内容;
按钮操作如下所述:
B1:测试IDA和调试器之间的连接。
B2:将符号发送到调试器。

然后按下“立即同步”按钮,检查调试器列表后,所有的名称被应用。

研究过的函数现在得到了恰当的命名,未研究的函数保留原样,添加评论(如果有的话)。现在,导航列表变得更加容易阅读了。
另外,IDA中可以看到完整的同步标签和评论。

2.1自动同步
如果选中“重命名时自动同步”标志,那么将信息发送到调试器的进程根本不需要任何用户交互。如果你重命名一些东西,IDA会显示以下变化。

并立即将更改内容发送到调试器:

2.2跳转到IDA
在IDA中,我们要多次复制地址,并在调试器中按“Ctrl + G”跳转到所选地址。这个过程太麻烦,而Labeless则提供了简化此进程的快捷方式。

`Shift + J`:调试器的当前活动地址中跳转到IDA:

`Ctrl + Shift + J`则相反:从IDA跳转到调试器的当前活动地址:

另外,LazyIDA插件只需单击一下按钮,即可将当前地址复制到剪贴板。 OllyTiper插件对OllyDbg 1.10也是如此,x64dbg中也有一个快捷键“Alt+Ins”。