GZIP есть-ли АПИ для упаковки и распаковки?

Тема в разделе "WASM.NETWORKS", создана пользователем s_d_f, 15 мар 2010.

  1. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Всем здрасте.

    Подскажите пожалуйста АПИ-функции для Content-Encoding: GZIP и DEFLATE.
    Написал простенькую программку, ставящую хук на WSARecv для iexplore.exe(64-разрядный), с дальнейшим выводом содержимого в EDIT-BOX. Только там ещё нужно распаковывать текст, чтобы его было видно.

    Вот код функций.
    Код (Text):
    1. x_WSARecv proc <7> uses rbx  s:QWORD,lpBuffers:QWORD,qwBufferCount:QWORD,lpNumberOfBytesRecvd:QWORD,\
    2. pFlags:QWORD,lpOverlapped:QWORD,lpCompletionROUTINE:QWORD
    3. LOCAL AxResult:QWORD
    4. LOCAL DxResult:QWORD
    5. LOCAL CallerHeader:QWORD
    6. LOCAL CallerName[128]:BYTE
    7. LOCAL CallerToRecvOut[256]:BYTE
    8. ;IndexOfName=52
    9. WSARecv TEXTEQU <[FuncAddrs][8*70]>
    10.     mov s,rcx
    11.     mov lpBuffers,rdx
    12.     mov qwBufferCount,r8
    13.     mov lpNumberOfBytesRecvd,r9
    14.     ;actions before
    15.     ;---------------------------------------------------------------
    16.     ;call to original function
    17.     invoke WSARecv,s,lpBuffers,qwBufferCount,lpNumberOfBytesRecvd,\   ;вызов настоящего WSARecv`a
    18.     pFlags,lpOverlapped,lpCompletionROUTINE
    19.     mov AxResult,rax
    20.     mov DxResult,rdx
    21.     ;actions after
    22.     .if AxResult==NULL && hRecv
    23.         CONSTANT CallerPatt db 13,10,'Вызов из модуля %s',13,10,\
    24.                             'с аддрессом возврата %I64x',13,10,0
    25.         invoke RtlPcToFileHeader,[rbp+8],addr CallerHeader   ;получение по аддрессу хэндла модуля
    26.         invoke GetModuleFileName,CallerHeader,addr CallerName,sizeof CallerName
    27.         invoke sprintf,addr CallerToRecvOut,addr CallerPatt,addr CallerName,[rbp+8]
    28.         invoke RecvOut,addr CallerToRecvOut
    29.         mov ebx,dword ptr qwBufferCount
    30.         .repeat
    31.             mov rdx,lpBuffers
    32.             lea rdx,[rdx][8*rbx-8]
    33.             lea rdx,[rdx][8*rbx-8]
    34.             .if [rdx][WSABUF.u_long]
    35.                 invoke RecvOut,[rdx][WSABUF.buf]   ;это вывод в edit-box
    36.             .endif
    37.             dec rbx
    38.         .until ZERO?
    39.     .endif
    40.     ;results returning
    41.     mov rax,AxResult
    42.     mov rdx,DxResult
    43.     ret
    44. x_WSARecv endp
    Например для http://www.ya.ru/ после первого заголовка видны одни крякозябры
    Код (Text):
    1. Вызов из модуля C:\XP64\system32\wsock32.dll
    2. с адрессом возврата 7ff770f3518
    3. HTTP/1.1 200 OK
    4. Server: nginx
    5. Date: Mon, 15 Mar 2010 09:26:16 GMT
    6. Content-Type: text/html; charset=utf-8
    7. Last-Modified: Tue, 12 Jan 2010 15:29:04 GMT
    8. Transfer-Encoding: chunked
    9. Connection: keep-alive
    10. Content-Encoding: gzip
    11.  
    12. 96a
    13. ‹®’Td6ֽ؏PLb¬é†ž?%*ôZl›=d5@™¨µß*Ùe›…¤‚~­]CjFeo†´¸ã4}”cODäÃÓfó-f$¼?£na•/BOë©¢R!Ì$öÈ´FyA–„üº=c÷¼ [C1¶à-DsºØˆ›<ˆõs
    14. Û•gQÛE@DZð    )   ±Mà,øZÖ<²HŸå"sÓ ‘‹Uó3~Á‹Q­wÁSˆÃx$ú¾pϝÉӏ·«}Í©èi pt~äµ5”’Zéñ²öÉF«µ¶qÚxæÒÒ¾Ž#—?¤R½ï4[å„)ˆ˜á£ÜÇ©£ÈW<1äãP®ú„Ÿ CëÃ;˜22ó  fõ;Ÿ¾¼Ç‚¨ôƒÌ„S†1I…§b3ŒS¬ë;v§ßUÊ#3Ñ™ô;ýzݘ¼kÿJi]{H ­>WrÒ?ïµ4œç¥ûyã™x¢½­™8ðBATØ»>òt¥¡H?a±+aæhTB5èrçš5>(BàÌ´÷»½™ÿ
     
  2. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
  3. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Трудно найти, чтоб можно было просто скопипастить. Еслиб на C++ писал.
     
  4. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    zlib посмотри
     
  5. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    это там элементарно делается

    unc_buff=new CHAR[len*100];\\5 or 10 or 1000 мы не знаем степень сжатия

    show_error("Expanding...");

    zstrm.zalloc = Z_NULL;
    zstrm.zfree = Z_NULL;
    zstrm.opaque = Z_NULL;
    zstrm.avail_in = len;
    zstrm.next_in = Z_NULL;
    inflateInit(&zstrm);

    zstrm.next_in=(Bytef *)buff;

    zstrm.avail_out = len*100;
    zstrm.next_out = (Bytef *)unc_buff;
    ret=inflate(&zstrm,Z_NO_FLUSH);
     
  6. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    и кстате если данные в гзипе то и распаковываемый размер можно узнать
    в злибе есть функции специально для работы с гзипом
     
  7. Exception13

    Exception13 New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    66
    Адрес:
    Владимир
    Ээээ, не все так просто и быстро, там еще заголовок gzip'a есть, и если просто так подсунуть данные в zlib - то ничего не выйдет. Плюс ко всему, необходимо заводить автомат состояния для zlib'a т.к. необходимо последовательно обрабатывать блок за блоком (Transfer-Encoding: chunked). Как этот автомат состояния выглядит можно посмотреть в библиотеке whireShark. Когда то давно я писал http парсер подсматривая некоторые моменты в whireshark'e .
    Вот, собственно код для распаковки самих данных...
    Там правда дебаговая версия для т.ч. ловить утечку памяти внутри zlib, а она там может быть если неправильно автомат состояний построишь...
     
  8. onSide

    onSide New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    476
    какой конечный автомат ?
    Я когда-то дописывал в злиб ф-цию для сжатия и распаковки данных прямо из памяти, вообще странно что там такой ф-ции нет по умолчанию) Зато есть ф-ции gzwrite/gzread для файлов, я оттуда вызовы повытаскивал и вставил в свою ф-цию, там ничего сложного. Правда после этого у меня размер проекта увеличился килобайт на 15-20 от этого злиба... В винде в урлмоне есть класс для работы с гзипом,тока его в очень старых версиях неть, гуглите вобщем :)
     
  9. Exception13

    Exception13 New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    66
    Адрес:
    Владимир
    который может распаковывать поток данных (поток по определению может быть бесконечным).
    Вот в zlib'e включили такую возможность для распаковки потоков, т.е. данные в zlib запихиваются порциями. И как тут обойтись без конечного автомата ? А функция inflate библиотеки как раз этим и занимается, подсовываешь ей блок данных и она выдает распакованные данные и код ошибки который как раз характеризует внутренний автомат состояния zlib'a.
    Читайте документацию и смотрите примеры, там все прекрасно расписано.
    http://www.zlib.net/zlib_how.html
    http://www.zlib.net/manual.html
     
  10. WRP

    WRP New Member

    Публикаций:
    0
    Регистрация:
    30 апр 2009
    Сообщения:
    29
    Парни , как правильно распаковать raw data ?
    Имеем буфер запакованный . Размер буфера может быть любым.
    Заголовка буфер не имеет .
    При распаковке максимум правильно распакованных байт 4096 начала . Дальнейшие байты нули.
    У кого есть код функции для распаковки raw data ?
    Спасибо.
     
  11. megaaa

    megaaa New Member

    Публикаций:
    0
    Регистрация:
    29 май 2009
    Сообщения:
    51
    советую не мучаться, а тупо затереть в Content-Encoding: пробелами всё, если там написано gzip или deflate тогда данные пойдут не сжатыми, ну и HTTP 1.0 добавить иначе все будет валиться чанками, браузер иногда не может такое схавать.
     
  12. megaaa

    megaaa New Member

    Публикаций:
    0
    Регистрация:
    29 май 2009
    Сообщения:
    51
    это относилось к тому, если вы не измените HTTP 1.1 на HTTP 1.0 :)
     
  13. doesn

    doesn New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2007
    Сообщения:
    97
    а еще можно через юрлмон длл
    IDataFilter IEncodingFilterFactory