如何解决为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)层上进行一些调整。我的经验较少,因此无法为您提供确切的切入点。但是,到您了解这一点时,您应该可以自己解决问题了。
祝你好运!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。