Pour un premier post, désolé, c'est sur du win32 :). Je lisais dernièrement
"GrayHat Python"
et je découvre Pydbg (un debugger écrit en python) que je ne connaissais pas
(bon je ne connais pas grand chose non plus, du coup c'est plus facile d'être
émerveillé) et dans le chapitre sur le hooking je tombe sur un exemple de
"soft-hooking" (le hooking avec un breakpoint soft (INT3) sur la fonction qui
t'intéresse) pour "sniffer" les connections SSL dans firefox (hook sur une
fontion specifique de firefox).
Ca me rappelle des discussions avec eau qui avait déjà commence a
bosser dessus, en voyant comment le truc est tout con ca m'a donne envie de
voir si hooker les "CryptoAPI"s de MS que IE utilise est tout aussi
simple.
Donc une fois recup Pydbg, un petit "import pydbg" et on peut
instancier un object debugger mydbg=pybdg.pydbg().
Et voila! maintenant qu'on a notre debugger instancié, on peut s'attacher a des
process, mettre des breakpoints, lire l'etats des registres etc.. Un peu comme
scripter a l'interieur d'IDA ou ImmunityDebugger.
Du coup c'est vrai que le soft hooking comme ca c'est tout bidon. Un petit
breakpoint dans la fonction qui nous intéresse, une callback fonction pour
effectuer des opérations sur cette fonction et on release le breakpoint pour
que le process continue normalement.
Bon, c'est pas efficace du tout côté perf, c'est clair...
Mais pour un ptit hooking rapido histoire de tester/fuzzer un truc ca peut etre
sympa et utile.
Alors voila j'ai matte les CryptoAPI de MS et j'ai pense d'abord hooker
"CryptEncrypt()" et "CryptDecrypt()" exportées par
"Advapi32.dll".
Ok finalement en cherchant un peu, il y a eut pleins de présentations sur le
hooking de ces 2 fonctions (par exemple celle-ci) et en effet c'est tout bon mais pour sniffer
uniquement.
Si on veut modifier les requêtes envoyées par exemple, alors la on voit
qu'on tombe sur un os, en tracant les appels un certain
"CryptHashData()" est appelé avant "CryptEncrypt()"
et donc dommage.. Difficile de modifier un truc hashe préalablement sans que ca
se voit! Et la ce cher eau me dit qu'il avait regarde
"EncryptMessage()" et "DecryptMessage()" et il avait
raison le bougre!
En effet "EncryptMessage()" prend la requête, appele
"CryptHashData()" puis "CryptEncrypt()" et balance
tout ca hashé/chiffré ensuite au fonctions résal(réseaux). Du coup hooker
"EncryptMessage()" est bien plus intéressant puisqu'avant le hash
donc possible de modifier la requête.
Je n'ai pas encore réussi a faire tout ce que je voulais sur
"EncryptMessage()", modifier la requête...ok, mais uniquement si
sa nouvelle taille est <= a l'originale. Pour en générer une de taille >
a la requête originale, je coince.
J'ai essaye de mettre a jour la taille a plusieurs endroits, re-ecrire la requête en allouant assez de place ailleurs et updater les pointeurs/références sur ma nouvelle requête mais niet... je dois merder, quelque chose m'échappe.
Voyant que des fonctions appelées avant "EncryptMessage()"
manipulaient aussi la requête HTTP et utilisaient la taille pour différents
trucs que je n'ai pas exploré je me suis résigné a hooker la dedans et c'est
passé. Enfin, j'ai finalement hooke une fonction qui se trouve dans
"Wininet.dll" mais elle semble tres specifique a IE donc pas super
fonctionnel pour autre chose qu'IE... (i.e. Thick Client)...
Pour ceux que ca intéresse, voila un petit bout de code tout bidon (et pas
beau je sais :)..) mais c'est juste pour tester et voir comment jouer avec
pydbg et le soft-hooking:
J'ai teste ca sur XP SP2 en anglais avec IE7.
Un petit print screen aussi pour voir ce que ca donne:
Pydbg fait parti du framework Paimei (du coup ca m'a donne envi de revoir
kill bill2..):
Paimei
svn checkout http://paimei.googlecode.com/svn/trunk/pydbg
paimei-read-only
CryptEncrypt(), CryptDecrypt(), EncryptMessage(), DecryptMessage()
Ca passe ok avec python 2.6 sur ma VM XP mais quelques posts disent que pydasm ne passe bien qu'avec python 2.5.

