【问题标题】:Pointer decryption function not working as intended指针解密功能未按预期工作
【发布时间】:2020-12-26 05:23:12
【问题描述】:

首先,重要的是要说代码会乱成一团,我知道这一点,而且代码乱成一团是有原因的,但我不想具体说明为什么,以免偏离轨道。

这段代码的sn-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,而 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);

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

【问题讨论】:

  • 你直接把我带到了宏观地狱。如果我的操作正确,SELF_PTR_DECRYPTION( _FuncAddr ); 调用中的_FuncAddr 最终会成为DecryptPointer 的第二个参数,它需要PLLUNGO 类型。但是,_FuncAddrLLUNGO 类型。如果它抱怨“没有重载函数”,听起来你使用的是 C++ 编译器,而不是 C。
  • 不用所有这些宏,只需编写常规C代码并让编译器对其进行优化。
  • 什么是g_PTR_SECRETPPTR_SECRET
  • 请有人把我从这一切中拯救出来

标签: c pointers encryption cryptography


【解决方案1】:

@yano 在 cmets 中找到了解决方案:

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

非常感谢,对于我在此处提供的绝对混乱的代码,我们深表歉意。

【讨论】:

    猜你喜欢
    • 2013-08-29
    • 2020-04-28
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 2012-10-07
    • 2014-08-13
    • 1970-01-01
    相关资源
    最近更新 更多