Blog

MiniHook, une alternative à Detours

Detours est une librairie de re-routage de fonctions Windows développé par Microsoft Research. Bien que complète et très simple d'utilisation, le gros désavantage est que la version gratuite ("Express") soit limitée aux programmes 32-bits. La version Professionnelle qui gère le 64-bits coûte $10.000 :(

Il existe une alternative open-source développer par Tsuda Kageyu jp appellé MiniHook . Elle est beaucoup plus légère, supporte le 32 et 64 bits et elle est aussi simple d'utilisation que Detours.

Voici un exmple d'utilisation :

Hook Connect

L'idée ici est de pouvoir détourner la connexion d'un programme, cela peut être pratique lorsque l'on souhaite réaliser un proxy qui alterne certains paquets d'un jeu en ligne. Pour cela il nous faut une DLL à injecter dans le jeu qui aura pour rôle de réaliser ce détournement de fonction.

En temps normale, on appel simplement la fonction et on obtient le résultat.


Maintenant on détourne la fonction pour que lorsqu'on l'appel celle-ci redirige vers un hook, c'est-à-dire une fonction où l'on pourra alterer certaines données, puis on appel la vraie fonction pour obtenir la résultat.


On commence par inclure les bon entêtes ainsi qu'ajouter les librairies nécessaires :

Ensuite on réalise notre surcouche de la fonction connect():

Et pour terminer on initalise et créer le détournement lors de chargement de la DLL:


Dofus : Système de log

Dofus 2 intègre un système de log performant qui peut être rediriger vers différente sortie tel que la console admin, un rapport HTML, un serveur socket, un fichier log (encoder ou en clair). Le plus intéressant reste le rapport HTML, il fournis en plus des logs une multitudes d'information sur le compte, le personnage, la map etc...

Je vais dans cet article présenter les différents sortie des log et comment y accèder/lire.


Rapport HTML

(Cliquez pour agrandir)

Le rapport HTML est le plus simple à obtenir, il suffit juste de créer un fichie (vide) nommer "debug.txt" à la racine du jeu (où ce trouve Dofus.exe).
Après il suffit simplement de présser la touche F11 et de sauvegarde le rapport.

Liste des informations fournis :

  • • Logs du client.
  • • Infos du PC.
  • • Infos du compte.
  • • Type et version du client.
  • • Nom de compte.
  • • Serveur.
  • • Personnage.
  • • Map ID.
  • • Apparence.
  • • Capture d'écran.
  • • Infos de la carte.
  • • Message d'erreurs.

Code source :


Activation des autres sorties

Pour activer les autres sortie de logs il existe un fichier nommé "log4as.xml" à la racine du jeu qu'il faut modifier. Ce fichier permet de chargé les modules de log souhaité.

Pour chaque sorties j'indiquerais la ligne d'activation a placé au milieu de ce code :

<logging>
    <targets>
        <!-- liste des modules ici -->
     </targets>
</logging>


Sorite réseau

Serveur chacha :)

J'appel cette sortie le "serveur chacha" car au sein d'Ankama, un serveur répondant sous le petit nom de chacha.ankama.lan permet de recevoir les logs (le client se connecte dessus avec le port 6666).
Il existe sûrement un programme qui permet ensuite de récuperer et exploiter ses logs mais il est également possible de recréer ce serveur et d'afficher les logs directement dans la console.

<target module="com.ankamagames.jerakine.logger.targets.CentralizeTarget">


Serveur local

Même principe que le serveur distant sauf que cette fois le serveur est en local (connexion sur localhost:4444).
La verbositée de cette sortie est plus faible et elle demande à être "nettoyé" des balise qui l'entour.

<target module="com.ankamagames.jerakine.logger.targets.SOSTarget"/>


Fichier log

Chemin d'accès pour les fichier log (.log et .d2l) : "C:\Users{user}\AppData\Roaming\Dofus 2\logs"
(Accès rapide : "%AppData%")


FileTarget

Le FileTarget est le fichier log générer en claire.

<target module="com.ankamagames.jerakine.logger.targets.FileTarget"/>


Fichier .d2l

Les fichiers log .d2l sont générés automatiquement sur tous les clients, contrairement au FileTarget celui-ci est encoder. Aucun raison de s'attardé sur l'encodage en question, il suffit simplement d'utiliser les sortie spécifié plus haut.


Why you reverse my program ? (Part 1) : Theory

L'année dernière, un employé de chez AVG a eu la surprise alors qu'il était sur le point de reverse un malware, de voir s'afficher un chat contenant un message du hacker, propriétaire du programme, lui demandant ce "qu'il faisait avec son programme" (lien du billet).
Autre cas avec Xylitol sur une VM infectée : le tweet


Comment est-ce possible ?

