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