cs_Nebula
Messages postés787Date d'inscriptionsamedi 8 juin 2002StatutMembreDernière intervention 7 juin 2007
-
9 oct. 2004 à 18:30
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 2014
-
9 oct. 2004 à 21:42
Bonsoir à tous, comme le titre ne l'indique pas j'essaie (pour le fun) de faire un binaire contenant le moins d'imports possibles, voire même aucun (puisque les adresses sur kernel32 semblent fixes, je suppose qu'on peut mettre en dur les adresses de cette librairie - au pire deux imports suffisent, mais c'est déjà assez pour se faire hooker)... Malheureusement, le code suivant bugge atrocement et je ne vois pas trop ni pourquoi ni comment y remédier :-/
mais seul le premier print() est affiché, les autres semblent tourner dans le vide et le programme plante lors du pExitProcess, voici les informations retournées par le débugger :
tiny.exe caused an Access Violation at location 00000000 Reading from location 00000000.
Registers:
eax=00000001 ebx=7ffde000 ecx=7c81cbcb edx=00350608 esi=00000000 edi=00000010
eip=00000000 esp=0022ff9c ebp=0022ff88 iopl=0 nv up ei pl zr na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
Call stack:
AddrPC AddrReturn AddrFrame AddrStack Params
00000000 00403050 0022FF98 0022FF9C 7C800000 00000007 7C812CA9 7C829047
00000000
00403050 00000001 0022FF88 0022FF9C 7C829037 003D0000 00000000 00403050
00403050 tiny.exe:00403050 mainCRTStartup main.c:44
void mainCRTStartup()
...
print(TEXT("Hallo World !%n"));
print(TEXT("Hi World !%n"));
> pExitProcess(0);
}
Pourtant si on regarde les valeurs des pointeurs avec GDB, on trouve les adresses parfaitement valides, après plantage en règle du programme: Program received signal SIGSEGV, Segmentation fault. 0x00000000 in ?? () :
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 9 oct. 2004 à 19:18
Salut,
Je pense qu'il faut ajouter la convention d'appel des fonctions. Tu peux essayer de définir les types de pointeurs en ajoutant WINAPI (ou __stdcall) comme ceci:
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 9 oct. 2004 à 20:24
Dommage pour le gigot, je suis plutôt végétarien :) merci quand-même.
Moi aussi je m'étais intéressé à l'appel des API directement par leurs adresses. Le problème c'est que ces adresses, pour une même DLL, diffèrent d'un Windows à un autre (98/2000/XP etc...) . Et elles diffèrent aussi selon la version de cette DLL dans un même Windows.
A+
racpp
Messages postés1909Date d'inscriptionvendredi 18 juin 2004StatutModérateurDernière intervention14 novembre 201417 9 oct. 2004 à 21:42
Très intéressant à savoir et à faire aussi si l'application est destinée à un seul PC (ou d'autres ayant le même OS et même version de DLL).
L'appel direct par adresse doit être plus rapide que l'appel par pointeur.