월드 오브 워크래프트 트래픽과 함께 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()를 시도했습니다. 하지만 출력이 없습니다.
각 패킷은 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;
}
와우에 대해 많이 알지 못하지만 '00 00 00 ff ff'로 끝나는 패킷은 '00 00 ff ff'로 끝나는 것을 의미하지 않습니까? –
예, 당신 말이 맞습니다. 그러나 다른 스트림에서는 그 전에 00 00 ff ff wihtout 00 만 보았습니다. 내가 그렇게 말한 이유. –
여분의 '00'이 페이로드의 일부일 수 있습니다. –