71.3.1. ПРЕОБРАБОТКА ИНФОРМАЦИИ ДЛЯ СЖАТИЯ
Знание формата данных как правило позволяет увеличить степень сжатия, за счет
предобработки информации.
Предобработка информации - это искусство (так же как и в AI).
+----------------+
| Data |
+----------------+
|
V
+----------------+
| Preprocess |
+----------------+
|
V
+----------------+
| Compress |
+----------------+
|
V
+================+
| Compressed |
| Data |
+================+
|
V
+----------------+
| Decompress |
+----------------+
|
V
+----------------+
| Postprocess |
+----------------+
|
V
+----------------+
| Data |
+----------------+
Приведем пример:
Есть выполняемый файл для Windows x86 PE формата.
Естественно в секции кода есть много инструкций типа:
CALL NEAR SubName ; Вызов подпрограммы
с кодом: E8 xx xx xx xx, где XXXXXXXX - относительное смещение подпрограммы
относительно начала следующей инструкции
Например:
E8 FF FF 03 05 ; Virt Address = 00012345
...
E8 FF FE 72 34 ; Virt Address = ...
Мы можем пройти всю секцию кода и заменить это относительное смещение на
абсолютное перед тем как делать компрессию.
E8 00 01 22 33 ; Val = VirtAddr + FFFF0305
...
E8 00 01 22 33 ; Val = VirtAddr + FFFE7234
понятно что мы получаем длинные одинаковые последовательности которые
прекрастно сжимаются - таким образом мы повысили уровень компрессии.
После декомпрессии мы проводим обратную предобработку - виртуальные адреса
инструкций мы знаем, и из абсолютного адресса назначения можем получить
относительный.
E8 FF FF 03 05 ; Rel = 00012233 - VirtAddr = FFFF0305
...
E8 FF FE 72 34 ; Rel = 00012233 - VirtAddr = FFFE7234
Index Prev Next