Newsgroup: it.comp.programmare.win32
Titolo: Problema con la GetProcAddress

Ragazzi ho un problemino. Devofareun controllo tra gli indirizzi della
ReadFile all'interno della Kernel32.dll e quella all'interno della IAT
del mio Processo. Ioutilizzo questo codice , ma mi dà problemi
potrestedarmi una mano.
        HMODULE hBaseLib = LoadLibrary("kernel32.dll");
	PROC pfnCurrent = GetProcAddress(hBaseLib,"ReadFile");
	while(pThunk->u1.Function)    //
	{
		PROC *ppfn = (PROC*)&pThunk->u1.Function;
		BOOL bFound = (*ppfn == pfnCurrent);
		if(bFound)
			MessageBox(0,"Ho trovato la ReadFile","Finestra di dialogo",0);
	}
Ringrazio chiunque sia così gentile da aiutarmi.

 problemi potrestedarmi una mano.
Se dici che problemi ti da è più facile provare a darti una mano...
-- 
Valter Minute
(the reply address of this message is invalid)
(l'indirizzo di reply di questo messaggio non è valido)

Ho creato una Dll chiamata kernel33.dll. In questa Dll vi è una
funzione (_ReadFile) che esporto. Riesco ad ottenere l'entrypoint di
questa funzione. Questo indirizzo è una   DWORD. Fin qui tutto ok.
Poi trovo la IAT del mio processo che è il NOTEPAD. A questo punto
trovo le importazioni del NOTEPAD riguardo la kernel32 e voglio
sostituire all'indirizzo  reale della ReadFile  quello della mia
funzione. Per far ciò devo fare un confronto tra l'indirizzo della
reale ReadFile e quello della ReadFile all'interno dell'IAT del
NOTEPAD.
Qui tiriscrivo il codice completo:
	//* realizziamo il puntatore alla struttura IMAGE_THUNK_DATA del
NOTEPAD
	pThunk = (IMAGE_THUNK_DATA* )
(RvaToOffset(ImageNtHeaders,ImageImportDescr[x].FirstThunk)+ (DWORD)
BaseAddress);
	//* ottengo l'indirizzo della ReadFile all'interno delle kernel32
	hModule = LoadLibrary ("kernel32.dll");
	PROC pfnCurrent = GetProcAddress(hModule,"ReadFile");
	while(pThunk->u1.Function)
	{
		PROC *ppfn = (PROC*)&pThunk->u1.Function;
		BOOL bFound = (*ppfn == pfnCurrent);              //* Faccio il
controllo tra gli indirizzi
		if(bFound)
		{
			MessageBox(0,"Ho trovato la ReadFile","Finestra di dialogo",0);
			MEMORY_BASIC_INFORMATION mbi;
			::VirtualQuery(ppfn, &mbi, sizeof(MEMORY_BASIC_INFORMATION));
			if (FALSE
== ::VirtualProtect(mbi.BaseAddress,mbi.RegionSize,PAGE_READWRITE,&mbi.Protect))
				return;
			*ppfn = (PROC) read_file_ep;  // Bisogna andare a mettere
l'indirizzo della ReadFile all'interno della kernel33.dll
			DWORD dwOldProtect;
			::VirtualProtect(mbi.BaseAddress,mbi.RegionSize,mbi.Protect,&dwOldProtect);
			break;
		}
		pThunk++;
	}
Non mi dà nessun errore , ma non mi scambia i puntatori. Per precisare
all'interno del codice " read_file_ep" è il DWORD che contiene
l'indirizzo della mia funzione.
E' più difficile a spiegarsi che a farsi.

 		PROC *ppfn = (PROC*)&pThunk->u1.Function;
cioè secondo te pThunk->u1.Function sarebbe il codice della ReadFile...?
può anche essere eh, visto che il codice che hai postato così da solo non
significa un bel nulla; ma così a naso (giudicando dal nome "pThunk") ne
dubito fortemente...
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 BaseAddress);
cos'è RvaToOffset? e cos'è ImageImportDescriptor? a me pare di capire che
tu stia tentando di leggere la INT, non la IAT, ottenendo così l'indirizzo
del *nome* della "ReadFile" piuttosto che del codice... metodo oltrettutto
non valido nel caso generale perché non sempre i simboli sono importati
per nome: possono essere importati anche per ordinale.
ovviamente il documento che ti ho linkato col cavolo che l'hai letto :)
tie': 
http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx
studiatelo come si deve anziché quei tutorials scritto a cazzo, e non
avrai più di questi problemi.


