Le code auto modifié ?

Le code auto modifié ? - ASM - Programmation

Marsh Posté le 07-07-2003 à 12:35:06    

bonjour :hello:
 
toujours dans ma découverte de l'assembleur, j'ai vu passer la notion de code auto-modifié.
 
quelqu'un pourrait il m'expliquer ce que c'est ? (harkonnen par exemple ? :D)
 
merci :jap:


---------------
Bougredane et bougre d'andouille ne font qu'un !
Reply

Marsh Posté le 07-07-2003 à 12:35:06   

Reply

Marsh Posté le 07-07-2003 à 12:59:08    

ben c'est simple, tu fais des MOV sur le segment de code (CS), mais c'est chaud, t'as intérêt à maîtriser le microcode.
 
exemple:
 
MOV CS:[BX], 90h
 
90h, c'est pour le mnémonique NOP (No operation).  Evidemment faut voir ce que t'écrases et si ça s'intègre bien sinon c'est la cata :whistle:


Message édité par drasche le 07-07-2003 à 13:00:50

---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 07-07-2003 à 13:27:38    

de mon temps on appelait ca du code auto mutant  
Pitetre ca pourra t'aider pour ta recherche sur googeule [:sinclaire]


Message édité par polo021 le 07-07-2003 à 13:27:53
Reply

Marsh Posté le 07-07-2003 à 13:31:56    

drasche a écrit :

ben c'est simple, tu fais des MOV sur le segment de code (CS), mais c'est chaud, t'as intérêt à maîtriser le microcode.
 
exemple:
 
MOV CS:[BX], 90h
 
90h, c'est pour le mnémonique NOP (No operation).  Evidemment faut voir ce que t'écrases et si ça s'intègre bien sinon c'est la cata :whistle:


 
G une classe pour la generation d'opcode si ca interesse qqun [:ddr555]

Reply

Marsh Posté le 07-07-2003 à 13:51:38    

Moi ça m'intéresse ... j'avais commencé à faire ça, je me suis arrêté à l'instruction MOV ... :D


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 07-07-2003 à 13:53:52    

dans les bibliolinks, Harko a créé un topic dédié à l'assembleur.  Dans le topic, prenez le lien qui pointe sur le P4 chez Intel et... mangez-en c'est du bon, tous les opcodes sont répertoriés et expliqués ;)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 07-07-2003 à 13:54:47    

HelloWorld a écrit :

Moi ça m'intéresse ... j'avais commencé à faire ça, je me suis arrêté à l'instruction MOV ... :D


 
pas de pb, je te post ca ce soir si tu veux
 
y'a pas ts les opcodes, c un peu fouilli, ca fait que 32bits (forget mov ah,bl par exemple) mais ca marche :O
(et c deja pas mal)

Reply

Marsh Posté le 07-07-2003 à 13:55:17    

drasche a écrit :

dans les bibliolinks, Harko a créé un topic dédié à l'assembleur.  Dans le topic, prenez le lien qui pointe sur le P4 chez Intel et... mangez-en c'est du bon, tous les opcodes sont répertoriés et expliqués ;)


 
ouaip mais bon, se taper la generation des mod/RM, SIB c franchement chiant :O (en plus fo deja cprendre comment ca marche)

Reply

Marsh Posté le 07-07-2003 à 13:57:54    

Vi, et rien que l'instruction MOV, elle est assez énorme. D'où mon découragement (y'a combien d'autres instructions ?). Par contre j'avais avancé un peu plus pour le dessassemblage.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 07-07-2003 à 14:00:30    

Alors,
 
Le code auto modifié consiste à inscrire le code comme une donnée. C'est très utilisé par exemple quand tu fais des routines précompilées. A l'époque ou je codais des démos sur Amiga, j'utilisais beaucoup de code auto généré. Mais attention : c'est une pratique absolument dégueulasse, car ça a un effet désastreux sur le cache d'instructions ! T'as intérêt à flusher ton cache une fois que tu as terminé d'utiliser le code (étant donné que ce qui est normalement du code est écrit en donnée, ça part direct dans le cache de données).
 
Tu peux faire du code auto modifié pour par exemple modifier une donnée directement.
 
Exemple :

