begin process at 2012 05 25 02:27:56
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Assembleur

 > 

Divers

 > 

Débutant(e)

 > 

Appel DLL


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Appel DLL

jeudi 10 mai 2007 à 00:09:34 | Appel DLL

Arnaud16022

Membre Club
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
jeudi 10 mai 2007 à 08:43:45 | Re : Appel DLL

Nasman

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+

jeudi 10 mai 2007 à 11:37:20 | Re : Appel DLL

ToutEnMasm

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
jeudi 10 mai 2007 à 12:50:01 | Re : Appel DLL

Arnaud16022

Membre Club
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
jeudi 10 mai 2007 à 13:52:03 | Re : Appel DLL

Nasman

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+

jeudi 10 mai 2007 à 17:36:34 | Re : Appel DLL

ToutEnMasm

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.

[ Lien ]
                                               

vendredi 11 mai 2007 à 23:19:12 | Re : Appel DLL

patatalo

Membre Club Administrateur CodeS-SourceS
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...

@++
samedi 12 mai 2007 à 08:16:20 | Re : Appel DLL

ghuysmans99

Membre Club
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 ??
lundi 14 mai 2007 à 17:25:57 | Re : Appel DLL

patatalo

Membre Club Administrateur CodeS-SourceS
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 !!!

@++
jeudi 24 mai 2007 à 11:47:27 | Re : Appel DLL

Arnaud16022

Membre Club
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


Cette discussion est classée dans : taille, appel, dll, fonctions, maximum


Répondre à ce message

Sujets en rapport avec ce message

[MASM32] DLL export en C [ par frobinet ] Bonjour, Pour créer un PlugIn, il faut que je transforme une dll en appel de convention stdcall vers un appel de convention en C. j'ai remplacer pa Comment compiler un kernel en C et en asm [ par vinc1008881 ] Bonjour tous le monde Voilà mon problème : Je voudrait faire un petit kernel en C qui contient admettons 2 fonctions- cls- printfCes fonctions, je les Création d'une dll sous Win [ par JoTheDoor ] Bonjour,Malgré tout les indications de Winamp, je me suis entêté à créer un plugin avec RadAsm.  Tout fonctionne très bien sous Win 95/98.  Mais sous dll windows [ par tequilasurlaterre ] bonjour a tous  Est il possible de modifier ou de le changer, le fichier index du dossier cookies de windows,sans que windows ne le repare. je veux a Problème avec un code [ par showbiz_hurricanes ] Bonjour Pour un projet universitaire, je dois concevoir un programme de tri en assembleur mais celui ci ne fonctionne pas comme je le voudrai. Le debugeueueur en masm32 [ par papiboff ] BJ vous avez dit blizzard comme c'est bizarre j'ai fait un debugeueueur pour ma dll avec MessageBox ; oui oui et mon debug me dit que la dll travaill Exploiter une dll c++ avec l'ASM [ par frobinet ] Bonjour,Je souhaite utiliser une dll écrite sous forme de class à partir du C++ dans mon programme ASM:Exemple :class DLL_EXPORT NomDeClass    {    pu DECOMPRESSER UNE ARCHIVE RAR AVEC UNRAR.DLL [ par tomart2005 ] Bonjour,J'ai des difficulté à coder une PROC qui utilise la dll unrar.dll étant donné le manque de doc trouvé, si quelqu'un a déjà réaliser un prochai Comment utiliser une DLL asm en C++ [ par Neo_Fr ] Salut tt le monde,Je suis tres intereser par le dll suivante: http://www.asmfr.com/code.aspx?ID=23840J'ai besoin de deux fonctions qui sont inclu dans DLL et Code Segment [ par Taron31 ] Bonjour, j'ai une question peut-être un peu étrange : en effet, je voudrais savoir si tout le code d'une DLL (par exemple NtDll.dll) est situé dans un


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,967 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales