Directive Invoke

cs_bazole Messages postés 37 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 13 novembre 2005 - 6 nov. 2005 à 12:03
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 - 8 nov. 2005 à 09:59
Bonjour

J'étudie la possibilité de créer un petit assembleur sous windows, et j'ai du mal à comprendre comment faire appel à une API windows.
Sous Masm, il y a la directive Invoke

ex:
Invoke NomFonction, Param1, Param2, Param3

qui correspondant à :
Push Param3
Push Param2
Push Param1
Call NomAPI

En assembleur pur après un "Call", il y a un adresse mémoire
(par assembleur pur, je veux dire sans directive ni macro)

D'après la source suivante, http://www.asmfr.com/code.aspx?id=31157
NomAPI correspondrait à un pointeur de l'API, obtenu par GetProcAddress qui est aussi une API, comme le chargement d'une DLL qui doit se faire grâce à une API (je suppose), et dans ce cas comment faire pour appeler GetProcAddress etc...?

Merci

bazole

5 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 nov. 2005 à 13:00
ben normalement, GetProcAddress est une fonction comme une autre:

push offset NomFonction
push hdll
call GetProcAddress

pointeur fonction est dans eax
test eax, eax
je short funcNULL
push param1 ; exemple func 2 params
push param0
call eax

funcNULL:
.....

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
cs_bazole Messages postés 37 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 13 novembre 2005
6 nov. 2005 à 15:00
Merci d'avoir répondu si vite

Ce que je veux faire, c'est carrément créer un petit assembleur.

Un niveau éditeur pour entrer les mnémoniques et les enregistrer dans un fichier ASCII.
Un niveau hexa qui transformera les mnémoniques en codes hexadécimales dans un deuxième fichier ASCII.
Un dernier niveau qui transformera le "code" hexa ASCII en binaire.

Jusque là, j'ai fait quelques tests, et c'est ok.
A ce niveau là, ce sera un assembleur pur, pas de macro, pas directive, rien de tout celà. Juste les mnémoniques du processeur.
Un "call GetProcAddress" ne pourra pas être compilé.
Sauf si je trouve l'adresse de GetProcAddress

Dans l'exemple que tu donne, tu utilise un assembleur qui est déjà capable de transformer "call GetProcAddress" en
"call pointeur/adresse de GetProcAddress"

Désolé mais j'ai du mal à expliquer les choses.

Merci
tchao
Bazole
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
6 nov. 2005 à 15:23
alors transforme le 'call' en son équivalent:

mov edx, [addrEIP]
PushParams ici
push edx ; VALEUR EIP pour addr retour
jmp addrDuRetourDeGetProcAddress

bon courage pour la suite.
Gaffe que il y a déjà pléthore d'assembleurs.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
0
cs_bazole Messages postés 37 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 13 novembre 2005
6 nov. 2005 à 16:44
Merci

Tchao
bazole
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ToutEnMasm Messages postés 587 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 13 décembre 2022 3
8 nov. 2005 à 09:59
Salut,
Il existe deux formes d'appel d'une API
Statique,utilisant les librairies de fonctions.(call nom)
Dynamique: call edx ,edx est recheché par GetProcAdresse

Un mini assembleur doit aussi prendre en compte l'adressage directe ,indirecte et indexé.

Pour plus de renseignements.
http://perso.wanadoo.fr/luce.yves/adressage.htm

ToutEnMasm
0
Rejoignez-nous