我目前正在从事一个项目,其中有一个可执行文件需要一些C/++注入来修复DLL中的代码,不幸的是,上述exe恰好是用Watcom编译的--这意味着使用visual c++和clang的常用方法都无法调用现有代码并在不破坏参数的情况下注入自定义函数(我已经尝试内联一些程序集以传递带有存根的参数,但由于有超过7000个可以任意调用的方法,维护起来将非常令人头疼)。
因此,由于我使用Visual Studio2019,且Visual Studio2019与clang进行了本机集成,因此我认为一个好的解决方案可能是使用编译器添加来实现自定义的__watcom调用约定。现在的问题是:如何添加自定义调用约定?有人试过做类似的事情吗?
我正在绞尽脑汁想弄清楚到底要在LLVM或clang中修改什么。
发布于 2020-11-01 07:21:01
您必须同时在前端(Clang)和后端(LLVM)中进行更改。
前端部分的变化包括增加对__watcom
关键字的支持,即让Clang解析和接受这样的关键字,并以某种方式将其传播到后端。我看到的一种简单的方法是
#define __wacom __attribute__((annotate("wacom_calling_convention")))
在您的系统头中的某个位置。这将导致Clang将"wacom_calling_convention“元数据附加到每个标记为__wacom
的函数。
后端部分当然更复杂。有关如何在IR级别上阅读注释的示例,请参阅https://github.com/HikariObfuscator/Core/blob/master/Utils.cpp#L158。
一旦找到所有标记为__wacom
的函数,就必须更改它们的调用约定。请参阅documentation on that matter。您可能需要扩展一些描述支持的调用约定的枚举或TableGen文件。
最后,您需要对机器代码(MC)层进行一些调整。我在这方面的经验要少得多,所以不能给你确切的切入点。但是,到了这一步,您应该能够自己解决问题了。
祝好运!
https://stackoverflow.com/questions/64625864
复制