smalldragon ha scritto:
vedo di farti un esempio per farti capire.
Non mi hai fatto capire con quell'esempio, anzi hai complicato le cose.
Intanto non capisco perché hai voluto mischiare codice sorgente C++ e sorgente Assembly se le due cose si possono più comodamente integrare in un unico sorgente C++ con la keyword _asm.
Poi penso che tu non l'abbia neanche provato dato che fai una call a geteip ma nel codice esiste solo una label getip ... quanto meno avrebbe dovuto darti un errore in compilazione (anzi in fase di linking).
Infine, tutto il (confuso) discorso sul modello flat mi lascia perplesso (anche dopo circa 30 anni di programmazione assembly) dato che proprio il modello flat presuppone un unico segmento dati e un un unico segmento di codice (proprio per questo flat!).
Che c'entri poi un cambio di segmento per una chiamata di funzione che sta a pochi byte di distanza non lo capisco proprio.
Comunque, il tuo codice, se scritto correttamente, funziona come dovrebbe e ottiene il valore dell'EIP al momento dell'esecuzione della pop. Ovvero
#include <iostream>
#include <iomanip>
using namespace std;
int eipstart=0;
int pleftstringa(char *arg1, char *arg2, int arg3)
{
_asm
{
call geteip
geteip:
pop eipstart
mov ecx,arg3
mov edi,arg2
mov esi,arg1
cmp ecx,0
jne uno
mov eax,2
jmp short fine
uno:
cmp byte ptr [esi],0
jne due
mov eax,1
jmp short fine
due:
xor eax,eax
rep movsb
mov dword ptr [edi],0
fine:
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char pippo[71],pluto[68];
int ncar,indy,kindy,err,opz;
ncar=0; err=0; kindy=0; opz=0;
for (indy=0;indy < 71;indy++) { pippo[indy]=' '; }
for (indy=0;indy < 68;indy++) { pluto[indy]=' '; }
cout << "inserisci stringa una stringa max 70 caratteri : ";
cin.getline(pippo,71);
cout << "quanti caratteri vuoi prendere ? ";
cin >> ncar;
err = pleftstringa(pippo,pluto,ncar);
cout << "hai preso i seguenti caratteri : " << pluto << "\n";
cout << "eip start : 0x" << hex << eipstart << endl;
return 0;
}
Fermo restando che, se non comprendi bene il mio suggerimento e non ti fidi, sei padrone di adottarne un altro.
Oppure, se vuoi che la chiamata a getip riguardi una funzione esterna allora
int geteip()
{
_asm mov eax,[ebp+4] // return address in stack frame
}
int pleftstringa(char *arg1, char *arg2, int arg3)
{
_asm
{
call geteip
mov eipstart,eax
mov ecx,arg3
mov edi,arg2
mov esi,arg1
...