为LLVM和clang c ++开发用于DLL代码注入的自定义调用约定

问题描述

我目前正在一个项目中,那里有一个可执行文件,需要一些C / ++注入才能修复DLL中的代码,但不幸的是,所说的exe恰好是用Watcom编译的-这意味着通常的使用方法visual c ++和clang都无法调用现有代码并注入自定义函数而不会破坏参数(已经尝试内联某些程序集以存根传递参数,但是可以任意调用7000多种方法,要维护它会非常麻烦)

因此,由于我使用的是Visual Studio 2019,并且与clang进行了本地集成,所以我认为也许一个好的解决方案是使用该编译器添加实现自定义__watcom调用约定。现在的问题是:您如何添加自定义调用约定?有没有人尝试做类似的事情?

我正在摸索要弄清楚LLVM或clang中要更改的内容。

解决方法

您将必须在前端(Clang)和后端(LLVM)中进行更改。

前端部分的更改涉及添加对func getbaseData(){ let userDefaults = UserDefaults.standard mobile = userDefaults.value(forKey: "mobile") as! String altenativeMobile = userDefaults.string(forKey: "altenativeMobile") ?? mobile privateKey = userDefaults.value(forKey: "privateKey") as! String ////reading JSON let categoriesJsonString = userDefaults.value(forKey: "categoriesString") as! String let data = categoriesJsonString.data(using: .utf8)! if let json = try? JSON(data: data) { let arrayCats = json["content"][1]["caseMappings"][caseCategoryGlobal].array if(isNoSubsGlob == 0){ if let arrayCatsCount = arrayCats?.count { print("The array has been created with \(arrayCatsCount) element") print("sub1Glob= \(sub1Glob) & sub2Glob= \(sub2Glob)") for var i in 0..<arrayCatsCount{ let sub1 = json["content"][1]["caseMappings"][caseCategoryGlobal][i]["sub1"].string! let sub2 = json["content"][1]["caseMappings"][caseCategoryGlobal][i]["sub2"].string ?? "" if (sub1 == sub1Glob && sub2 == sub2Glob){ departmentId = json["content"][1]["caseMappings"][caseCategoryGlobal][i]["departmentId"].int! WorkTypeId = json["content"][1]["caseMappings"][caseCategoryGlobal][i]["categoryId"].int! issueCode = json["content"][1]["caseMappings"][caseCategoryGlobal][i]["id"].int! } } } }else{ departmentId = json["content"][1]["caseMappings"][caseCategoryGlobal][0]["departmentId"].int! WorkTypeId = json["content"][1]["caseMappings"][caseCategoryGlobal][0]["categoryId"].int! issueCode = json["content"][1]["caseMappings"][caseCategoryGlobal][0]["id"].int! } } contactNumberText.text = altenativeMobile } 关键字的支持,这使Clang可以解析和接受此类关键字并将其以某种方式传播到后端。我看到的一种简单方法是

__watcom

系统标题中的某个位置。这将导致Clang将“ wacom_calling_convention”元数据附加到标记为#define __wacom __attribute__((annotate("wacom_calling_convention"))) 的每个函数上。

后端部分当然更复杂。有关如何在IR级别读取注释的示例,请参见https://github.com/HikariObfuscator/Core/blob/master/Utils.cpp#L158

找到所有标记为__wacom的函数后,就必须更改它们的调用约定。请参见documentation on that matter。您可能必须扩展一些枚举或TableGen文件,以描述受支持的调用约定。

最后,您将在机器代码(MC)层上进行一些调整。我的经验较少,因此无法为您提供确切的切入点。但是,到您了解这一点时,您应该可以自己解决问题了。

祝你好运!

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...