Il semble kue (ma lettre KU est HS désolé) kue rolKa confonde Hacking et Cracking. Bon pas grâve... (on ne parle pas de l'intrusion d'un réseau)
Je confirme ku'il n'y a aucun moyen d'empêcher kuelku'un de modifier un programme si il a vraiment les compétences pour le faire.
Cependant on peut lui mettre pas mal de batons dans les roues. Un petit tour d'horizon pourra peut-être t'aider à mieux comprendre ce kui peut être fait.
Je pense en particulier à :
- du code détectant les débuggers (facile à péter cependant)
- du code CCA (Code Changeant d'Apparence = une sorte de polymorphisme) c'est très simple à faire, un simple jmp sautant au dessus d'un byte inutilisé mais ayant une signification pour le processeur et le tour est joué.
ex:
Le processeur va l'interpréter ainsi car 0F+... a une signification propre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 EB01 jmp SautLeByte 0F leByte db 0Fh SautLeByte: E807000000 CALL MaProcedure
Le truc c'est ku'en traçant, on voit le code changer, ça permet de cacher des points clefs et ça peut être superchiant à tracer.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 EB01 jmp SautLeByte 0FE807 psubsb MM0, [edi] 0000 add [eax], al
Mais avec un peu de pratikue on peut facilement anéantir ça. Pour ma part je patch tous les bytes kue saute le jmp par des 90h.
puiskue 90h (un NOP) est interprété sans suite, 90h+AUTRECHOSE ne peut rien donné d'autre kue ça. UPX l'utilise beaucoup...
- Bon plus puissants sont les cryptage/décryptage PE. Un programme cypté possède une partie non crypté (un loader) kui sert à décrypté le reste du programme une fois ku'il a été mappé en mémoire.
Du coup avec un débugger on ne voit plus rien car le code crypté n'a plus une signification réelle. Cependant c'est toujours possible de le reconstituer. Il suffit pour ça de laisser le loader décrypter le vrai programme et une fois u'on se trouve sur la première ligne du programme décrypté, de faire un dump (copie d'une zone de mémoire, ici le prog décrypté). On en refait un *.exe et ensuite on fait repointer OEP (Original Entry Point) sur la première ligne du prog décrypté, Le tour est joué.
La seule difficulté c'est de retrouver l'OEP (surtout si les BPR ont été mis hors d'état de fonctionnés par le loader).
C'est le niveau ultime utilisé par UPX.
- Toujours plus puissant, ce serait évidemment de crypter le programme mais en plus de faire en sorte d'empêcher le DUMP. Et c'est possible, mais ce serait trop long à explikuer en détail. En résumé, L'IAT kui est une section de ton programme où se trouvent écrits tous les noms des fonctions ku'il utilise. Le truc c'est ku'il est possible de faire en sorte kue le programme s'exécute normalement avec les bonnes fonctions, mais en plus de modifier son IAT en mémoire pour kue toutes les fonctions soient remplacées par ExitProcess par exemple. On s'en fout de modifier, l'IAT par la suite car il a servit au début mais plus jamais ensuite. Par contre un DUMP du programme en mémoire va faire en sorte u'une fois reconstitué en un *.exe, tout son IAT n'aura u'une seule fonction, ExitProcess.
C'est bien joué ça, 1 : Le programme est Cypté donc on ne voit rien. 2 : Si on le dump pour faire en sorte de retrouver sa version décrypté, il ne marche plus.
Seule solution, tout faire soit même à la main. C'est à dire laisser le loader décrypter le programme MAIS en prenant garde aux passage du loader kui modifient l'IAT. Ecraser ces passages pour l'empêcher d'agir. Evidemment, ça suppose de tracer le programme en comprenant ce ku'il fait, et c'est plus du niveau des premiers crakers. Ca suppose de connaitre intimement l'IAT.
- Dans un autre genre, tout aussi efficace, le cas des dernières versions d'ASPROTEC.
En décortikuant ses entrailles on s'aperçoit kuil remplace par exemple :
CALL BFF70000 kui pourrait correspondre à l'appelle de la fonction MessageBoxA par exemple.
Pourkuoi ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 PUSH ESP MOV ESP, EBP CALL BFF70003
En fait kuand il appelle une fonction et bien il saute "au-debut de cette fonction + 3 bytes" et justement ces 3 bytes ku'il ne va pas exécuter dans la fonction même, il le recopie directement dans le programme pour kue rien ne mankue lors de l'exécution globale.
Du coup les débuggers ne reconnaissent plus les Noms des fonctions puisku'elles ne pointent plus sur leur début. En plus après un Dump en mémoire, on se retrouve avec des petits bouts de code supplémentaires (PUSH ESP...) dans le programme kui le font planter car la pile reçoit des données en trop.
Bien entendu le remède existe, un simple bout de papier et un cerveau, ou bien le vraiment excellent programme Revirgin de +Tsehp (mais pas évident à aborder)
Donc voilà, tu vois kue tant ku'un debugger pourra lire la première ligne d'un programme, la possibilité d'abbattre les différentes protections sera toujours possible pour peu kue le savoir et l'acharnement suivent. Cependant faut pas nier kue ça se pête pas comme ça les doits dans le nez, comme c'était le cas y a encore 7 ou 8 ans.
(Je différencie clairement Cracking et Reverse, dans le premier cas de simples bases en programmation peuvent suffir dans les cas simples. Dans le second cas de réelles compétences en programmation sont indispensables)
Partager