Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1121 connectés 

  FORUM HardWare.fr
  Programmation
  ASM

  Nombre de bytes requis pour executer une instruction

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Nombre de bytes requis pour executer une instruction

n°1251820
red factio​n
Posté le 23-11-2005 à 19:47:08  profilanswer
 

je cherche des infos concernant les instruction asm et le nombre de bytes que celle ci ont besoin par apres pour etre executées...
Ex : E9 c un jmp32 et apres il attend 4 bytes....
jai ete voir dans les docs de chez intel mais rien  :sweat:

mood
Publicité
Posté le 23-11-2005 à 19:47:08  profilanswer
 

n°1251851
olivthill
Posté le 23-11-2005 à 20:38:07  profilanswer
 

La longueur des instructions varie beaucoup. Par exemple, E9 peut être suivi de quatre octets, ou bien de deux octets si le processeur est en mode 16 bits. Le codage des instructions est assez complexe (j'en parle en connaissance de cause, car j'ai écrit un assembleur Intel). Toute la doc est en ligne, par exemple sur le site http://www.sandpile.org/ia32/index.htm , mais une doc papier est plus confortable à lire et plus détaillée, par exemple Robert L. Hummel, The Processor and Coprocessor, ZD-Press, ou carrément les manuels techniques d'Intel, que l'on peut trouver à Paris chez Erolles, ou ailleurs.


Message édité par olivthill le 23-11-2005 à 20:38:58
n°1251868
red factio​n
Posté le 23-11-2005 à 20:55:26  profilanswer
 

Enfait jen ai surtout besoin car je doit devier l'appel vers certaines apis Win32 (ici PatBlt)  
 
j'utilise la technique expliquée ici :
http://www.intel.com/cd/ids/develo [...] htm?page=6
"Not implemented : 2. Automatic detection of the offset for the trampoline function."
 
Dans certains cas jai besoin d'appeler le PatBlt original (trampoline function). Pour devier les functions jutilise des jmp. le probleme c qu'il se peut que je decoupe 1 instruction asm en 2 lors d'un jump :S (d'ou linteret de savoir la longeur pour chaque opérande...)
 
je peut pas avoir un offset fixe car chaque version de gdi32.dll est differente dun pc a l'autre (Patblt est implemente dans gdi32.dll)


Message édité par red faction le 23-11-2005 à 20:56:11
n°1253318
red factio​n
Posté le 25-11-2005 à 15:45:57  profilanswer
 

[:yoyoz]  WaRLodZ et €l|tes de l'asm montrez vous!

n°1253354
Taz
bisounours-codeur
Posté le 25-11-2005 à 16:29:22  profilanswer
 

après t'as des architectures avec des instructions à taille fixe. genre ppc/ppc64 c'est 32bits.

n°1253449
jan0
Posté le 25-11-2005 à 18:38:26  profilanswer
 

ce que tu peux faire:
-sauvegarder les 5 premiers octets(en 32bits) de la fonction a intercepter
-ecrire ton jmp a la place vers ta routine d'interception
ensuite dans ta routine d'interception:
-sauver les registres
-faire ce que tu as a faire
-reecrire les 5 octets originaux
-poper l'adresse de retour et la sauvegarder
-restaurer les registres
-faire un call vers la vraie fonction
-sauver les registres
-faire ce que tu a as faire
-reecrire le jmp
-restaurer les registres
-pusher l'adresse de retour sauvegardée puis ret ou bien un jmp direct
 
comme ca tu peux intercepter avant et apres l'appel quelque soit la fonction sans avoir a se preoccuper du code que tu effaces.
 
par contre je sais pas trop si plusieurs threads appelent la meme fonction detournée plus ou moins en meme temps ...

Message cité 1 fois
Message édité par jan0 le 25-11-2005 à 18:40:46
n°1253555
red factio​n
Posté le 25-11-2005 à 23:03:38  profilanswer
 

jan0 a écrit :

ce que tu peux faire:
-sauvegarder les 5 premiers octets(en 32bits) de la fonction a intercepter
-ecrire ton jmp a la place vers ta routine d'interception
ensuite dans ta routine d'interception:
-sauver les registres
-faire ce que tu as a faire
-reecrire les 5 octets originaux  
-poper l'adresse de retour et la sauvegarder
-restaurer les registres
-faire un call vers la vraie fonction
-sauver les registres
-faire ce que tu a as faire
-reecrire le jmp
-restaurer les registres
-pusher l'adresse de retour sauvegardée puis ret ou bien un jmp direct
 
comme ca tu peux intercepter avant et apres l'appel quelque soit la fonction sans avoir a se preoccuper du code que tu effaces.
 
par contre je sais pas trop si plusieurs threads appelent la meme fonction detournée plus ou moins en meme temps ...


 
au moins un qui suit ....  :D  
 
Jy avais deja pense au fait de remplacer les bytes de depart pour pouvoir appeler la fonction par default .. mais comme tu l'explique dans ton msg, pour les threads ca coince. Le prog contenant plusieurs thread des le depart, et la routine a patcher etant destinée a laffichage (patblt) je vais pa prendre de risque la dessus :s. Sinon javais eu comme idée de recopier entierement tout la fonction de base dans un fonction a moi puis dy faire appel. Mais la function en question (patblt) contient pas mal de saut vers dautre function de la dll et la plupart sont relatifs en +  :sweat:  donc c pas possible :S
 
 
pour linstant la seul solution que jai trouvé a été de patcher directement les saut vers Patblt moi meme (en changeant le Call) et laisser ceux qui doivent appeler la fonction par default comme ca.
 
ca fonctionne mais c bcp moins pratique qu'un trampoline jump...  :D
---------------------------------------
Edit:
 
jvien de trouver une pseudo solution
 
tout les appels vers patblt sont formes ainsi  : call dword ptr[30004541]
 
si on va voir dans 30004541 :
30004541 dd 77202544 (adresse de patblt dans gdi32.dll, remplie au runtime lors du chargement de la dll)
 
dont il suffirait decraser 4 bytes a 30004541 pour detourner tout les appels, apres il suffirait dappeller lancienne adresse (77202544)  :sol:


Message édité par red faction le 25-11-2005 à 23:34:54
n°1253560
red factio​n
Posté le 25-11-2005 à 23:16:18  profilanswer
 

Toujours dans le mm ordre d'idée, jai reussi a detourner getsyscolor et GetSysColorBrush de facon a donner a l'application un jeu de couleur different :p (a la WindowsBlinds mais que pour une appli :D)
 
Tout fonctionne bien sauf que la couleur des messages box se font toujours dans la couleur de l'os :S (donc MessageBox n'appelle pas GetSyscolor ou GetSysColorBrush pour savoir dans quel couleur il doit peindre le fond + les boutons :S)
 
Je vois vraiment pas ou il irait chercher ca .... Un tableau recopié dans User32.dll ou gdi32.dll ? une autre api ? un appel systeme ? (int 2E)
 
En gros je cherche a skinner les MessageBox de mon appli....


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  ASM

  Nombre de bytes requis pour executer une instruction

 

Sujets relatifs
Nombre de visiteurs connectés. Recherche script[SQL] Nombre de champs, optimisation
Demander un nombre de caractere minimum dans un formulaire[Visual Basic 6] - Compter le nombre de fois qu'une lettre apparait
autorisation pour executer lot DTS depuis VB[Visual Basic 6] Nombre aléatoire qui n'est pas vraiment aléatoire...
copier dans une case d'un tableau d'entier 4 bytesincrémentation par un nombre décimal
diviseur d'un nombre entierNombre de lettres et de chiffres
Plus de sujets relatifs à : Nombre de bytes requis pour executer une instruction


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR