2017-04-11 25 views
0

월드 오브 워크래프트 트래픽과 함께 pcap 파일을 가지고 있으므로 압축을 풀어야합니다. 나는 그것이 Zlib에 의해 압축됨을 안다 : http://wiki.xentax.com/index.php/List_Of_Compressed_Games 압축 된 블록의 시작 부분을 찾으려면 원시 데이터를 반복하는 코드를 작성하고 데이터의 압축을 풀고 사용 가능한 출력이 있는지 확인하십시오.와우 데이터를 압축 해제하는 방법

inflateInit2 함수를 호출하여 windowBits 매개 변수 15 (zlib 형식) 및 30 (gzip 형식)으로 zlib를 초기화합니다. Z_SYNC_FLUSH 및 Z_FULL_FLUSH 매개 변수를 사용하여 inflate()를 시도했습니다. 하지만 출력이 없습니다.

Ip traffic looks like this

각 패킷은 00의 00 FF FF로 끝난다. 그러나 zlib 설명서에는 00 00 ff ff이어야합니다.

와우 스트림에서 데이터를 추출하는 방법은 무엇입니까?

내 코드는 다음과 같습니다

void tryZlib(unsigned __int8 *StPt, __int64 size, Deflate *zlib) 
{ 
    z_stream_s * stream = new z_stream_s; 
    SecureZeroMemory(stream, sizeof(z_stream_s)); 
    bool isInit = false; 

    while (size > 0) 
    { 
     BYTE *out_buf; 
     bool isPacketLost = false; 
     unsigned __int32 total_out = 0; 
     Zlib::ZlibData ddata(StPt, size, *stream, isInit, isPacketLost); 
     auto IsOk = zlib->Decoder(ddata, out_buf, total_out); 
     zlib->Reset(*stream, isInit); 
     --size; 
     ++StPt; 
    } 
} 

팽창 래퍼 기능 :

bool Zlib::Decoder(const DeflateData & ddata, BYTE *& out_data, unsigned __int32 & size) 
    { 
     if (IsDllLoaded == false || ddata.PDU == nullptr || ddata.PDU_size == 0) 
      return false; 
     z_stream_s & strm = ddata.stream; 
     if (!ddata.isInitialized) 
      Init(ddata); 
     strm.total_out = 0; 
     strm.avail_in = ddata.PDU_size; 
     strm.next_in = ddata.PDU; 
     strm.avail_out = OUT_BUFFER_SIZE; 
     strm.next_out = out_buffer; 
     __int32 ret = 0; 
     bool isWasSync = false; 
     ret = ZDecompressor(&strm, Z_SYNC_FLUSH); 
     size = strm.total_out; 
     if ((ret = 0) || (size > 10)) 
      printf("Found!!"); 
     out_data = out_buffer; 
     return true;    
    } 
+0

와우에 대해 많이 알지 못하지만 '00 00 00 ff ff'로 끝나는 패킷은 '00 00 ff ff'로 끝나는 것을 의미하지 않습니까? –

+0

예, 당신 말이 맞습니다. 그러나 다른 스트림에서는 그 전에 00 00 ff ff wihtout 00 만 보았습니다. 내가 그렇게 말한 이유. –

+1

여분의 '00'이 페이로드의 일부일 수 있습니다. –

답변

1

당신은 원시 DEFLATE을 요청하기 위해 -15 (음수)가되도록 windowBits 매개 변수가 필요합니다.

저장된 블록은 세 개의 0이 비트 인이며 나머지 바이트는 0 바이트로 채워져 바이트 경계로 바뀌고 그 뒤에 4 바이트 인 00 00 ff ff이옵니다. 따라서 스트림의 선행 비트에 따라 00 00 ff ff 앞의 바이트는 00이 아닐 수도 있습니다.

+0

그것은 나를 도왔습니다! 감사 –