Что это за алгоритм сжатия? - PullRequest
2 голосов
/ 27 марта 2019

Это алгоритм декомпрессии, который я расшифровал с помощью обратного инжиниринга.

Но я не очень хорошо разбираюсь в алгоритмах сжатия, поэтому не знаю ни имени алгоритма сжатия, ни того, как его сжимать.

tbl - это массив со знаком 32-битные целые числа размером 256. Он жестко запрограммирован в исполняемом файле.Массив содержит смещения местоположения.

Здесь - дамп массива (шестнадцатеричный текстовый дамп с прямым порядком байтов), здесь - в формате C ++.


  1. Если возможно, можете ли вы рассказать мне, как сжимать метод?
  2. Как мне узнать метод сжатия снова, используя только метод декомпрессии?Или как мне учиться?

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;
   }
}
...