这是我通过逆向工程解码的一种减压算法。
但是我不擅长研究压缩算法,所以我不知道压缩算法的名称或如何压缩。
tbl
是一个带符号的32位整数数组,大小为256。它被硬编码在可执行文件中。该数组包含位置偏移。
Here是数组的转储(big-endian,基于文本的十六进制转储),here是C ++格式。
int srcCnt = 0;
int destCnt = 0;
decomIMP[destCnt++] = imp[srcCnt++];
while(true)
{
try
{
byte val = imp[srcCnt++];
if (val == 0x10)
{
int count = imp[srcCnt++] + 3;
byte value = decomIMP[destCnt - 1];
for(int j = 0; j<count; j++)
{
decomIMP[destCnt++] = value;
}
}
else if(val >= 0x80)
{
int val1 = imp[srcCnt++];
int val2 = (val >> 4) & 0x7;
int val3 = (val & 0x0f) + 3;
int val4 = (int)TBL[val1] + destCnt;
for (int j = 0; j < val3; j++)
{
byte value = decomIMP[val4++];
decomIMP[destCnt++] = value;
}
for(int k =0; k < val2; k++)
{
byte value = imp[srcCnt++];
decomIMP[destCnt++] = value;
}
}
else if (val >= 0x20 && val < 0x80)
{
int val1 = val & 0xf;
int val2 = (val >> 4) + 1;
int val3 = (int)TBL[val1] + destCnt;
//infact, destCnt - tbl[val].. content of tbl is minus value
for (int j = 0; j < val2; j++)
{
byte value = decomIMP[val3++];
decomIMP[destCnt++] = value;
}
}
else if (val < 0x10)
{
for(int j=0; j<=val; j++)
{
byte value = imp[srcCnt++];
decomIMP[destCnt++] = value;
}
}
}
catch(IndexOutOfRangeException)
{
break;
}
}