有下面两个函数,谁能知道第二个函数所做的操作是什么样的操作,有什么意义,或数学原理(我能看懂的部分已经加上了注释):BYTE data1[] = {0, 1, 2, 4, 5, 7, 8, 10, 11, 12, 16, 22, 23, 26};
DWORD data2[256]; // 地址为 48CBE0
BOOL bNotInitialized = TRUE;void sub_429A40()
{
int var_4, var_18;
int iArraySize = sizeof(data1);
int bitMask = 0;
for (int j = 0; j < iArraySize; j ++)
{
int iTmp = 1;
bitMask |= iTmp <<(0x1F - data1[j]);
}
// 在上面的操作完成后
// bitMask 应该是: 111011011011100010000011001000000   
// 即 0x0EDB88320
for (j = 0; j < 0x100; j++)
{
var_4 = j;
for (int i= 0; i < 8; i++)
{
var_18 = (var_4 & 1)?var_4>>1:(var_4 >> 1) ^ bitMask ;
var_4 = var_18;
}
data2[j] = var_4;
}
// data2里的值应该是: 
//  data2[i] = i / 2;   i为0-255之间的奇数
// data2[j] = (j / 2) xor 0x0EDB88320; j为0-255之间的偶数
bNotInitialized = FALSE;
}// iUnknown 调用时为 0
int sub_429B18(int iUnknown, LPBYTE pData, int iSize)
{
if (pData )
{
; 初始化
if (bNotInitialized)
sub_429A48();

iUnknown ^= -1;
// 若 iUnknown 调用时为 0, 则
// 此时 iUnknown = -1;
while (iSize >= 8)
{
iUnknown = (iUnknown >> 8) ^ data2[(* pData ^ iUnknown) & 0xFF];
iUnknown = (iUnknown >> 8) ^ data2[(iUnknown ^ (*++pData)) & 0xFF]
iUnknown = (iUnknown >> 8) ^ data2[(iUnknown ^ (*++pData)) & 0xFF]
iUnknown = (iUnknown >> 8) ^ data2[(iUnknown ^ (*++pData)) & 0xFF]
iUnknown = (iUnknown >> 8) ^ data2[(iUnknown ^ (*++pData)) & 0xFF]
iUnknown = (iUnknown >> 8) ^ data2[(iUnknown ^ (*++pData)) & 0xFF]
iUnknown = (iUnknown >> 8) ^ data2[(iUnknown ^ (*++pData)) & 0xFF]
iUnknown = (iUnknown >> 8) ^ data2[(iUnknown ^ (*++pData)) & 0xFF]
pData ++;
iSize -= 8;
}
if (iSize)
{
do
{
(iUnknown >> 8) ^ dword data2[(*pData ^ iUnknown) & 0xFF]
++ pData;
-- iSize;
}
while (iSize);
}
return iUnknown ^ -1;
}
return 0;
}

解决方案 »

  1.   

    加密吧。
    int sub_429B18(int iUnknown, LPBYTE pData, int iSize) ==〉int Encrypt(int iPasswordSeed, char* pszSource, int iSourceSize);void sub_429A40() 用于省成伪随机码,用作加密序列。data1 伪随机序列生成种子, 用于声称data2序列。
    data2序列 和 输入的 iUnknown 一起作用加密输入的 pData.btw:
    //  data2[i] = i / 2;   i为0-255之间的奇数
    // data2[j] = (j / 2) xor 0x0EDB88320; j为0-255之间的偶数这个地方你忘了i 还要循环8次的。
      

  2.   

    另补充一句:第二个函数好像是返回一个数字,所以我觉得这个函数是在生成一种CRC校验码!不知道这里有冇对CRC方法比较了解的高手