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