e cos'è ImageImportDescriptor?
E' il puntatore alla IMAGE_IMPORT_DESCRIPTOR

 DWORD pfnCurrent = (DWORD) GetProcAddress(hModule,"ReadFile");
Mi permette di trovare il Virtual Address della readFile all'interno
della Kernel32.dll che mi servirà per confrontarlo con quello
all'interno dellamia IAT

Il file di cui mi hai dato il link l'ho letto, forsemi sono spiegato
male o sbaglio io, Non posso scrivere tutto il codice che uso,
comunque faccioquesto:
1) Ho trovato una funzione esporta e l'ho modificata in modo tale che
mi restituisse l'entrypoint della mia ReadFile all'interno dellamia
Dll "kernel33.dll", ho confrontato l'indirizzo che mi da la funzione
con quello che esceusando il Dapendency Walker, edè lo stesso.
2) A questo punto devo andare a modificare il campo Function all'
interno della struttura IMAGE_THUNK_DATA relativa alla funzione
ReadFile importata dal mio processo bersaglio (NOTEPAD.EXE).
Per far ciò devo crearmi un puntatore alla IMAGE_IMPOR_DESCRIPTOR ,
Scorrere tutti i cari descrittori finche non trovo quello relativo
alla mia kernel32.dll che trovo nelcampo .Name della
IMAGE_IMPORT_DESCRIPTOR, Questo campo è un RVA quindo per trovare
ilnome della kernel32 lo devotrasformare mediante la funzione
RVAtoOffset.
Una volta fatto questo tramite ilcampo .FirstThunk accedo alla
IAT( che è un array di strutture IMAGE_THUNK_DATA) relativa alla
kernel32.
Qui dentro ci sono tutte le funzioni che vengono importate dal NOTEPAD
relative alla kernel32.
Creao un puntatore alla IMAGE_THUNK_DATA che è pThunk.
Tramite questo puntatore  posso scorrere i vari campi della mia
struttura IMAGE_THUNK_DATA. Per trovare quello relativo alla ReadFile
devo confrontare il valore trovato nel campo Function con quello
relativo alla mia funzione ReadFile del Kernel32.
hModule = LoadLibrary ("kernel32.dll");
DWORD pfnCurrent = (DWORD) GetProcAddress(hModule,"ReadFile");
while(pThunk->u1.Function)
	{
                DWORD ppfn =(DWORD )pThunk->u1.Function;
		BOOL bFound = (ppfn == pfnCurrent);
                if(bFound)
		{
			MessageBox(0,"Ho trovato la ReadFile","Finestra di dialogo",0);
                        ppfn = read_file_ep;
                        break;
              }
              pThunk++;
        }
Dove read_file_ep è il DWORD della mia funzione ReadFile all'interno
della kernel33.dll. A me il codice funziona  tranne che quando si
avvia il NOTEPAD non è stato fatto niente di quello che ho scritto.
Se vuoi posso mandarti il codice per farti capire meglio. fammi
sapere.

         }
Riguardando il codice di sopra ho scritto in modo sbagliato dentro l'
if , ci dovrebbe essere così.

prima di continuare la discussione ti chiedo: sei sicuro che stai
enumerando gli indirizzi delle funzioni importate, piuttosto che dei
*nomi* delle funzioni importate? perché una cosa mi pare evidente: stai
enumerando le entries di una Import Name Table, non di una Import Address
Table.


 Table.
Questo è quello che ho capito io, dimmi se mi sbaglio.
Una volta trovato il puntatore alla struttura IMAGE_IMPORT_DESCRIPTOR,
tramite il campo OriginalFirstThunk accedo alla INT( che non è detto
che ci sia sempre) e tramite il campo  FirstThunk accedo alla IAT.
E' Giusto?

 E' Giusto?
Ho sbagliato a scrivere quella puntata dal campo OriginalFirstThunk è
la Import Lookup Table,
La INT è la struttura contenente i nomi e gli Hint di ogni funzione. e
si ottiene da pThunk->u1.AddressOfData->Name.
Giusto?

OK TUTTO RISOLTO, AVEVI RAGIONE TU.
GRAZIE DI TUTTO "mrnt ".