首页 > 解决方案 > 指针解密功能未按预期工作

问题描述

首先,重要的是要说代码会一团糟,我知道这一点并且代码混乱是有原因的,但我宁愿不指定原因以避免偏离轨道。

这段代码解密了一个指针:

//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);

再次为愚蠢的混乱代码感到抱歉,我也在挣扎,就像每个阅读本文的人都可能会一样,但再次有一个混乱背后的原因。

标签: cpointersencryptioncryptography

解决方案


解决方案已在@yano 的评论中找到:

你把我直接带到了宏观地狱。如果我没听错,SELF_PTR_DECRYPTION(_FuncAddr) 中的 _FuncAddr;call 最终成为 DecryptPointer 的第二个参数,它需要一个 PLLUNGO 类型。但是,_FuncAddr 是 LLUNGO 类型。如果它抱怨“没有重载函数”,听起来你使用的是 C++ 编译器,而不是 C。

非常感谢,对于我在这里提供的绝对混乱的代码感到抱歉。


推荐阅读