Le code auto modifié ? - ASM - Programmation
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
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
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. |
G une classe pour la generation d'opcode si ca interesse qqun
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 ...
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
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 ... |
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)
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 (en plus fo deja cprendre comment ca marche)
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.
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 :
|
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 :
|
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 :
|
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 :
|
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...
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
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)
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. |
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
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 ...
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.
Marsh Posté le 07-07-2003 à 14:27:07
drasche a écrit : |
tu parles niveau encodage ? C le meme bronx pour toutes, a peu pres
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
Marsh Posté le 07-07-2003 à 14:29:46
drasche a écrit : |
quand j'avais codé un mini compilo JIT Z80 pour x86, j'en avais chié, et pas que pour le MOV
Marsh Posté le 07-07-2003 à 14:31:26
Harkonnen a écrit : |
Petit joueur
Regarde, aujourd'hui j'ai decide que le java serait fun
Code :
|
(keskonsmarre didonc )
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
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
Marsh Posté le 07-07-2003 à 14:33:35
drasche a écrit : |
et ben on savait s'amuser de ton temps
Marsh Posté le 07-07-2003 à 14:39:20
chrisbk 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é
Marsh Posté le 07-07-2003 à 14:43:23
Harkonnen a écrit : |
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
(je sens le gros caca a la fin, mais bon, on s'eclate quand meme )
Marsh Posté le 07-07-2003 à 15:03:24
Java c'est pas bien
Y'a pas à dire, c'est avec les langages les moins sécurisés qu'on s'éclate le plus
Je vais me créer un nouveau multi du nom d'"anti-nraynaud"
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. |
Tu fais quoi comme études ? C'est où qu'on étudie ça ?
Marsh Posté le 07-07-2003 à 15:06:36
Harkonnen a écrit : |
bof, on s'éclate différement, stout
Marsh Posté le 07-07-2003 à 15:16:12
HelloWorld a écrit : |
c'était ya 10 ans à l'INPRES, Seraing, province de Liège en Belgique (graduat en informatique)
le bon vieux temps
Marsh Posté le 07-07-2003 à 15:17:50
lorill 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/StringV hein ?
Ou elles sont les convetions d'appels bien relou ?
Marsh Posté le 07-07-2003 à 15:17:55
lorill a écrit : |
tiens au fait, le python, ça génère du byte-code ou c'est compilé en JIT ?
Marsh Posté le 07-07-2003 à 15:19:42
chrisbk a écrit : |
chrisbk
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 ?
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
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?"
(non par ironie, je le précise )
Marsh Posté le 07-07-2003 à 15:23:38
Harkonnen a écrit : |
byte code, sauf si tu utilises le module psycho
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 |
cf mes posts de ce matin dans blabla@prog
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 |
Tout d'abord il te faut un assembleur
http://mrl.nyu.edu/~meyer/jvm/guide.html
Je l'essaye dans 2mn celui la
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
Marsh Posté le 07-07-2003 à 15:25:49
lorill a écrit : |
Marsh Posté le 07-07-2003 à 15:29:23
un volontaire pour faire valider le code de ma fonction fonctionSomme() par Taz ?
Marsh Posté le 08-07-2003 à 09:31:04
harkonnen tu es un chef, une encyclopédie vivante de l'assembleur
j'ai juste une question : dans ton premier exemple, tu modifies la donnée à l'adresse [label+3]. comment tu calcules cette adresse ?
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 |
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
Marsh Posté le 08-07-2003 à 16:47:42
Citation : pas de pb, je te post ca ce soir si tu veux |
Je le veux bien moi ton code
Marsh Posté le 08-07-2003 à 16:50:18
HelloWorld a écrit :
|
Sur un plateau dans 2h, mais la je dois y aller
Marsh Posté le 07-07-2003 à 12:35:06
bonjour
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 ? )
merci
---------------
Bougredane et bougre d'andouille ne font qu'un !