Je profite du temps de compilation de xerces pour écrire un petit post à la va vite.

Aujourd'hui nous allons voir une autre feature de StarForce : la redirection de fonction.

J'ai rencontré cette feature après mon post sur la redirection des APIs et quand je l'ai vu j'ai pensé que c'était de la virtualisation de code tant le code de la fonction était horrible et prenait extrêmement de temps à s'exécuter avec plein de loop de partout etc.

J'avais abandonné jusqu'à ce que je tombe sur une application compilée avec VC 7.0 et dont l'une des fonction d'initialisation (donc commune à tout les programmes compilés avec VC 7.0) était redirigée. J'ai donc décidé de me re-pencher dessus avec cette fois ci un point de comparaison.

Pour étudier cette fonction de redirection (que je pensais être une fonction de virtualisation) j'ai posé des HBP en accès sur la valeur de EAX enregistré dans la pile. Cette valeur est baladée en mémoire dans 4-5 emplacement et finalement elle est dépilée et la fonction retourne dans ... la fonction originale ! Ce n'est donc pas une fonction de virtualisation mais bien une fonction de redirection !

Le problème est maintenant de fixer automatiquement ces redirections. On ne peut se baser sur une écriture de la pile, StarForce usant et abusant de call $+5 | pop reg et écrivant de cette façon extrêmement souvent à l'adresse située juste au dessus de l'adresse de retour. Heureusement, malgrès la complexité de la fonction de redirection et de ce petit inconvénient, StarForce utilise toujours la même portion de code pour retourner à la fonction originale. Cette portion de code étant très facilement identifiable, il suffit de faire une recherche en mémoire du pattern, de poser un HBP dessus et on arrive directement à la fonction redirigée !

Code restaurant les registres et retournant à la fonction redirigée :

  1. POP EAX
  2. POPFD
  3. POP EBP
  4. LEA ESP,DWORD PTR SS:[ESP+4]
  5. POP EDI
  6. POP ESI
  7. POP EDX
  8. POP ECX
  9. POP EBX
  10. XCHG DWORD PTR SS:[ESP],EAX
  11. RETN

signature de la portion de code : 58 9D 5D 8D 64 24 04 5F 5E 5A 59 5B 87 04 24 C3

Voili voilou, xerces a fini de compiler, je retourne à mon boulot ;)