我正在尝试从可执行文件中获取加密方法。我已经解压缩并开始使用IDA Pro进行分析。
我遇到了一些我无法以任何方式理解的代码。以下是asm代码块。
___:00A11B6F 008 mov eax, [ebp+DecryptedBytes]
___:00A11B72 008 push eax
___:00A11B73 00C push 100h
___:00A11B78 010 push offset CI_StrCmp
___:00A11B7D 014 mov ecx, [ebp+LengthValueOfBytes]
___:00A11B80 014 push ecx
___:00A11B81 018 mov edx, [ebp+Bytes]
___:00A11B84 018 add edx, 4
___:00A11B87 018 push edx
___:00A11B88 01C call rijndaelDecrypt
这个伪代码是:
*(_DWORD *)DecryptResult = rijndaelDecrypt(Bytes + 4, LengthValueOfBytes, (int)CI_StrCmp, 0x100u, DecryptedBytes);
CI_StrCmp是一个不区分大小写的字符串比较器函数。 rijndaelDecrypt函数读取此参数的16个字节。我认为这是关键。
以下是rijndaelDecrypt函数。
void *__cdecl rijndaelDecrypt(int Bytes, unsigned int Length, int Key, unsigned int BitSize, int a5)
{
void *DecryptedBytes; // ebx@1
void *result; // eax@5
unsigned int v7; // [sp+Ch] [bp-118h]@2
unsigned int v8; // [sp+10h] [bp-114h]@2
unsigned int v9; // [sp+14h] [bp-110h]@2
unsigned int v10; // [sp+18h] [bp-10Ch]@2
char v11; // [sp+1Ch] [bp-108h]@1
DecryptedBytes = malloc_2(Length);
memset(&v11, 0, 0x108u);
if ( (signed int)BitSize >= 16 )
{
v7 = *(_DWORD *)Key;
v8 = *(_DWORD *)(Key + 4);
v9 = *(_DWORD *)(Key + 8);
v10 = *(_DWORD *)(Key + 12);
}
else
{
v7 = 0x12121212u;
v8 = 0x12121212u;
v9 = 0x12121212u;
v10 = 0x12121212u;
memcpy(&v7, (const void *)Key, BitSize);
}
if ( rijndaelSetupDecrypt((int)&v7, 16, (int)&v11) == 1 )
{
sub_A125B0(Bytes, Length, DecryptedBytes, (int)&v11, a5);
result = DecryptedBytes;
}
else
{
result = 0;
}
return result;
}
我的问题是将程序偏移发送给另一个程序的含义是什么。这对我没用。
P.S。抱歉我的英语不好。
答案 0 :(得分:0)
如果您的意思是“发送程序的偏移量”,则表示此声明push offset CI_StrCmp
它将StrCmp函数的地址传递给Decrypt例程,因此Decrypt可以调用它。
我猜测Decrypt的函数原型是这样的......
DWORD rijndaelDecrypt (const void *pData, size_t SizeOfData, int CmpFuncAddress, int Value, DWORD *pDecryptCount);
更正确的是它应该是这样的......
typedef int COMPARE_FUNCTION (const char *, const char *);
DWORD rijndaelDecrypt (const void *pData, size_t SizeOfData, COMPARE_FUNCTION *, int Value, DWORD *pDecryptCount);
答案 1 :(得分:0)
好的我明白了......他们使用CL_StrCmp
(1)的实际代码作为密钥(2)进行解密。
代码受版权保护,因此为了解密您自己程序中的数据,您必须包含CL_StrCmp
的代码,因此您侵犯了他们的版权 - IE违法。
(1)函数的实际编译指令。
(2)想想公共\私钥。