Code :
  1. int *adresse;
  2. __asm
  3. {
  4.    mov dword ptr adresse, offset [label+3] // adr de la donnée à changer dans "adresse"
  5.    mov ebx, dword ptr adresse
  6.    mov dword ptr[ebx],0x98765432
  7. }
  8. label:
  9. __asm
  10. {
  11.    mov dword ptr a,0x12345678
  12. }


Ce code auto généré modifie la donnée que tu écris dans a : je remplace la valeur 0x12345678 par la valeur 0x98765432 directement en pokant dans la mémoire à l'emplacement où se trouve la donnée [label+3]. pour ceci, il faut bien évidemment connaitre le nombre d'octets utilisés par l'opcode de "mov dword ptr adr,imm"
 
Tu peux également écrire des fonctions avec du code auto généré. Un exemple de fonction qui calcule une somme :
 

Code :
  1. int fonctionSomme(int,int); // proto de la fonction auto générée
  2. fonctionSomme = (int) new char[11]; // on réserve 11 octets pour la fonction
  3. (char *)fonctionSomme[0] = 0x55; // push ebp
  4. (char *)fonctionSomme[1] = 0x8b; // mov ebp,esp
  5. (char *)fonctionSomme[2] = 0xec;
  6. (char *)fonctionSomme[3] = 0x8b; // mov eax,[bp+8]
  7. (char *)fonctionSomme[4] = 0x45;
  8. (char *)fonctionSomme[5] = 0x08;
  9. (char *)fonctionSomme[6] = 0x03; // add eax,[bp+12]
  10. (char *)fonctionSomme[7] = 0x45;
  11. (char *)fonctionSomme[8] = 0x0c;
  12. (char *)fonctionSomme[9] = 0x5d; // pop ebp
  13. (char *)fonctionSomme[10] = 0xc3; // ret


J'ai créé ici, octet par octet, la fonction fonctionSomme, qui fait la somme de ses 2 arguments et qui renvoir le résultat dans eax. Pour l'utiliser, rien de plus simple :

Code :
  1. somme = fonctionSomme(4,2);


ce genre d'exemple permet de voir ce qu'est rééllement un pointeur de fonction : le label fonctionSomme est l'adresse de la fonction, et pointe sur les opcodes de la fonction. c'est pour ça que je dis tout le temps que si on doit apprendre un langage en premier, ça doit être l'assembleur ! une fois que tu percutes tous les mécanismes de l'assembleur, tu peux apprendre n'importe quel langage.
 
pour le code ci-dessus, ne pas oublier ensuite de désallouer la RAM réservée à la fonction (qui est avant tout un tableau d'opcodes, donc d'octets) :

Code :
  1. delete (char *)fonctionSomme;


 
Un dernier truc : n'espère pas faire de l'auto-généré sous windows aussi simplement. ce système gère la mémoire mieux que le DOS, et il faut montrer patte blanche pour ça. Avant d'écrire du code auto généré, tu dois impérativement utiliser la fonction VirtualProtect() pour demander la permission à l'OS.
De plus, si tu codes sous NT, tu dois faire un coup de FlushInstructionCache() une fois que tu as modifié les segments de code, ceci dans le cas ou tu travailles en multi-processeur.
 
Tu dois donc connaitre impérativement les opcodes de chaque instruction pour ça. Je te renvoie à la bibliolink ASM ou tu trouveras les liens vers les docs techniques des processeurs utilisés sur PC.
 
Voila...


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-07-2003 à 14:00:30   

Reply

Marsh Posté le 07-07-2003 à 14:01:17    

heuh suffisament pour faire un piti compilo
 
de tete :
 
mov,add,div,sub,mul,shl,shr,je,jmp,cmp,jg,jne,jl
fst,fstp,fld,fild,fadd,fmul,fsub,fxch,fdiv,fcos,fsin,fcom,faddi,faddir,fsubr,fdivr,fmulr...
 
La fpu est assez complete je dirais :D
 
 
Faut voir que ca repond a mes besoins du moment (g une besoin d'une instruction je fais son encodage) et pas a une volonte d'exaustivité, ce qui fait que par exemple seule une ou deux instructions permettent l'encodage avec le SIB (les autres j'avais pas besoin)
 
 
 
 

