Наверное это слишком отвлечённая тема. Задам более конкретный вопрос. Мне нужно распаковать потоки в структурированном хранилище. Может кто то сталкивался?
Посмотри статьи http://www.uinc.ru/articles/46/ http://www.uinc.ru/articles/39/ Могу ещё закинуть простенький пример упаковки\распаковки буфера Код (Text): ;===================================================================== COMPRESSION_ENGINE_MAXIMUM = 0x0100 COMPRESSION_FORMAT_LZNT1 = 0x0002 ;===================================================================== unpacked: times 1024 dd %-1 size = $-unpacked packed rb size temp rb 1024*16 ; WorkSpaceSize value1 dd 0 value2 dd 0 ;===================================================================== entry $ invoke RtlGetCompressionWorkSpaceSize,\ COMPRESSION_FORMAT_LZNT1+COMPRESSION_ENGINE_MAXIMUM,\ value1,value2 invoke RtlCompressBuffer,\ COMPRESSION_FORMAT_LZNT1+COMPRESSION_ENGINE_MAXIMUM,\ unpacked,size,packed,size,0x1000,value1,temp invoke RtlDecompressBuffer,\ COMPRESSION_FORMAT_LZNT1+COMPRESSION_ENGINE_MAXIMUM,\ unpacked,size,packed,size,value1 ;=====================================================================
Прошу прощения, но функции из NTDLL.DLL не подходят. Можно сам алгоритм или библиотеку с его реализацией? За статьи спасибо, но я их уже читал.
bogrus, У меня не получилось, да и не специалист я по взлому. В качестве первого параметра передаётся тот самый COMPRESSION_FORMAT_LZNT1, равный 2. Если передать туда двойку, то все условия проигнорируются и указатель инструкций спокойно дойдёт до RET. Exported fn(): RtlDecompressBuffer - Ord:0193h :77FAE17E 55 push ebp :77FAE17F 8BEC mov ebp, esp :77FAE181 8A4508 mov al, byte ptr [ebp+08] :77FAE184 25FF000000 and eax, 000000FF :77FAE189 6685C0 test ax, ax :77FAE18C 742E je 77FAE1BC :77FAE18E 663D0100 cmp ax, 0001 :77FAE192 7428 je 77FAE1BC :77FAE194 A8F0 test al, F0 :77FAE196 7409 je 77FAE1A1 :77FAE198 B85F0200C0 mov eax, C000025F * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:77FAE1BA(U), :77FAE1C1(U) | :77FAE19D 5D pop ebp :77FAE19E C21800 ret 0018 Хотя в реальных условиях я этого не проверял. На бумажке подсчитал. Может поможешь извлечь код распаковки из библиотеки?
LZNT1 Ты передаешь не 2-ку! После "test al,F0" был бы прыжок на распаковку, а у тебя почему-то установлен какой-то из старших 4-х бит байта COMPRESSION_FORMAT_LZNT1 = 0x02
Наверное ты прав, я же говорю что я не специалист по этому. Можно дальше? * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:77FAE196(C) | :77FAE1A1 FF751C push [ebp+1C] :77FAE1A4 0FB7C0 movzx eax, ax :77FAE1A7 FF7518 push [ebp+18] :77FAE1AA FF7514 push [ebp+14] :77FAE1AD FF7510 push [ebp+10] :77FAE1B0 FF750C push [ebp+0C] :77FAE1B3 FF1485600DFD77 call dword ptr [4*eax+77FD0D60] :77FAE1BA EBE1 jmp 77FAE19D Как вычислить куда идёт вызов? Адрес 77FD0D60 выходит за пределы диапазона адресов, используемых библиотекой.
У меня нету пол дня(я на работе), возьми в аттаче exe и исходник фасмовский, загрузи exe в ollydbg - по F8 дойдешь до CALL [<&ntdll.RtlDecompressBuffer>], потом по F7 трассируя, отладчик тебе покажет куда и как идут вызова (по 77FD0D60 лежит таблица адресов ф-ций распаковки, твоя на 77FD0D68) Нужно провести анализ, если весь код "базонезависимый", похоже так и есть(кроме таблицы), то можно просто сдампить его и таблицу (+ поменять адрес вызова таблицы), вставить в фасм и сгенерить обьектник (чтобы подключать из MS линкера), иначе получать листинг из IDA\OllyDbg + пропарсить\поправить чтоб компилился _658605450__lznt1.zip
И что с того, я сам экономистом работаю это уже оффтоп, лучше посмотри lz77 (может не те параметры ему даешь)
Ага, нашёл, вот оно. Спасибо. Осталось только понять как это всё работает. Может кто нибудь может DLL-ку склепать? _876223487__lznt1.asm
bogrus, А я под 1С:Предприятие програмлю. LZ77 я не пробовал. Я вообще ещё ничего не пробовал. Читал только что LZNT1 отличается от LZ77. Вот хотел найти отличия. А вообще я только LZW знаком, и то не близко.
RtlDecompressBuffer я сдампил(~3Kb), в аттаче пример распаковки без ntdll, а для dll нужно только релоки построить (в дампе около десяти ссылок на таблицу)
Ага, спасибо. Иными словами я могу подгрузить этот бинарник с диска или ресурсов и просто передать ему управление?