c - 指针解密功能未按预期工作
问题描述
首先,重要的是要说代码会一团糟,我知道这一点并且代码混乱是有原因的,但我宁愿不指定原因以避免偏离轨道。
这段代码解密了一个指针:
//LLUNGO is long long
//PLLUNGO is long long pointer
//SCANVELOCE is __fastcall
LLUNGO SCANVELOCE DecryptPointer(PPTR_SECRET _pSecret, PLLUNGO _OldPointer)
{
_OldPointer = (PLLUNGO) PTR_ENCRYPTION_ALGORITHM(*_OldPointer, _pSecret->Segreto);
INTERO Reference = GetReferenceToPtr(_pSecret, _OldPointer);
if (PTR_BAD_REFERENCE(Reference))
QUICK_PRINT("Bad reference error.\n");
return PTR_ENCRYPTION_ALGORITHM((LLUNGO)_pSecret->Riferimenti[Reference], _pSecret->Segreto);
}
使用以下宏:
#define PTR_ENCRYPTION_ALGORITHM(PTR, KEY) (~(PTR ^ KEY))
#define PTR_BAD_REFERENCE(PTR) ((-1) == (PTR))
现在的问题是当我使用下面所述的宏时,出于某种原因,即使我使用了正确的参数,它仍然会抛出这个错误:
没有重载函数“DecryptPointer”的实例对应于参数。
考虑到 NBYTE 是 BYTE 而 REGISTRA 是寄存器关键字。
NBYTE SCANVELOCE MFINIT(LLUNGO _FuncAddr, PMUTILATE_FUNCTION _Function)
{
if (!_FuncAddr || !_Function)
return FALSO;
SELF_PTR_DECRYPTION( _FuncAddr ); //error thrown here
SELF_PTR_DECRYPTION( _Function ); //and here too!
for (REGISTRA PNBYTE Current = (PNBYTE)_FuncAddr; ; Current--)
{
if (MF_PUSH_EBP == *Current)
{
_Function->Inizio = (LLUNGO)Current;
break;
}
}
以及 SELF_PTR_DECRYPTION 宏 + DecryptPointer 函数工作所需的一切:(PTR_SECRET 是一个结构)
#define SELF_PTR_DECRYPTION(X) ((X) = (PTR_DECRYPTION(X)))
#define PTR_DECRYPTION(X) DecryptPointer(&PTR_SECRET_NAME, X)
#define PTR_SECRET_NAME g_PTR_SECRET
INIT(PTR_SECRET PTR_SECRET_NAME);
再次为愚蠢的混乱代码感到抱歉,我也在挣扎,就像每个阅读本文的人都可能会一样,但再次有一个混乱背后的原因。
解决方案
解决方案已在@yano 的评论中找到:
你把我直接带到了宏观地狱。如果我没听错,SELF_PTR_DECRYPTION(_FuncAddr) 中的 _FuncAddr;call 最终成为 DecryptPointer 的第二个参数,它需要一个 PLLUNGO 类型。但是,_FuncAddr 是 LLUNGO 类型。如果它抱怨“没有重载函数”,听起来你使用的是 C++ 编译器,而不是 C。
非常感谢,对于我在这里提供的绝对混乱的代码感到抱歉。
推荐阅读
- c++ - 条件分支的模板和优化
- bash - Solaris 中的脚本 CPU 使用情况
- javascript - 静态内容未在 spring mvc 资源标签中加载
- python - 用 Seaborn 强调网格线
- android - 如何使字段私有 final java.lang.String java.io.File.path 可访问
- python - 使用 omegaconf 在 YAML 配置文件中进行算术操作
- java - Redis 设置 key, val 仅当 val 匹配前一个并发时
- sql - ER-图到 SQL
- php - 基于标签格式的 FPDF 子列表
- javascript - 单击按钮行未添加