LZNT1

Тема в разделе "WASM.A&O", создана пользователем LZNT1, 12 июл 2005.

  1. LZNT1

    LZNT1 New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2005
    Сообщения:
    45
    Адрес:
    Ukraine
    Подкиньте пожалуйста хоть какую то информацию по этой теме. Кроме встроенных в NTDLL.DLL функций.
     
  2. LZNT1

    LZNT1 New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2005
    Сообщения:
    45
    Адрес:
    Ukraine
    Наверное это слишком отвлечённая тема. Задам более конкретный вопрос. Мне нужно распаковать потоки в структурированном хранилище. Может кто то сталкивался?
     
  3. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Посмотри статьи

    http://www.uinc.ru/articles/46/

    http://www.uinc.ru/articles/39/

    Могу ещё закинуть простенький пример упаковки\распаковки буфера
    Код (Text):
    1. ;=====================================================================  
    2. COMPRESSION_ENGINE_MAXIMUM  = 0x0100
    3. COMPRESSION_FORMAT_LZNT1    = 0x0002
    4. ;=====================================================================  
    5. unpacked:   times   1024 dd %-1
    6. size        =       $-unpacked
    7. packed      rb      size
    8. temp        rb      1024*16 ; WorkSpaceSize
    9. value1      dd      0
    10. value2      dd      0
    11. ;=====================================================================  
    12. entry $
    13.             invoke  RtlGetCompressionWorkSpaceSize,\
    14.                     COMPRESSION_FORMAT_LZNT1+COMPRESSION_ENGINE_MAXIMUM,\
    15.                     value1,value2
    16.             invoke  RtlCompressBuffer,\
    17.                     COMPRESSION_FORMAT_LZNT1+COMPRESSION_ENGINE_MAXIMUM,\
    18.                     unpacked,size,packed,size,0x1000,value1,temp
    19.             invoke  RtlDecompressBuffer,\
    20.                     COMPRESSION_FORMAT_LZNT1+COMPRESSION_ENGINE_MAXIMUM,\
    21.                     unpacked,size,packed,size,value1
    22. ;=====================================================================
     
  4. LZNT1

    LZNT1 New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2005
    Сообщения:
    45
    Адрес:
    Ukraine
    Прошу прощения, но функции из NTDLL.DLL не подходят. Можно сам алгоритм или библиотеку с его реализацией?



    За статьи спасибо, но я их уже читал.
     
  5. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Ну вырипай код из ntdll, максимум пол дня работы
     
  6. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    Судя по коду декомпрессора это обычный lz77
     
  7. LZNT1

    LZNT1 New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2005
    Сообщения:
    45
    Адрес:
    Ukraine
    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

    Хотя в реальных условиях я этого не проверял. На бумажке подсчитал.

    Может поможешь извлечь код распаковки из библиотеки?
     
  8. LZNT1

    LZNT1 New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2005
    Сообщения:
    45
    Адрес:
    Ukraine
    Dr.Golova,

    да, но отличия всё же есть. Хотелось бы знать какие.
     
  9. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    LZNT1 Ты передаешь не 2-ку! После "test al,F0" был бы прыжок на распаковку, а у тебя почему-то установлен какой-то из старших 4-х бит байта COMPRESSION_FORMAT_LZNT1 = 0x02
     
  10. LZNT1

    LZNT1 New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2005
    Сообщения:
    45
    Адрес:
    Ukraine
    Наверное ты прав, я же говорю что я не специалист по этому. Можно дальше?



    * 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 выходит за пределы диапазона адресов, используемых библиотекой.
     
  11. LZNT1

    LZNT1 New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2005
    Сообщения:
    45
    Адрес:
    Ukraine
    Вызов идёт по значению, которое находится в этом адресе. А кто же его туда пихает?
     
  12. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    У меня нету пол дня(я на работе), возьми в аттаче exe и исходник фасмовский, загрузи exe в ollydbg - по F8 дойдешь до CALL [<&ntdll.RtlDecompressBuffer>], потом по F7 трассируя, отладчик тебе покажет куда и как идут вызова (по 77FD0D60 лежит таблица адресов ф-ций распаковки, твоя на 77FD0D68)



    Нужно провести анализ, если весь код "базонезависимый", похоже так и есть(кроме таблицы), то можно просто сдампить его и таблицу (+ поменять адрес вызова таблицы), вставить в фасм и сгенерить обьектник (чтобы подключать из MS линкера), иначе получать листинг из IDA\OllyDbg + пропарсить\поправить чтоб компилился

    [​IMG] _658605450__lznt1.zip
     
  13. LZNT1

    LZNT1 New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2005
    Сообщения:
    45
    Адрес:
    Ukraine
    Спасибо, я тоже на работе. Причём далёкой от ассемблера. :)
     
  14. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    И что с того, я сам экономистом работаю :) это уже оффтоп, лучше посмотри lz77 (может не те параметры ему даешь)
     
  15. LZNT1

    LZNT1 New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2005
    Сообщения:
    45
    Адрес:
    Ukraine
    Ага, нашёл, вот оно.



    Спасибо. Осталось только понять как это всё работает. Может кто нибудь может DLL-ку склепать?



    [​IMG] _876223487__lznt1.asm
     
  16. LZNT1

    LZNT1 New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2005
    Сообщения:
    45
    Адрес:
    Ukraine
    bogrus,

    А я под 1С:Предприятие програмлю. LZ77 я не пробовал. Я вообще ещё ничего не пробовал. Читал только что LZNT1 отличается от LZ77. Вот хотел найти отличия. А вообще я только LZW знаком, и то не близко.
     
  17. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    LZNT1

    Большие куски листинга нужно аттачить, а не постить текстом.
     
  18. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    RtlDecompressBuffer я сдампил(~3Kb), в аттаче пример распаковки без ntdll, а для dll нужно только релоки построить (в дампе около десяти ссылок на таблицу)
     
  19. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
  20. LZNT1

    LZNT1 New Member

    Публикаций:
    0
    Регистрация:
    12 июл 2005
    Сообщения:
    45
    Адрес:
    Ukraine
    Ага, спасибо. Иными словами я могу подгрузить этот бинарник с диска или ресурсов и просто передать ему управление?