Directive Invoke

Signaler
Messages postés
37
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
13 novembre 2005
-
Messages postés
582
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
2 août 2021
-
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

Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
37
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
13 novembre 2005

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
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
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++
Messages postés
37
Date d'inscription
mardi 25 février 2003
Statut
Membre
Dernière intervention
13 novembre 2005

Merci

Tchao
bazole
Messages postés
582
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
2 août 2021
2
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