如何对使用 .resource 文件存储程序集的 .exe 进行逆向工程?
Posted
技术标签:
【中文标题】如何对使用 .resource 文件存储程序集的 .exe 进行逆向工程?【英文标题】:How to reverse engineer an .exe that uses a .resource file to store an assembly? 【发布时间】:2018-11-21 01:26:44 【问题描述】:上下文
我在一家开发 MMO 的工作室担任游戏开发人员。我们构建了一个权威服务器,但仍然遇到漏洞利用和自动化问题。我下载了用于破解我们游戏的主要机器人,以确定它如何利用我们的服务器,以便我们进行相应的修补。
问题
我使用 dotPeek 反编译了 .exe 以获取源文件,但遇到了一个问题:我只获得了启动器的源文件。启动器在运行时将核心程序集注入我们的应用程序。它通过将程序集作为十六进制数据存储在 .resource 文件中来实现。知道如何从这个 .resource 文件中获取源代码吗?
解决方案
感谢大家的帮助。我通过从 .resource 文件中提取二进制数据并将其写入 .dll 文件,然后使用 dotPeek 对其进行反编译来获取源文件。详情请见my solution。
【问题讨论】:
尝试使用 MegaDumper 或其他工具转储它(我只知道 mega dumpber) 你可以使用ILSpy来转储它...注意你甚至可以作弊:你可以创建一个控制台应用程序,将exe作为Add Reference
(是的,甚至exe可以添加引用) 然后通过反射使用它的一部分。
@xanatos 是 ILSpy 有转储方法吗?
@kaj 如果我没记错的话...这里没有...
啊,好吧,我的意思是在运行时转储它,即使在 res 或 embed 或其他地方,你也会得到所有程序集和所有依赖项。 我的意思是,即使是隐藏在 res 中的程序集,也会显示为程序集并准备好读取它的内容。
【参考方案1】:
你不应该可以使用GetManifestResourceStream
来获取嵌入的数据吗?
【讨论】:
【参考方案2】:感谢大家的帮助——结合使用反编译器和在运行时读取二进制程序集数据并将其写入 .dll 文件帮助我获得了源代码:
我使用 dotPeek 来反编译启动器。在程序集资源管理器中,我右键单击程序集并选择 Export to Project...
然后在 Visual Studio 中打开项目并插入一行使用 File.WriteAllBytes
写入字节 [] (已经通过他们的应用程序可用,但这刚刚得到使用ResourceManager.GetObject
) 将二进制数据从.resource 文件复制到.dll 文件。然后我在 dotPeek 和 wala 中打开了那个 .dll 文件 - 源代码可见。
【讨论】:
【参考方案3】:我建议围绕这个问题进行设计,一种由服务器强制执行的软验证码。您的问题的真相是:.Net 可以扩展。与其围绕客户端 exe 进行“猫捉老鼠的军备竞赛”,不如考虑如何检测非人类活动,或者如何随机要求仅人类活动。
如果你的游戏值得关注,他们会战胜你。他们很多:)
【讨论】:
以上是关于如何对使用 .resource 文件存储程序集的 .exe 进行逆向工程?的主要内容,如果未能解决你的问题,请参考以下文章
如何删除对 Dependencies/Frameworks/Microsoft.NETCore.App 中未使用程序集的引用?