【发布时间】: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类型。但是,_FuncAddr是LLUNGO类型。如果它抱怨“没有重载函数”,听起来你使用的是 C++ 编译器,而不是 C。 -
不用所有这些宏,只需编写常规C代码并让编译器对其进行优化。
-
什么是
g_PTR_SECRET和PPTR_SECRET? -
请有人把我从这一切中拯救出来
标签: c pointers encryption cryptography