首页 > 解决方案 > 这个压缩算法是什么?

问题描述

这是我通过逆向工程解码的解压算法。

但是我不擅长研究压缩算法,所以不知道压缩算法的名字,也不知道怎么压缩。

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

标签: c#compressionreverse-engineering

解决方案


推荐阅读