Это алгоритм декомпрессии, который я расшифровал с помощью обратного инжиниринга.
Но я не очень хорошо разбираюсь в алгоритмах сжатия, поэтому не знаю ни имени алгоритма сжатия, ни того, как его сжимать.
tbl
- это массив со знаком 32-битные целые числа размером 256. Он жестко запрограммирован в исполняемом файле.Массив содержит смещения местоположения.
Здесь - дамп массива (шестнадцатеричный текстовый дамп с прямым порядком байтов), здесь - в формате 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;
}
}