我目前正在研究一个主题,老实说,我缺乏确定这是否可能的知识。
我想知道,当我没有源/PDB时,是否可以理解.NET应用程序的进程内存。我的意思是,如果我找到某个起点,比如一个已知的字符串值,我就可以重建一个对象图。
我们希望保护从加密的配置文件反序列化的程序配置。它在内存中未加密。配置图中的单个值并不是真正的秘密,但图本身是有价值的。
问题是,是否可以仅从过程记忆中重建图形?
假设攻击者知道如何使用dnSpy之类的东西来重建程序集(我们也在磁盘上保护这些程序集(,并且我们不想混淆配置程序集(这需要大量更改(,那么攻击者能否根据我们进程的原始内存来重建或理解实例?
我试着对此进行研究,但我找不到合适的方向/好的关键词。
我知道像CheatEngine这样的工具是存在的,或者我可以简单地清空整个内存并尝试理解它。
但我想知道是否有一个.NET工具可以自动化这个过程:
- 使用配置类读取反编译的程序集
- 连接到进程并转储内存
- 理解位和字节,并与反编译的类组合以重建实例层次结构
我的主要目标是决定是否需要对内存中的配置图进行额外的保护。如果重建图形不容易,那么我认为不需要它。但是,如果它能像反编译.NET应用程序的源代码一样简单,我认为需要一些保护。
"当我没有源/PDB时,可以理解.NET应用程序的进程内存">
是的,这是可能的。在.NET中有一个概念叫做垃圾回收。垃圾收集器需要知道内存的样子,否则它就无法完成他的工作。这需要在客户的机器上工作,这些机器没有PDB,也没有源代码。
有一个称为MSCORDACWKS的DLL,它是微软的MS(可能(、.NET的COR和";数据访问控制";和WKS;工作站";。此名称中的DAC正是您所需要的。
通常情况下,您不会自己这样做,而是使用调试器(Micosoft-WinDbg(和.NET扩展(SOS(,它知道如何处理DAC来理解内存。
有关这些主题的示例和其他问题,请参阅windbg和sos。事实上这很容易。尝试!dumpheap -stat
获取所有.NET对象的列表。
问题是是否可以仅从进程内存重建图形?
如果您愿意,可以使用!gcroot
开始构建对象图。
对于对象图,您可能会更好地查看构建此类图的现有工具,如Jetbrains dotMemory等内存泄漏工具。
配置图中的单个值并不是真正的秘密,但图本身是有价值的。
这可能是在代码中调用GC.Collect()
以强制执行乱码集合的情况,这样图就不见了。但是,使用调试器可以在调用之前停止进程。
是否需要对内存中的配置图进行额外保护。
IMHO,是的。并用C++等原生语言实现。