Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 2010
-
10 mai 2007 à 00:09
Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 2010
-
24 mai 2007 à 11:47
Bonjour
J'ai quelques soucis pour appeler des fonctions de l'API win32 ( ou n'importe quelle DLL, à vrai dire)
Google me fait défaut sur le coup, et asmfr itou ; quelqu'un aurait-il un petit tuto sur le sujet ? ou quelques conseils ?
Nota Bene :
Il se trouve que je veux réduire au maximum, mais réellement maximum, la taille de mon .com ( pas exe pour ne pas avoir la taille du header PE en plus ), et donc, écrire moi-même, dans le segment .text , le nom des fonctions à importer, ainsi que le nom des dlls . Rien d'automatique si possible .
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 10 mai 2007 à 08:43
Bonjour Arnaud16022,
Je crois que tu auras de grosses difficultés pour utiliser les API win32 avec un fichier.com pour plusieurs raisons:
- la première c'est que pour appeler une API win32 il faut connaitre son adresse dans l'espace de mémoire virtuel. Cette adresse est exprimée sous la forme d'une adresse 32 bits, par exemple MessageBoxA correspond à l'adresse 77E03D81 (windows 2000). Il te faut connaitre l'adresse de l'API pour son appel.
Pour la connaitre il te faut utiliser une table d'importation qui te donne la correspondance entre la chaine de caractère (nom de la fonction) et l'adresse qui ne sera connue qu'au chargement du programme.
Malheureusement les tables d'importation ne sont pas disponibles avec le format .com - tu te trouves ainsi dans une impasse.
Autre chose: sauf erreur de ma part le fonctionnement des appels est différent entre le mode réel et le mode protégé. En mode réel tu précise le segment CS(16 bits) et l'offset IP(16 bits) lesquels se chevauchent pour former une adresse finale de 20 bits. (pour un .com CS=DS=ES=SS) ; en mode virtuel CS exprime des droits d'accès et l'offset EIP (32 bits) correspond à une adresse virtuelle de mémoire.
Je pense que le plus simple pour toi est de faire un programme exe 32 bits.
Quelles sont les contraintes qui t'imposent de faire un fichier .com et quelles sont les fonctions win32 que tu souhaites utiliser. Peut-être que des fonctions Bios ou DOS suffiraient ?
Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 20102 10 mai 2007 à 12:50
hum.
*relit 3 fois les réponses*
Déjà, c'est _possible_ , je l'ai vu ; par contre, de là à le faire, c'est une autre histoire ^^
ToutEnMasm -> peut-être voulais tu dire 16 bits ? : )
OK pour les tables d'importation . Sauf que justement, moi ce que je veux écrire c'est un truc comme ça ( de tête ):
db "MessageBoxA",0
db .. le nom de toutes mes autres fonctions
times 5 db 0
db "user32.dll",0
db "openGL32.dll",0
( très approximativement ) .
Pour la seconde partie de ta réponse : le .com est en mode virtuel ? je ne savais même pas tiens :s gné. Mais le bios ne suffit pas, non. Pour les contraintes : tentative de démo 4k :p
cs_Nasman
Messages postés202Date d'inscriptionmardi 17 mai 2005StatutMembreDernière intervention29 septembre 20083 10 mai 2007 à 13:52
Rebonjour,
Si tu désires mettre le nom de tes fonctions dans les data et les appeler par la suite, tu peux le faire mais tu dois utiliser un format PE.
Tu pourras utiliser les fonctions LoadLibraryA avec le nom de la dll comme paramètre puis GetProcAddressA avec le nom de la fonction et le "handle" renvoyé par LoadLibrary.
Cependant les fonctions LoadLibrary et GetProcAddress doivent elles même être importées pour fonctionner. Ton problème pourra, dans le meilleur des cas se limiter à l'importation de deux fonctions de kernel32.dll mais ce ne pourra être fait que si tu utilises le format PE.
Exemple de programme donnant l'adresse de la fonction (Nasm)
extern LoadLibraryA ;définition des fonctions externes
import LoadLibraryA kernel32.dll ;importation de l'adresse de la fonction
extern GetProcAddress ;idem
import GetProcAddress kernel32.dll
segment code public use32 class=CODE
..start:
Push dword Librairie
Call [LoadLibraryA] ;handle du module de user32 (eax)
Push dword Fonction
Push eax
Call [GetProcAddress] ;adresse de MessageBoxA (eax)
push dword 0
push dword Titre
push dword Message
push dword 0
call eax ;appel de la fonction MessageBoxA
ret
segment data public use32 class=DATA
Titre db "Nom de la boite",0
Message db "Coucou",0
Librairie db "user32.dll",0
Fonction db "MessageBoxA",0
L'exécutable correspondant fait 2580 octets (pour 40 octets de code) en raison des alignements de section et du PE header
Regarde si tu peut partir sur cette voie
A+
Vous n’avez pas trouvé la réponse que vous recherchez ?
ToutEnMasm
Messages postés587Date d'inscriptionjeudi 28 novembre 2002StatutMembreDernière intervention13 décembre 20223 10 mai 2007 à 17:36
Salut,
Les fichiers com fonctionnent en 32 bits,un module masm32 spécial permet de faire cela.
Le seul ennui c'est que windows ouvre une fenêtre dos et la au-revoir les appels API ou alors la série est très limité et il faut se référer a MSDN pour chaque API.
En gros c'est beaucoup de docs a compulser pour pas grand chose.Bon courage.
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 11 mai 2007 à 23:19
salut,
tu peux effectivement te passer de l'IAT (cf source windows debugger sans debugger ) qui permet de trouver la kernel32 ainsi que la fonction souhaitée ( c'est une emulation simplifiée des fonctions du peloader ).
Par contre, le passage du .com au mode 32 bits, là, je vois pas !!!
peut-etre en DPMI ? ou alors en bidouillant le thread ?
masm32 -> le lien http://support.microsoft.com/kb/238245/fr parle de ShellExecute() ou WinExec() mais un .com tu double clic dessus et il s'execute, il n'y a pas besoin d'un programme tiers pour demarrer un fichier .com.
le plus simple serait peut etre de faire un exe win32 avec un peloader rétréci a mort !!! (cf Danny Boom). Il doit y avoir des options de link pour ça...
cs_ghuysmans99
Messages postés3982Date d'inscriptionjeudi 14 juillet 2005StatutMembreDernière intervention30 juin 201316 12 mai 2007 à 08:16
non, un fichier *.com s'éxécute avec ntvdm.exe car il est émulé ...
imaginez qu'il s'éxécute tout seul : il peut tripoter partout dans la mémoire et sur le dd ... gênant ??
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 14 mai 2007 à 17:25
salut,
ghuysmans99, qu'entends tu par "s'execute tout seul" ? et, non, il ne pourra pas tripoter partout dans la memoire et le HD à moins d'avoir un privilège de niveau 0 ou de le forcer par l'exploitation d'une faille de sécurité (ce que peut faire également n'importe quel processus).
correction:
le plus simple serait peut etre de faire un exe win32 avec un peheader rétréci a mort !!!
Arnaud16022
Messages postés1329Date d'inscriptionvendredi 15 août 2003StatutMembreDernière intervention16 juin 20102 24 mai 2007 à 11:47
Bonjour les gens
Tout d'abord, désolé pour le délai de réponse, les partiels approchent dangereusement.
Merci pour vos remarques, je ne savais pas que le .com était exécuté en mode virtuel 32 bits.
J'avais déjà tenté de bidouiller le header PE d'un bon vieux .exe pour en avoir un petit mais flemme de farfouiller trop en profondeur dans les specs -> pas réussi.
Je viens de trouver ce site:
http://www.phreedom.org/solar/code/tinype/ où le gars explique comment créer un .exe de 97 bits qui retourne 42... très , très, mais vraiment très impressionnant, superbe démarche, explications nickel.
Seul pb : le code ENTIER ne peut tenir que sur ... un dword :D ( dans le champ "date de création" du header PE, fallait y penser quand même )
Merci de vos réponse une fois de plus, je vais aller voir de ce côté.