Appel DLL

Signaler
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
-
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
-
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 .

Merci de votre aide : )

Arnaud

_______________________

Omnia vincit labor improbus

9 réponses

Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
2
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 ?

A+
Messages postés
572
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
14 février 2021
2
Salut,
Les appels API sont en 32 bits,avec un fichier .com fonctionnant au maximum en 46 bits,rien ne marche c'est normal.
                              ToutEnMasm
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
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

   

_______________________

Omnia vincit labor improbus
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
2
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+
Messages postés
572
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
14 février 2021
2
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.

http://support.microsoft.com/kb/238245/fr
                                               
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
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...

@++
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
13
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 ??
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
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 !!!

@++
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
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é.

++ !
Arnaud 

_______________________

Omnia vincit labor improbus