|
嗨,恶意软件分析师们
是的,终于在停止写博客 4 个月后,我决定刷新我的恶意软件分析技能并尝试编写一个与恶意软件分析相关的简单教程。我将分享一个关于如何使用 Dumpulator 模拟恶意软件的简单教程。
为何需要模拟?
恶意软件分析的一部分是尽可能多地收集有关恶意软件的信息,例如获取恶意软件加密密钥、CnC 服务器 IP 和端口等。我们知道恶意软件的创建者总是会逃避这些信息,例如通过简单的分析实现加密、栈串、加壳等。问题是为什么我们不只是将其上传到沙箱并获取可能的信息?恶意软件开发者通常会将他们的可执行文件分成几个阶段以保持他们的二进制文件很小并且看起来合法以逃避保护。当受害者执行第一个可执行文件时,它被称为下载器,然后它将下载实际的恶意负载。当我们在沙箱中执行此操作时,我们将获得下载器和实际有效负载之间混合的完整信息报告。
因此,如果只对特定阶段和特定代码执行感兴趣,那么仿真是一个不错的选择。Dumpulator 允许我们编写 python 脚本来模拟执行或调用特定代码,以帮助我们解决一些复杂的规避程序。可以从 https://github.com/mrexodia/dumpulator 下载
我创建了一个非常简单的 C 代码,只是为了说明如何模拟函数调用。
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
-
- static char MyData[11] = "Rio Asmara";
- char MyData2[11];
-
-
- char * setupString() {
-
- memcpy(MyData2, MyData, 11);
- return MyData2;
- }
-
- char* setupIP() {
- int size = 9;
- char myIP[9];
- myIP[0] = '1';
- myIP[1] = '0';
- myIP[2] = '.';
- myIP[3] = '1';
- myIP[4] = '.';
- myIP[5] = '1';
- myIP[6] = '.';
- myIP[7] = '1';
- myIP[8] = '\0';
- char * ip = (char*)malloc(size * sizeof(char));
- memcpy(ip, myIP, 9);
- return ip;
- }
-
- int main()
- {
- printf("Check Me : %s\n",setupString());
- printf("Check Me : %s", setupIP());
- }
复制代码
我们有两个函数将在执行期间构建字符串,让我们假设这两个函数执行非常复杂的加密代码,很难对其进行静态分析,从而阻碍恶意软件分析师轻松获取恶意软件配置或 IOC。
MiniDump
要进行仿真,需要做的第一件事是创建恶意软件的内存转储。可以使用 x64debug 来完成这个任务。
在 x64debug 中运行恶意软件,让它在可执行文件的入口点停止。加载恶意软件后,只需单击一次 "运行" 按钮
接下来要做的是键入 MiniDump,后跟文件名。在这种情况下,我给出文件名 crack.dmp
获取基地址
接下来是从内存转储中获取 PE 基地址,这对于允许您在 IDA 中重新设置映像入口点的基础非常重要,这样就可以在 IDA 和内存转储之间拥有相同的寻址。
编写这个 python 脚本并运行它。 将转储程序指向内存转储文件的路径
- from dumpulator import Dumpulator
-
- if __name__ == '__main__':
- dp = Dumpulator("C:\\Apps\\xdbg\\release\\x64\\crack.dmp", quiet=False)
复制代码
找到圈出的信息作为内存转储的基线地址
它需要加载 Dumpulator 库。如果使用 pycharm,则可以按照以下步骤安装它。 前往设置
Press + button to add module
在搜索上搜索 dumpulator,选择模块并安装包
在 IDA 中找函数地址
接下来的步骤是找到我们要模拟的函数的内存地址,在 IDA 中打开恶意软件二进制文件。
Image Rebase
在 IDA 中成功打开二进制文件后,需要按照以下步骤进行 rebase
将 python 代码输出中的基地址复制到 IDA 并单击 OK
找出函数地址
可以看到,我们将使用转储器仿真调用两个函数,setupString 和 setupIP
从上面的代码我们可以看出,这两个函数都会从其复杂的代码中返回值,我们想看看这两个函数的返回值是多少,所以让我们跳进那个函数并获取它的地址
可以看到该函数从我在下图中圈出的地址开始,该地址表示该函数的起始地址,让我们复制那个地址
我们可以对 setupIP 函数执行相同的步骤。
模拟函数调用并读取返回值
一旦我们收集到函数地址,下一步就是编写下面的 python 代码来模拟调用
- from dumpulator import Dumpulator
-
- if __name__ == '__main__':
- dp = Dumpulator("C:\\Apps\\xdbg\\release\\x64\\crack.dmp", quiet=False)
- result = dp.call(0x7FF6B4351790, [])
- ipAddress = dp.read_str(result)
- print(f"decrypted: '{ipAddress}'")
-
- result = dp.call(0x7FF6B4351910, [])
- malSignature = dp.read_str(result)
- print(f"decrypted: '{malSignature}'")
复制代码
上面突出显示的代码是调用模拟发生的地方,因此我们需要放置在 IDA 中找到的地址。可以尝试运行上面的代码,结果如下图所示
可以看到,无需进行繁重的逆向工程来读取和解码加密算法(哈哈哈),我们只需模拟调用并获得我们需要的实际字符串(IOC)。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|