这里我将对一个典型的适合新手进行分析的C#远控样本进行分析,来对一些基础的C#分析技术点进行说明。
描述 | 信息 |
---|---|
MD5 | BFA95399E5F9413A0EC9289FAA1DC801 |
之后右键Go To Entry Point即可跳转到main函数,一般来说程序具有窗口(无论隐藏与否)时,main函数都是用来调用Application.Run()进行窗口的启动(学过SDK/MFS的同学应该不陌生,这就相当于启动了窗口的消息循环):
一般来说,恶意操作都会在隐藏窗口类中进行,我们只需向下寻找即可。向下分析后果然找到了内嵌ShellCode代码:
这里提一句,在Dnspy中也可以进行交叉引用的分析,只要选中函数名或变量名,然后右键Analyze即可打开对应窗口进行查看,很方便:
运行到解密完成后,观察 rawAssembly的值:
将其中数据拿出后,发现解密后的shellcode为一个PE格式的恶意代码:
通过Locals中右键rawAssenbly进行save操作,将shellcdoe保存到本地,留待稍后分析。
描述 | 信息 |
---|---|
MD5 | 501FEB03129FF392F6FFB5AEEC900356 |
名称 | CoreFunctions.dll |
我用到了VS进行Loader的编写,这里有个要注意点是,在using dll时,用到的dll名称要和将dll拖入dnspy中反编译出的命名空间名称一致即为CoreFunctions,代码的编写很简单,只要将对应的Main函数调用并传入上述抓取到的参数即可:
CoreFunctions.Class1.Main("02bc3.resources", "5de4f.png", "JV6tiESFB", null);
切记:建议向我这样加上一个窗口和调用按钮,防止在编译exe时不小心加载了恶意dll。当然也可以不加,不过就需要时刻注意自己生成exe的方式为右键重新生成而不是直接Release。
获取样本完整路径->加载样本的资源(“02bc3.resources”)->遍历资源找到"5de4f.png"的数据->对数据进行处理并以"JV6tiESFB"作为Key来解密数据->得到新的恶意代码并执行
资源如图所示:
描述 | 信息 |
---|---|
MD5 | B9C0837EED92228BFD8C55E2D40630D6 |
名称 | ReZer0V2.exe |
分析调用后会发现,其会从EntryPonit入口点开始运行代码,样本是一个C#的exe,可以直接进行调试分析,调试方法和最初样本一样。
这份恶意代码又加入了新的东西,那就是C#程序防止反编译常用到的混淆操作。由于有混淆不能正常调试,所以调试之前先使用de4dot进行解混淆操作(大部分情况下不能解出正确的函数名,只是使得代码更加易读一点)。de4dot用法是将C#程序拖到de4dot.exe上执行即可(版本选择正确),也可以cmd命令行执行,看你个人选择。
创建互斥体"FWYvRWJ"防多开、睡眠主线程
查询指定文件:"C:\Users\Administrator\AppData\Roaming\wpohqL.exe"
是否存在,不存在生成,完成对最开始样本的复制存储
之后调用函数smethod_6进行操作:
主要完成了如下操作:
向路径"C:\Users\Administrator\AppData\Local\Temp"下生成了一个临时命名的临时文件,将资源中的XML数据进行替换之后填充临时文件,如图所示:
之后构造一个进程启动信息,然后启动进程 schtasks.exe,输入命令为:/Create /TN ”Updates\ wpohqL" /XML “C:\Users\Administrator\AppData\Local\Temp%.tmp”,创建一个计划任务,任务目的是在用户登录时启动程序:C:\Users\Administrator\AppData\Roaming\wpohqL.exe,完成对样本副本的持久化
最后程序流程执行到运行一个新的恶意程序
描述 | 信息 |
---|---|
MD5 | eb5e1c063fab1a1a0f93ab615b72b461 |
这个恶意程序就是做恶意操作的主要程序,有以下恶意行为:
通过动态获取API地址来进行功能的实现,程序内置hash后的API名称字符串,通过函数sub.004031E5获取
利用SetErrorMode()来进行反沙箱操作
调用advapi32.dll中的函数来计算出一个唯一hash,用于创建互斥体,图中一个为计算之前的,圈出来为计算之后的互斥体名称,检测多开
第一个call:
获取注册表信息,修改FirFox配置进行流量劫持:
"SOFTWARE\Mozilla\Mozilla Firefox"拼接为完整信息“SOFTWARE\Mozilla\Mozilla Firefox\53.0 (x 86 zh-C)\Main”,并向path环境变量中添加新的路径:“C:\Program Files\Mozilla Firefox”
检测nss3.dll是否存在,存在加载dll,动态获取API
获取的API有:
NSS_Init、NSS_Shutdown、PK11_GetInternalKeySlot、PK11_FreeSlot、PK11_Authenticate、PK11SDR_Decrypt、PK11_CheckUserPassword、SECITEM_FreeItem
之后大范围去将“\AppData\Roaming\Mozilla\Firefox"+下图所示的路径拼接:(图示为一部分)
然后利用nss.dll对Firefox配置进行一些列操作
第二个call:
释放隐藏的副本文件
用于在本地"\ AppData\ Roaming\ "创建一个新目录,并向其中存放样本副本,同时为目录和副本都设置隐藏属性,路径如下:
第三个call:
构造Socket套接字,建立TCP远程通信,上传获取到的所有本机信息,等待后续远控
获取信息:
建立连接:
C2信息如下:
URL:hxxp://broken6[.]cf/L8/fre.pnp
IP:104.27.145.219:80
Md5:
BFA95399E5F9413A0EC9289FAA1DC801
501FEB03129FF392F6FFB5AEEC900356
B9C0837EED92228BFD8C55E2D40630D6
eb5e1c063fab1a1a0f93ab615b72b461
URL:
hxxp://broken6[.]cf/L8/fre.pnp
Domain:
broken6[.]cf
IP:
0
Md5:
BFA95399E5F9413A0EC9289FAA1DC801
501FEB03129FF392F6FFB5AEEC900356
B9C0837EED92228BFD8C55E2D40630D6
eb5e1c063fab1a1a0f93ab615b72b461
URL:
hxxp://broken6[.]cf/L8/fre.pnp
Domain:
broken6[.]cf
IP:
104.27.145.219:80