La librairie ne gère pas pour le moment les processus multi thread, vous ne pouvez pas non plus utiliser certaines APIs ou utiliser des SEH (vote code utilisera une pile virtuelle dans la quelle on ne peut placer de SEH) ce problème sera résolu dans les prochaines versions de la lib, je l’ai un peu codé à l’arrache pour les besoins d’un prochain article sur l’unpacking de PELock.

La lib ne gère pas non plus certains cas spéciaux comme l’utilisation des DRs par la protection pour poser des HBPs en exécution, en effet les opcodes étant exécutés dans la mémoire de la lib aucune exception n’est levée. De la même façon la lib ne supporte pas l’utilisation de la suite d’instruction pushf | or dword esp , 0x100 | popfd qui sert a armer le trap flag, cette suite d’instruction entrainera une exception à l’adresse du popfd et non sur l’instruction suivante (c’est du au fonctionnement de la lib, je vous laisse réfléchir si vous voulez comprendre pourquoi …)

Histoire de dire quand même que ma lib sert à quelque chose, vous n’avez plus a vous soucier de la détection du debugger si vous programmez un unpacker ou n’importe quel autre outil (comme un logger d’APIs) de plus la lib gère parfaitement les exceptions (si une exception est levée, le hook de KiUserExceptionDispatcher se chargera de remplacer l’eip du context (qui pointe sur le code de la lib) par l’eip virtuel et lorsque l’exécution continuera après la gestion de l’exception, un filtrage de ZwContinue permet de reprendre l’exécution sous le contrôle de la lib) l’exécution est aussi relativement rapide même si bien sur comme le programme est entièrement exécuté pas à pas il faut un peu de temps pour par exemple exécuter une flopée de layers.

Enfin la lib intègre une mini fonction de parsing de PE (mini mini hein, je l’avais faite pour un autre tool au départ et elle ne permet pas grand-chose pour le moment) Voila l’ensemble des fonctions de la lib utilisables :

extern void* ParsePE(HMODULE hMod, int champ);
extern  int __stdcall LDE(void* address , DWORD type); // le LDE de bea
extern BOOL IsBP (DWORD address);
extern DWORD run(); // renvoie l’adresse du BP à laquelle s’est interrompue l’exécution 
extern BOOL setBreakPoint(void* adresse);
extern void deleteBreakpoint(void* address);
extern void return2code();  // restaure les registres, quitte bee-lib et continue l’exécution du code
extern void initDbg(void (*Script)());  // à appeler obligatoirement à l’initialisation de la dll Script correspond à votre code utilisant les fonctions de la lib
extern void Return2CodeAndBreak(); // même chose que return2code à part que avant de sauter sur le code execute une int3
extern void GoTo(void* address); // pause un BP à l’adresse et lance le programme tant qu’on a pas atteint le BP puis supprime le BP (même chose que F4 sous olly)
extern CONTEXT ThreadContext; // correspond au context de la thread

Concrètement si vous voulez programmer un unpacker, il faudra le faire sous la forme d’une dll compilée avec VC++, la compilation necessitera les librairies bee.lib, LDE64.lib (tu rox Beatrix2004 ;) )et bee-lee.lib. A l’initialisation de la DLL vous appellerez initDbg (qui se chargera de poser un BP à l’EP du processus et de hooker KiUserExceptionDispatcher) vous passerez à cette fonction l’adresse de votre « script ». Pour utiliser cette DLL vous utiliserez l’outil IinjBee disponible ICI qui se chargera de lancer le processus cible et d’injecter votre dll avant l’exécution de l’entry point (merci hastert ;))

Le code de la lib (C+asm) ainsi que la lib sont disponibles ICI, si vous vous appelez hastert, ne le lisez pas sinon je vais encore passer mon temps a me faire insulter sur irc ;) par contre si vous avez des questions, vous êtes le bienvenu n'hesitez pas a poster un commentaire ou à passer sur #uct@irc.epiknet.org ou sur mon mail que vous trouverez sur cette page

Voili voilou, j’espère que cette lib servira à quelques personnes et que je ne l’aurai pas codée uniquement pour mon utilisation personnelle.
Cette lib va normalement évoluer pour gérer le multi thread et pallier certains inconvénients, je pense aussi que je rajouterai des fonctions propres à l’unpacking qui facilitera encore le développement d’unpacker. Enfin un exemple de l'utilisation de la lib sera prochainement publié sous la forme d'un unpacker pour PELock (c'est plus un fixer qu'un unpacker mais bon ..)

PS : Si le nom de cette lib ne vous plait pas -> RANAFOUTTE !