问题描述
我目前正在一个项目中,那里有一个可执行文件,需要一些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)层上进行一些调整。我的经验较少,因此无法为您提供确切的切入点。但是,到您了解这一点时,您应该可以自己解决问题了。
祝你好运!