被调试的母体文件为.NET平台程序,内部会进行内存解密释放执行新的dll文件。可以直接使用dnSpy一步步调试,进而直接进入新dll程序领空。这里举一个笔者之前分析时接触的案例,如下恶意文件会从资源获取16个字节数据作为密钥,便于后续进行解密。
经过下面的逻辑进而解密会得到新的PE文件(此时都发生在内存中),如下。
这里先自行提取下便于后续判定,提取的PE文件分析后为.NET平台的dll文件,如下。
接着往下分析,发现会内存加载dll并反射调用执行dll中的LOLY()方法,如下。
将上面提取的dll进行本地反编译,查看下dll文件内容,如下。
确实存在入口点方法,如下。
接下来,就可以直接一步步单步步入调试进入dll区域内,进入到入口点,如下。
之后的调试不再叙述,基本上是与之前进行分析时一样的步骤。
被调试的母体文件非.NET平台程序,而由于缺少标准入口点,dnSpy不允许本地调试dll,此时就需要借助loader进行调试。首先我们可以想到,ollydbg是如何调试dll文件的?其实会发现工具自身会加载一个loader进行辅助调试,调用dll里的导出方法或者断点停在dll入口区域。
如果是需要调试.NET平台dll文件,可能需要自行写一个.NET平台的loader,然后根据具体需要修改要调用的导出方法。本着不重复造轮子(其实是不太会写代码)的思想,于是网上搜了下,发现了如下工具(具体更多内容可以自行访问项目地址查看,这里不再过多介绍)。
hexfati / SharpDllLoader:一个简单的C#可执行文件,它调用任意C#DLL的任意方法。
https://github.com/hexfati/SharpDllLoader
下载到本地后,找到sln解决方案文件打开。
这里有一个坑是如果调试的dll为32位环境,则需要将项目编译成x86架构。
使用dnSpy打开上述编译完成的exe文件,找到入口点,如下。
设置好断点,启动调试。
参数部分填写的格式为:-d "C:\Users\onion\Desktop\phone\pe.dll" -c LOLY -m LOLY
-d 后接需要调试的dll的绝对路径
-c 表示该dll的调试的类
-m 表示该dll调试的实际方法
选择中断到入口点,如下。
一步步单步就可以进入dll领空,如下。
之后的调试与普通的调试.NET平台恶意文件一致,这里不再继续叙述。