如何对使用 .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 进行逆向工程?的主要内容,如果未能解决你的问题,请参考以下文章

查看 .resource 文件的内容

如何删除对 Dependencies/Frameworks/Microsoft.NETCore.App 中未使用程序集的引用?

将存储在 resources/drawable 文件夹中的图像保存到图库中

WPF如何获取和设置应用程序范围的资源

我应该如何在芹菜中实现任务集的回调

如何防止引用程序集的嵌入式依赖项被复制到Visual Studio中的输出文件夹?