Salut,
J'ai passé pas mal de temps à essayer de décompresser un gzip de serveur http en utilisant la zlib, mais pas moyen.
Alors déjà, je n'ai jamais vu un code aussi mal conçue, d'un point de vue pratique.
Exemple:
Etre obligé de faire des pointeurs de pointeurs pour une fonction aussi basique, je trouve ça complètement ridicule et vraiment énervant. Tellement énervant que j'avais commencé à lire la rfc pour faire mon propre code, mais bon, ça me prendrait du temps que je n'ai pas en ce moment car j'ai d'autre chose à coder plus importante.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 mov rcx,163 mov edx,dword [buf1_ptr] mov esi,dword [dstlen_ptr] mov edi,dword [buf2_ptr] xor eax,eax call [uncompress] buf1_ptr dq buf1 buf2_ptr dq buf2 buf3_ptr dq buf3 dstlen_ptr dq dstlen buf1 rb 512 buf2 rb 512 buf3 rb 512 dstlen dq 512
Si encore ça fonctionnerait, mais ce n'est pas le cas.
Tout aussi ridicule de devoir préciser la taille des deux buffers, taille qui pourrait être calculer avec 5 lignes d'asm.
Je m'attendais vraiment à du lourd pour l'implémentation d'algo de compression/codage, mais là c'est tout l'inverse.
Quand je tente de compresser et decompresser des bytes dans un buffer, ça fonctionne parfaitement.
J'ai même récupéré les bytes compressés, puis lancé de nouveau le code avec uniquement "uncompress", au cas où l'une n'aurait pas pu fonctionner à part de l'autre, mais non, ça fonctionne également.
Par contre, impossible de déchiffrer les byte que j'ai récupéré d'une page web, celle-ci:
http://www.perdu.com/
J'ai lancé Wireshark pour récupérer le code gzip du push+ack de la page d'acceuil de ce site.
Donc ce code:
Il est dans le fichier texte en pièce, parfaitement déchiffrable avec un zcat test.txt, ou un gzip -d -c test.txt
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
21f8b0800000000000003358fb10ec2300c4477bec213480814d115cb4c0c6c9dd84363914825298e5389bf2721e2d6f7ce3aa3d7d74ce8d93a420d3a33dd53c97055ce30b2b80217341da0e9da23b94fad9ca8f35c04e6dd2d2a4b646d7a45e8071a6d06c7b0d818de850f9022ac16d676de06c752c58130aba4f8245c84096af680c7962e6e790a329ddb9a300534cd42f3ef983ec5fc9ed87c01b4a18a2dcc000000
Mais pas moyen avec la zlib, alors là je capte vraiment pas.
La fonction me revoit un code -3 "Z_DATA_ERROR"
La seule explication que je vois c'est que ce n'est pas du gzip, mais du deflate pur.
Mais alors pourquoi zcat et gzip me le décompresseraient..
De plus Wireshark utilise la zlib pour déchiffrer.
A moins qu'il utilise d'autres api de la zlib liées spécialement au deflate.
J'ai tracé les appels, rien de visible concernant la zlib. Je trouve ça étrange également, car Wireshark est censé vérifier si la zlib est présente lors de la compilation, c'est donc qu'il utilise la librairie, est non qu'il dispose de sa propre implémentation de celle-ci.
Bref, je suis perdu.
Si quelqu'un arrive à déchiffrer ce fichier avec la zlib, bah bravo, parce que moi c'est mort et j'ai cherché longtemps.
Partager