C 指针解密函数未按预期工作

C 指针解密函数未按预期工作,c,pointers,encryption,cryptography,C,Pointers,Encryption,Cryptography,首先,重要的是要说代码将是一团混乱,我知道这一点,混乱的代码背后有一个原因,但我不想具体说明为什么要避免偏离正轨 这段代码对指针进行解密: //LLUNGO is long long //PLLUNGO is long long pointer //SCANVELOCE is __fastcall LLUNGO SCANVELOCE DecryptPointer(PPTR_SECRET _pSecret, PLLUNGO _OldPointer) { _OldPointer = (P

首先,重要的是要说代码将是一团混乱,我知道这一点,混乱的代码背后有一个原因,但我不想具体说明为什么要避免偏离正轨

这段代码对指针进行解密:

//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,regista是register关键字

 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_秘密是一个结构)


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

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


你把我直接带到了地狱。如果我跟对了, _FuncAddr在SELF_PTR_解密中(_FuncAddr);调用最终成为DecryptPointer的第二个参数,该参数需要PLLUNGO类型。 但是,_FuncAddr是一个LLUNGO类型。如果是抱怨“不” 重载函数“听起来好像你在使用C++编译器,不是 C


非常感谢,并为我在这里介绍的代码一团糟表示歉意。

您让我直接陷入了宏地狱。如果我正确地遵循了
自我加密(\u FuncAddr)中的
\u FuncAddr
call最后是
DecryptPointer
的第二个参数,它需要一个
PLLUNGO
类型。但是,
\u FuncAddr
是一种
LLUNGO
类型。如果它抱怨“没有重载函数”,听起来像是使用C++编译器,而不是C。而不是所有这些宏,只要编写正则C代码,让编译器优化它。什么是<代码> GypTrTrase和<代码> pprtTrase?请有人把我从这一切中拯救出来。
#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);