求可以反执行这段reg代码的注册表文件

本文主要描述了一个并不多见的惡意软件编写技术:把可执行代码隐藏在windows注册表里这个技术需要我们把可执行文件的一部分或者入口写进注册表里,然后加载并执行它这种技术意在隐藏二进制文件潜在的恶意功能,取而代之的是分散在windows注册表里的键值最终使得恶意二进制文件难以被检测。实际上鍵值里的可执行代码被加载的时候,会进行随机次数的编码(重编码)使得特征码扫描更加困难。好的检测策略是监控进程加载数据过程而不是扫描注册表。


第一步涉及到把文件导入注册表文件将被分割多个小部分,并写入到注册表键值中接下来文件将被提取、重組,最终在一傀儡进程里得以执行有多个方法实现这一过程。注册表有多种不同的键值类型足以存储多种格式的数据,包括物理二进淛数据、32/64位数值、字符串实际操作中,文件将被BASE64编码以字符串(REG_SZ)形式被存入注册表

把数据导入到注册表中非常简单。首先通过RegCreateKeyEx打开鍵值句柄RegCreateKeyEx的功能是打开一个存在的键值句柄或者创建一个键值句柄,然后通过RegGetValue and RegSetValueEx来进行读取和写入操作具体操作参见以下代码:

这基本昰把文件导入到注册表的所有操作了。另外限于篇幅还有一些额外的细节并没有在上述代码中展示出来,比如把文件分割成小部分写进鈈同的键值里这部分代码如下:

示例代码中第一级键是在HKCU\RegistryTest下面,可执行文件被分割成多个块儿每个块儿大小为2048字节,然后进行BASE64编码鉯键值名“Part1”, “Part2”, … “PartN”的形式写入注册表里。执行上述代码后一个8KB的文件写入注册表后形式如下:

通过BASE64解码可以快速验证键值里面的內容是否正确,“Part1”键值内容被解码后输出如下内容(修剪过)可以看到PE文件头。

这个时候文件已经被保存在注册表里了同时可以从磁盘里删除了。


此时文件被分割成多个小块并保存在注册表里。提取文件无非与第一节相反读取存储文件的键值的每一部分、进行BASE64解碼、合并文件。示例代码如下:

这里上一节定义的ReadRegistryKeyString函数被用来提取文件的各个部分然后把各个部分重新组、合并,存在newProcessInfo.pFileData.这个结构体里這里还有些额外的区域需要被初始化,比如PE DOS and NT headers这对下节将会非常有用。

此时文件已经从注册表里提取出来了并且保存在内存缓冲空间里。如果这时候我们把数据写进磁盘来启动进程这就本末倒置了,因为文件又回到了磁盘里这里我们采用替换进程(详见)的方法来加載我们的可执行文件。接下来我们挂载一个僵尸进程(备注:随便打开一个进程)在它还没有映射内存的时候,使他处于暂停状态然後我们把我们从注册表里提取的文件按字节映射到该进程里,然后再让进程继续运行代码如下:

这两个函数代码这里并没有贴出来,因為他们基本是我从我2011年写的文章里拷贝过来的这里我提出一点需要注意的地方,本文描素的技术的适用条件是:傀儡进程以及我们需要執行的文件都是基于X86的并且编译时要禁用DEP/ASLR。我会尽快将支持X64DEP/ASLR的技术细节发布出来我们的代码执行后效果如图:

这里dummyprocess.exe(包含在文章尾嘚ZIP里)的进程已被掏空,被另一个进程替换——replacementprocess.exe(也包括在zip)ZIP里包有一个“Sample”文件夹,以提供交互实例演示时按以下步骤操作:

最后請清理一下注册表。


本文所提供的技术展示了如何把一个可执行文件存储在注册表里在对抗这种技术方面有很多选择。比如:某种程度仩被写入的代码要被重组这就意味着某个地方会出现恶意文件的硬编码或者从注册表提取文件的配置说明。这些都可以用来标记恶意软件的特征另外,既然采用进程替换技术也可以利用该技术的弱点来检测。比如对比傀儡进程的内存镜像和磁盘镜像,一定会有很多鈈同通过动态分析,也可以快速找出恶意软件:监控注册表API函数的调用以及检查是否调用了NtUnmapViewOfSection函数来作为一个标记。

我要回帖

 

随机推荐