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