修改c++二进制文件而不重新编译



在一个独立的开发团队中工作,我有源代码,它是rust和c++的组合。它包含一个类Agent

agent.cpp:

/* static */
bool Agent::check() {
if (check1) {
return checkCondition()
}
}
return false;

我想直接修改二进制,以确保Agent::check总是返回true。这可能吗?

如果我可以编译它,我会修改源代码,计算,做一个二进制diff,然后完成它。不幸的是,我不能编译它。

一般来说,如果您希望能够在不重新编译的情况下编辑可执行文件上的设置,则可以使用PE Resources来实现。

PE资源包含在编译文件的.rsrc部分中。您可以使用PE编辑器,如CFF Explorer或Resource Hacker轻松查看和编辑它们。

你可以使用winapi BeginUpdateResource, UpdateResource, endpdateresource和类似的api在运行时读取,写入,添加和删除PE资源。

// Sample code to add a PE resource 
hRes = BeginUpdateResourceW(filePath, bDeleteExistingResources);
UpdateResourceA(hRes, Resourcetype, ResourceName, 0, ResData, SizeOfData);
EndUpdateResourceA(hRes, false);

执行后,您的代码将从先前在运行时添加的资源中读取设置。

还有其他不涉及PE资源的方法,例如在代码中放置标记占位符字符串,以便稍后单独的程序可以读取文件代码并用适当的值替换这些占位符字符串。

这种二进制补丁(硬编码按值返回的函数的返回值)很容易做到。然而,二进制补丁是一种艺术形式,需要您学习一些针对目标体系结构的汇编逆向工程技能。这里有一个很好的资源开始: Live Overflow YouTube频道。

需要注意的重要事项: 编译器可能已经内联了这个成员函数。如果是这种情况,您将不得不在多个地方修补二进制文件。

如果我可以提供一些建议:你提到一个单独的团队,这意味着你是在专业背景下做这件事。我强烈建议您从根本原因着手解决这个问题:要么自己动手使用编译这些代码所需的工具,要么让其他团队为您完成。虽然修补二进制文件是一项需要掌握的非常有趣的技能,但依靠它来执行应该像编辑一行源代码和重新编译一样简单的任务,对我来说似乎有点过头了。更不用说,如果你团队中的其他人将来出于某种原因需要再做一次,他们很可能无法做到。

最新更新