Reply

Marsh Posté le 07-07-2003 à 14:03:21    

Citation :

Un dernier truc : n'espère pas faire de l'auto-généré sous windows aussi simplement. ce système gère la mémoire mieux que le DOS, et il faut montrer patte blanche pour ça. Avant d'écrire du code auto généré, tu dois impérativement utiliser la fonction VirtualProtect() pour demander la permission à l'OS.
De plus, si tu codes sous NT, tu dois faire un coup de FlushInstructionCache() une fois que tu as modifié les segments de code, ceci dans le cas ou tu travailles en multi-processeur.


 
oue enfin, pour ton exemple de la somme il en aura pas besoin, perso je genere mon code dans un char * et je l'execute via un fin call sans que win dise quoi que ca soit
d'ailleurs a ce propos :
 
http://forum.hardware.fr/forum2.ph [...] 803&cat=10 [:cupra]


Message édité par chrisbk le 07-07-2003 à 14:06:19
Reply

Marsh Posté le 07-07-2003 à 14:17:18    

Il me semble que taper directement dans CS n'est pas possible sous win32, vu que le segment d'execution n'a pas l'attribut WRITE. Faut bidouiller les sections ...


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 07-07-2003 à 14:18:37    

HelloWorld a écrit :

Vi, et rien que l'instruction MOV, elle est assez énorme. D'où mon découragement (y'a combien d'autres instructions ?). Par contre j'avais avancé un peu plus pour le dessassemblage.


l'avantage de commencer par l'instruction MOV, c'est que d'abord, l'instruction en elle-même est archi-simple, mais ses possibilités sont si nombreuses qu'une fois que tu as fini de l'étudier, le reste est piece of cake ;)
 