La réponse est plutôt simple, grâce à une fonction de l'API Windows, "isDebuggerPresent".
Cette fonction check, si un debugger est présent, dans ce cas il suffit d’exécuter l'ouverture d'un chat.
En général cette fonction est utilisé comme Anti-Debugger, beaucoup de programme s'en servent pour s'auto-killé, empêchant de reverse le programme mais là aussi c'est le jeu du chat et de la souris, il est très facile de la bypass et sur OllyDbg par exemple, il existe un script pour le faire automatiquement.
Partons sur le principe que notre code analyste n'ai pas bypassé cette fonction, il faut donc créer un programme qui sera analysé ainsi qu'un chat.


Intégration du chat

Il est plus judicieux d'opter pour un chat "séparé" du programme principal, car dans le cas contraire, si le code analyste stop le debugging alors le chat se retrouverai fermer :( Après tout dépend du contexte, pour un logiciel légitime on peut très bien avoir un exécutable à part, en revanche pour un malware, deux exécutables sa fait un peu lourd pour la portabilité.
Il existe énormément de solutions, comme par exemple télécharger puis exécuter le chat ou encore build un exécutable avec le code du chat contenue dans le malware. Pour les autres, faites marcher votre imagination ;)



Maintenant, faut coder !


J'utilise la fonction "WinExec" si un debugger est présent pour exécuter le chat, ici il ce trouve dans le même répertoire que le programme analyser mais on peut très bien le "caché" dans un répertoire système.
Lorsque l'on debug le programme, le chat s'ouvrira, ouvrant une communication TCP vers un serveur tiers permettant à créateur du programme de lui faire un petit coucou.



Cisco Packet Tracer 5: Activity Wizard protection

J'ai pour habitude pour mes cours en télécom réseau, d'utiliser le logiciel Packet Tracer de Cisco, c'est un simulateur de réseaux vraiment pratiques pour s'entraîner ou concevoir la "maquette" d'un futur réseau.

Il existe sur ce logiciel des activités avec des instructions et une checklist permettant de vérifier si l'activité est terminée. Ses activités sont beaucoup utilisées dans les cours CCNA et CCPN ainsi que dans des concours telle que WorldSkills.
Ces activités sont protégées par un mot de passe, ce qui empêche donc d'avoir un accès total aux équipements réseau (l'instructeur défini les droits d'accès de chaque équipement, pouvant ainsi bloquer une interface graphique, empêcher la modification d'un équipement et bien d'autres choses).

Je me suis donc penché sur la protection des activités, plus précisément sur la vérification du mot de passe au sein du logiciel. Pour cela j'ai dû donc utiliser mes notions d'assembleur pour comprendre comment cela fonctionne et comme bypasser cette vérification.


Fonctionnement

Pour trouver le code assembleur correspondant à la vérification il suffit simplement de provoquer une erreur avec un mauvais mot de passe.

Dès lors, on connait le message d'erreur :
"The password you entered is incorrect!"


Une recherche de texte sur un debugger (OllyDbg pour ma part) nous permet de trouver l'adresse du PUSH du message.



En remontant le code on trouve l'instruction de test ainsi que le jump conditionnel ("si égalité").

En premier lieux, le mot de passe entré est converti en MD5, puis comparé à celui contenu dans le fichier de l'activité. L'instruction EAX contiens "1" si les hash MD5 sont identiques, "0" dans le cas contraire (donc mauvais mot de passe).
L'instruction "TEST EAX,EAX" équivaut à faire "CMP EAX, 0" (comparer l'instruction EAX à 0). Le jump qui suit, permet de donc d'orienter en fonction du résultat du test.

Cas où le mot de passe est valide :

EAX vaut "1" -> TEST EAX,EAX ne renvoie pas d'égalité, le jump JE n'est donc pas éxécuté -> l'utilisateur a accès au panneau de configuration de l'activité.

Cas où le mot de passe est erroné :

EAX vaut "0" -> TEST EAX,EAX renvoie une d'égalité, le jump JE est éxécuté -> le message d'erreur est renvoyé à l'utilisateur.


Bypass

Pour bypasser la vérification la seul soluction est de modifier (patcher) le code assembleur, car comme vue plus haut, les mots de passe sont hashé en MD5, hors à moins de tester chaque mot de passe un par un, il ne nous est pas possible de l'obtenir en claire.

Pour la modification du code assembleur, là il y a plusieurs possibilités, comme par exemple modifier le jump conditionnel (JE) par un simple jum (JMP). Il est aussi possible de retirer le test, le remplacer par de NOP.

J'ai réalisé il y a quelques temps une vidéo à ce sujet, je vous la conseil fortement si vous souhaitez réaliser le bypass, elle reprend les mêmes étapes que ci-dessus: