Упаковка и распаковка данных с помощью Runtime-функций
Упаковка и распаковка данных с помощью Runtime-функций
За последнее время тут было выложено немало распаковщиков для различных алгоритмов компрессии данных. Теперь расскажу о штатных функциях упаковки и распаковки, которые есть в Windows. Плюсы их использования в том, что не надо таскать за собой разные алгоритмы или библиотеки, все делается парой системных функций. Степень компрессии, конечно, получается где-то на уровне плинтуса, но этого вполне хватит, например, чтобы в половину утрамбовать логи вашей поняшки перед отправкой на сервер.
Начнем с упаковки данных. Тут используются две функции - RtlGetCompressionWorkSpaceSize и RtlCompressBuffer. С помощью первой определяется размер рабочего буфера для упаковки, а с помощью второй данные пакуются.
Code (Assembler) : Убрать нумерацию
- COMPRESSION_ENGINE_MAXIMUM = 0x0100
- COMPRESSION_FORMAT_LZNT1 = 0x0002
- invoke RtlGetCompressionWorkSpaceSize,\
- COMPRESSION_FORMAT_LZNT1+COMPRESSION_ENGINE_MAXIMUM,\
- cbwss,cfwss
- invoke GlobalAlloc,GMEM_MOVEABLE,[cfwss]
- mov [hMem],eax
- invoke GlobalLock,eax
- mov [workspace],eax
- ; Упаковать данные
- invoke RtlCompressBuffer,\
- COMPRESSION_FORMAT_LZNT1+COMPRESSION_ENGINE_MAXIMUM,\
- [original_data],[original_size],\
- [packed_data],[packed_size],4096,compressed_size,\
- [workspace]
- ; [packed_data] -> упакованные данные
- ; [compressed_size] -> размер упакованных данных
CompressionFormat
A bitmask that specifies the compression format of the compressed buffer. This parameter must be set to COMPRESSION_FORMAT_LZNT1.
В вольном переводе на русский это звучит примерно как "вы можете использовать любой формат сжатия данных, но только если это будет формат LZ". Воздержусь от комментариев.
А вот пример распаковки данных. Тут используется всего одна функция RtlDecompressBuffer, о ее причудах я написал чуть выше.
Code (Assembler) : Убрать нумерацию
- COMPRESSION_FORMAT_LZNT1 = 0x0002
- ; Распаковать данные
- invoke RtlDecompressBuffer,\
- COMPRESSION_FORMAT_LZNT1,[unpacked_data],[buffer_size],\
- [packed_data],[packed_size],unpacked_size
- ; [unpacked_data] -> распакованные данные
- ; [unpacked_size] -> размер распакованных данных
Просмотров: 1714 | Комментариев: 6
Метки: Assembler, распаковка
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(31.03.2021 в 17:37):
IDA здорово помогла, декомпилировал свою же программу :) Оказывается, тут структуры передаются не по референсу, а льются напрямую в стек, и флаги не DWORD, а QWORD. Звездец какой... Разобрался, будет статья. А жмет действительно классно, на больших файлах уделала даже aPLib.
DRON
(31.03.2021 в 16:12):
Вот вроде какой-то пример:
https://github.com/bats3c/Ghos.../compess.cpp
https://github.com/bats3c/Ghos.../compess.cpp
DRON
(31.03.2021 в 15:58):
Упаковка:
Input.lpStart=<Указатель на исходные данные>
Input.uSize:=<Размер данных>
Input.Editable=0
CreateDeltaB(DELTA_FILE_TYPE_SET_EXECUTABLES,0,0,EMPTY_INPUT,
Input,EMPTY_INPUT,EMPTY_INPUT,EMPTY_INPUT,nil,32,Output)
Output.lpStart - запакованные данные
Output.uSize - и их размер
DeltaFree(Output.lpStart)
Распаковка:
Input.lpStart=<Указатель на запакованные данные>
Input.uSize=<Их размер>
Input.Editable=0
ApplyDeltaB(DELTA_FLAG_NONE,EMPTY_INPUT,Input,Output)
Output.lpStart - распакованные данные
Output.uSize - и их размер
DeltaFree(Output.lpStart)
Input.lpStart=<Указатель на исходные данные>
Input.uSize:=<Размер данных>
Input.Editable=0
CreateDeltaB(DELTA_FILE_TYPE_SET_EXECUTABLES,0,0,EMPTY_INPUT,
Input,EMPTY_INPUT,EMPTY_INPUT,EMPTY_INPUT,nil,32,Output)
Output.lpStart - запакованные данные
Output.uSize - и их размер
DeltaFree(Output.lpStart)
Распаковка:
Input.lpStart=<Указатель на запакованные данные>
Input.uSize=<Их размер>
Input.Editable=0
ApplyDeltaB(DELTA_FLAG_NONE,EMPTY_INPUT,Input,Output)
Output.lpStart - распакованные данные
Output.uSize - и их размер
DeltaFree(Output.lpStart)
ManHunter
(30.03.2021 в 12:21):
Спасибо за наводку, обязательно посмотрю. Если разберусь, то будет статейка и по ним тоже. А то пока не могу найти ни одного нормального рабочего примера.
DRON
(28.03.2021 в 19:04):
Из встроенного в винду есть ещё CreateDeltaB/ApplyDeltaB (MSDELTA.DLL). Сжимает на уровне LZMA особенно хорошо жмёт EXE-шники.
Добавить комментарий
Заполните форму для добавления комментария
x64 начал проникать всюду?
Вроде есть куда более адекватные и документированные (к сожалению, работают только с файлами) ф-ии из kernel32 LZ(Open,Read,Write,etc.)File, похоже - именно с описанными Rtl под капотом.