顶级技术:CLR/JIT操纵字符串的内存地址

💡 原文中文,约3000字,阅读约需8分钟。
📝

内容提要

本文介绍了字符串在前端和后端存储的不同状态,以及如何在CLR/JIT中分析和查找被加密的字符串。通过示例代码和变形树的打印,可以找到被加密的字符串实例。通过跟踪printObjectDescription函数和eePrintObjectDescription函数,可以获取到被加密字符串的值。最后提到了通过查看汇编机器码来查找被加密字符串的方式。作者通过这个例子展示了.NET的核心运行模式和加密软件的高级玩法。

🎯

关键要点

  • 字符串的存储分为前端存储和后端存储,前端存储在托管DLL中,后端存储在内存中。
  • 加密字符串可能在前端和后端被更改和移位,需要对CLR/JIT进行分析来查找。
  • 前端存储的字符串在托管PE的#US项中,未加密字符串可以直接修改,若加密则需解密或在后端寻找。
  • 可以通过设置DOTNET_JITDump环境变量来获取JIT的日志,帮助查找字符串。
  • printObjectDescription函数在JIT导入IL时打印变形树,显示字符串实例的存储情况。
  • 跟踪printObjectDescription函数可以获取加密字符串的值,CLR的内存模型不易被加密软件改变。
  • 可以通过查看汇编机器码来查找被加密字符串,这是最低档次的方法。
  • 通过constructStringLiteral函数获取字符串实例的句柄,进一步获取字符串的值。
  • 本文通过示例展示了.NET的核心运行模式和加密软件的高级玩法。
➡️

继续阅读