C'est la première instruction que j'ai vue au cours (après les registres généraux, segments, et les différents méthodes d'adressage.


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 07-07-2003 à 14:27:07    

drasche a écrit :


l'avantage de commencer par l'instruction MOV, c'est que d'abord, l'instruction en elle-même est archi-simple, mais ses possibilités sont si nombreuses qu'une fois que tu as fini de l'étudier, le reste est piece of cake ;)
 
C'est la première instruction que j'ai vue au cours (après les registres généraux, segments, et les différents méthodes d'adressage.


 
tu parles niveau encodage ? C le meme bronx pour toutes, a peu pres

Reply

Marsh Posté le 07-07-2003 à 14:28:29    

chrisbk a écrit :

[quote]oue enfin, pour ton exemple de la somme il en aura pas besoin, perso je genere mon code dans un char * et je l'execute via un fin call sans que win dise quoi que ca soit


Oui, car je gère moi même la zone de mémoire qui sera utilisée par le corps de la fonction, mais dans le cas de la modification d'une zone de mémoire allouée par le système, tu ne coupes pas à VirtualProtect().
Personnellement, je l'utiliserai même dans le cas de la somme ! J'ai codé assez de code merdique sur Amiga, c'est pas pour en faire autant sur PC [:ddr555]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-07-2003 à 14:29:46    

drasche a écrit :


l'avantage de commencer par l'instruction MOV, c'est que d'abord, l'instruction en elle-même est archi-simple, mais ses possibilités sont si nombreuses qu'une fois que tu as fini de l'étudier, le reste est piece of cake ;)


quand j'avais codé un mini compilo JIT Z80 pour x86, j'en avais chié, et pas que pour le MOV [:mouais]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-07-2003 à 14:31:26    

Harkonnen a écrit :


Oui, car je gère moi même la zone de mémoire qui sera utilisée par le corps de la fonction, mais dans le cas de la modification d'une zone de mémoire allouée par le système, tu ne coupes pas à VirtualProtect().
Personnellement, je l'utiliserai même dans le cas de la somme ! J'ai codé assez de code merdique sur Amiga, c'est pas pour en faire autant sur PC [:ddr555]


Petit joueur :O
 
Regarde, aujourd'hui j'ai decide que le java serait fun :O
 
 

Code :
  1. //==========================
  2.  //Increment the loop counter
  3.  //==========================
  4.  code += "iload " + m_startLocal;
  5.  code += "iconst_1" + m_startLocal;
  6.  code += "iadd";
  7.  code += "istore " + m_startLocal; //this is our loop variable
  8.  code += "goto " + labelStart;


 
(keskonsmarre didonc [:ddr555])


Message édité par chrisbk le 07-07-2003 à 14:31:39
Reply

Marsh Posté le 07-07-2003 à 14:32:09    

chrisbk a écrit :

tu parles niveau encodage ? C le meme bronx pour toutes, a peu pres


même pas :D
 
juste l'illustration par l'exemple.  Je m'en suis d'ailleurs assez bien tiré à l'exam en ce qui concerne la génération d'opcodes à la main :whistle:


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 07-07-2003 à 14:33:35    

drasche a écrit :


même pas :D
 
juste l'illustration par l'exemple.  Je m'en suis d'ailleurs assez bien tiré à l'exam en ce qui concerne la génération d'opcodes à la main :whistle:


 
et ben on savait s'amuser de ton temps :D

Reply

Marsh Posté le 07-07-2003 à 14:39:20    

chrisbk a écrit :


Petit joueur :O
 
Regarde, aujourd'hui j'ai decide que le java serait fun :O
 
 

Code :
  1. //==========================
  2.  //Increment the loop counter
  3.  //==========================
  4.  code += "iload " + m_startLocal;
  5.  code += "iconst_1" + m_startLocal;
  6.  code += "iadd";
  7.  code += "istore " + m_startLocal; //this is our loop variable
  8.  code += "goto " + labelStart;


 
(keskonsmarre didonc [:ddr555])


roh putain, ça me rappelle quand j'avais optimisé mon Mandelbrot en C# directement en tapant l'IL à la main !
toute l'itération était inline-ilasmé [:ddr555]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-07-2003 à 14:43:23    

Harkonnen a écrit :


roh putain, ça me rappelle quand j'avais optimisé mon Mandelbrot en C# directement en tapant l'IL à la main !
toute l'itération était inline-ilasmé [:ddr555]


 
puisque java m'interdit mes fines techniques de bourrin crado pour eviter la duplication de code (un include barbare avec inlining pour ne pas la nommer), puisque le jdk 1.1 m'interdit de faire du javac en live, je tente l'approche frontale :O
 
(je sens le gros caca a la fin, mais bon, on s'eclate quand meme :D)

Reply

Marsh Posté le 07-07-2003 à 15:03:24    

Java c'est pas bien [:benou]
Y'a pas à dire, c'est avec les langages les moins sécurisés qu'on s'éclate le plus [:ddr555]
Je vais me créer un nouveau multi du nom d'"anti-nraynaud" [:cupra]


Message édité par Harkonnen le 07-07-2003 à 15:03:44

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-07-2003 à 15:04:47    

Citation :

C'est la première instruction que j'ai vue au cours (après les registres généraux, segments, et les différents méthodes d'adressage.


 
:ouch: :love:
Tu fais quoi comme études ? C'est où qu'on étudie ça ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 07-07-2003 à 15:06:36    

Harkonnen a écrit :


Y'a pas à dire, c'est avec les langages les moins sécurisés qu'on s'éclate le plus [:ddr555]


bof, on s'éclate différement, stout :o

Reply

Marsh Posté le 07-07-2003 à 15:16:12    

HelloWorld a écrit :

:ouch: :love:
Tu fais quoi comme études ? C'est où qu'on étudie ça ?


c'était ya 10 ans à l'INPRES, Seraing, province de Liège en Belgique :D  (graduat en informatique)
 
le bon vieux temps :'(


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 07-07-2003 à 15:17:50    

lorill a écrit :


bof, on s'éclate différement, stout :o


 
il est ou le sport quand tout ce que l'on a faire pour appeler une fonction c un invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V hein ? :O
 
Ou elles sont les convetions d'appels bien relou ? :O
 

Reply

Marsh Posté le 07-07-2003 à 15:17:55    

lorill a écrit :


bof, on s'éclate différement, stout :o


tiens au fait, le python, ça génère du byte-code ou c'est compilé en JIT ? [:cupra]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-07-2003 à 15:19:42    

chrisbk a écrit :


 
il est ou le sport quand tout ce que l'on a faire pour appeler une fonction c un invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V hein ? :O
 
Ou elles sont les convetions d'appels bien relou ? :O
 


[:prosterne]chrisbk[:prosterne2]
et il est ou le sport quand tout ce que tu as à faire pour écrire un bot c'est de vérifier que tu passes les bons arguments à la méthode adéquate de la classe qui va bien ? :o


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-07-2003 à 15:21:29    

au fait chris, t'as pas un site qui présente une référence du byte-code de java ? j'ai envie de faire mumuse avec moi aussi :D


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-07-2003 à 15:22:24    

ou "à quoi bon programmer si on peut même plus se casser la tête tranquille?" :o
 
(non par ironie, je le précise ;))


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 07-07-2003 à 15:23:38    

Harkonnen a écrit :


tiens au fait, le python, ça génère du byte-code ou c'est compilé en JIT ? [:cupra]


byte code, sauf si tu utilises le module psycho

Reply

Marsh Posté le 07-07-2003 à 15:24:08    

Harkonnen a écrit :

au fait chris, t'as pas un site qui présente une référence du byte-code de java ? j'ai envie de faire mumuse avec moi aussi :D


cf mes posts de ce matin dans blabla@prog

Reply

Marsh Posté le 07-07-2003 à 15:24:34    

Harkonnen a écrit :

au fait chris, t'as pas un site qui présente une référence du byte-code de java ? j'ai envie de faire mumuse avec moi aussi :D


 
Tout d'abord il te faut un assembleur :D
 
http://mrl.nyu.edu/~meyer/jvm/guide.html
 
Je l'essaye dans 2mn celui la :O
 
un dessambleur y'a javap fourni avec le jdk mais visiblement il te cache des infos, le fumier, genre la taille de la pile. celui la est mieux : http://www.cat.nyu.edu/~meyer/jvm/djava/
 
 
et tout sur la jvm : http://www.cat.nyu.edu/~meyer/jvm/djava/
 
Pour le moment je fais au desassemble de code bidon, pas regardé encore dans le detail comment ca marche, mais bon, ca a pas l'air bien mechant :O

Reply

Marsh Posté le 07-07-2003 à 15:25:49    

lorill a écrit :


cf mes posts de ce matin dans blabla@prog


:jap:
[:neowen]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-07-2003 à 15:29:23    

un volontaire pour faire valider le code de ma fonction fonctionSomme() par Taz ? [:ddr555]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 08-07-2003 à 09:31:04    

harkonnen tu es un chef, une encyclopédie vivante de l'assembleur :jap: :jap:
j'ai juste une question : dans ton premier exemple, tu modifies la donnée à l'adresse [label+3]. comment tu calcules cette adresse ?


---------------
Bougredane et bougre d'andouille ne font qu'un !
Reply

Marsh Posté le 08-07-2003 à 09:33:19    

vic le viking a écrit :

harkonnen tu es un chef, une encyclopédie vivante de l'assembleur :jap: :jap:
j'ai juste une question : dans ton premier exemple, tu modifies la donnée à l'adresse [label+3]. comment tu calcules cette adresse ?


g dans l'idee qu'il s'est mangé. mov dans la version qu'il a fait se decompose en trois principaux morceau :
 
l'opcode de mov (1octet)
le byte mod/RM (1octet)
les donnees a deplacer (4octets)
 
Donc perso je verrais un +2 plus qu'un +3

Reply

Marsh Posté le 08-07-2003 à 16:47:42    

Citation :

pas de pb, je te post ca ce soir si tu veux
 
y'a pas ts les opcodes, c un peu fouilli, ca fait que 32bits (forget mov ah,bl par exemple) mais ca marche    
(et c deja pas mal)


 
Je le veux bien moi ton code :D


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 08-07-2003 à 16:50:18    

HelloWorld a écrit :

Citation :

pas de pb, je te post ca ce soir si tu veux
 
y'a pas ts les opcodes, c un peu fouilli, ca fait que 32bits (forget mov ah,bl par exemple) mais ca marche    
(et c deja pas mal)


 
Je le veux bien moi ton code :D


Sur un plateau dans 2h, mais la je dois y aller :O

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed