Nombre de bytes requis pour executer une instruction

Nombre de bytes requis pour executer une instruction - ASM - Programmation

Marsh Posté le 23-11-2005 à 19:47:08    

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:

Reply

Marsh Posté le 23-11-2005 à 19:47:08   

Reply

Marsh Posté le 23-11-2005 à 20:38:07    

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
Reply

Marsh Posté le 23-11-2005 à 20:55:26    

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
Reply

Marsh Posté le 25-11-2005 à 15:45:57    

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

Reply

Marsh Posté le 25-11-2005 à 16:29:22    

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

Reply

Marsh Posté le 25-11-2005 à 18:38:26    

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
Reply

Marsh Posté le 25-11-2005 à 23:03:38    

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
Reply

Marsh Posté le 25-11-2005 à 23:16:18    

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....

Reply

Sujets relatifs:

Leave a Replay

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