病毒是如何将文件藏进注册表的
本文将介绍一种将可执行文件隐藏在Windows注册表的方法,包括将可执行文件部分或全部藏入注册表,之后再加载执行。攻击者往往未避免在二进制文件中出现恶意代码,把执行恶意功能的代码放在注册表的多个键值中,使得杀毒软件难以检测。这也是常见的恶意软件所采用的方法。
把文件放进注册表
第一节是关于将文件放入注册表中的。我们会介绍如何将一整个文件分割,然后分别写入多个键。之后会介绍怎样获取、拼接、执行这个文件。关于如何将文件存入注册表的方法有很多。注册表有不同的键值类型,能够存储各种类型的数据,包括原始二进制数据,32/64位值,还有字符串。在本例中,文件会经过Base64转码,然后以string (REG_SZ)类型写入。
把数据写入注册表的过程很简单。过程包括使用RegCreateKeyEx函数打开一个已存在的键的句柄,或者新建一个键,之后在调用RegGetValue和RegSetValueEx执行读写操作。以下的示例代码展示的就是这三个步骤:
const HKEY OpenRegistryKey(const char * const strKeyName, const bool bCreate = true)
{
HKEY hKey = nullptr;
DWORD dwResult = 0;
LONG lRet = RegCreateKeyExA(HKEY_CURRENT_USER, strKeyName, 0,
nullptr, 0, KEY_READ | KEY_WRITE | KEY_CREATE_SUB_KEY,
nullptr, &hKey, &dwResult);
if (lRet != ERROR_SUCCESS)
{
fprintf(stderr, "Could not create/open registry key. Error = %X\n",
lRet);
exit(-1);
}
if (bCreate && dwResult == REG_CREATED_NEW_KEY)
{
fprintf(stdout, "Created new registry key.\n");
}
else
{
fprintf(stdout, "Opened existing registry key.\n");
}
return hKey;
}
void WriteRegistryKeyString(const HKEY hKey, const char * const strValueName,
const BYTE *pBytes, const DWORD dwSize)
{
std::string strEncodedData = base64_encode(pBytes, dwSize);
LONG lRet = RegSetValueExA(hKey, strValueName, 0, REG_SZ, (const BYTE *)strEncodedData.c_str(), strEncodedData.length());
if (lRet != ERROR_SUCCESS)
{
fprintf(stderr, "Could not write registry value. Error = %X\n",
lRet);
exit(-1);
}
}
const std::array<BYTE, READ_WRITE_SIZE> ReadRegistryKeyString(const