Newsgroup: it.comp.lang.delphi
Titolo: Utilizzare DLL di altro programma (forse diffice...)

Salve amici!
Quello che devo fare forse è molto diffice...cmq provo a spiegarlo...
Devo utilizzare una funzione contenuta in una dll (chiamamo il file 
"esterna.dll") di un'altro programma (chiamamolo "programma.exe").
Facendo il debug con softice e ollydbg ho trovato che la funzione viene 
chiamata così:
push eax    //destinazione dei dati trattati dalla funzione
lea ebx,dword ptr ss[ebp-414]    //origine dei dati da trattare
call esterna.60c5b15B
In pratica la funzione analizza una serie di 26 caratteri all'indirizzo 
puntato dal registro "ebx" e li restituisce "trattati" all'indirizzo puntato 
da "eax".
C'è qualche anima pia che mi spiega come potrei utilizzare questa DLL in un 
mio programma e chiamarla con dei valori che voglio io?
Grazie 

mio programma e chiamarla con dei valori che voglio io?
L'unico modo per farlo č creare un thread remoto, ma non č affatto
banale come operazione.  Consulta MSDN (CreateRemoteThread).

 mio programma e chiamarla con dei valori che voglio io?
Scusa, qual'č il problema per cui non puoi chiamarla direttamente?
Non conosci il prototipo della funzione? se č scritta in C probabilmente
i parametri sono due puntatori a carattere...
Il valore di ritorno puoi eventualmente ignorarlo, l'unica cosa da
vedere č la convenzione di chiamata ma credo si possa dedurre
dall'assembly che hai appena postato...
Ciao,
-- 
Andrea

 dall'assembly che hai appena postato...
La funzione non ritorna niente (ne sono certo e se poi fosse cosě non mi 
serve a niente)
Hai qualche esempio o suggerimento? Io devo SOLO fare una form con un tasto 
per verificarne il funzionamento, ma non sň come implementare il codice per 
la chiamata alla procedura. 

 ha scritto nel messaggio 
news:apfvr1h1cl972hbp4...@4ax.com...

LOL! Esagerato!
O mi sono spiegato male io o hai capito male tu...  devo solo richiamare una 
procedura che č in una DLL   :)    mica mandare un razzo in orbita! :P
Thnks comunque!

Dimenticavo di dire che la funzione non è esportata (con tdump non la vedo 
nelle exports) 

 restituisce all'indirizzo param2
prima non erano 26? ;-)
Ciao HTH
-- 
Andrea

 nelle exports) 
Se non è esportata come fa l'altro programma ad usarla?
-- 
Andrea

 Andrea 

E' quel che stò tentando di "affrontare" con il vostro aiuto.

     begin
A te non interessa chiamare la "GetTime" ma solo visualizzare il
puntatore. In pratica:
ShowMessage(Format('%d', Integer(Pointer(GetTime))))
Prova, ma non sono sicuro che l'indirizzo sia lo stesso per tutti i
processi. So che la porzione "codice" della DLL è caricata una sola
volta (mentre la parte dati è replicata per ogni processo) ma credo
venga mappata in memoria con indirizzi relativi al singolo processo.
Ciao
-- 
Andrea

Allora...cosě mi ritorna in @GetAddrDLL il valore giusto di una funzione 
esistente...
  @GetAddrDLL := GetProcAddress(Handle, 'questaesiste');   (@GetAddrDLL 
diventa  $60c52d72)
Ma se io volessi impostare direttamente @GetAddrDLL con il valore  $6079927d 
come posso fare?
Cosě restituisce errore il compilatore :
  @GetAddrDLL := $6079927d;
Incompatible types Integer and Pointer
Come ovviare?

 Come ovviare?
Castalo:
  @GetAddrDLL := Pointer(...);
PS: hai saltato a piè pari il mio disclaimer sulla coerenza degli
indirizzi...
-- 
Andrea

 Andrea
Castrato funziona...mò vado avanti...e cerco di passare i parametri...che 
sarà ancora più difficile!
Per adesso grazie infinite a tutti!

Ho fatto così, ma non riesco a passare i parametri...
Ho fatto così:
 THandle = Integer;
 TGetAddrDLL = procedure(var input,output: pointer);
poi ho definito 2 array e li ho riempiti:
ingresso:array [0..256] of char;
uscita:array [0..256] of char;
// il riempimento non lo posto
poi:
Handle := LoadLibrary('mialibreria'); //qui ok
if Handle <> 0 then
 begin
 @GetAddrDLL := Pointer($6079927d);
  GetAddrDLL(Pointer(input),Pointer(output));    //qui mi dà invalid 
typecast
 end;
Perchè non è valido il cast?!

>  GetAddrDLL(Pointer(input),Pointer(output));    //qui mi dà invalid
"ingresso" ed "uscita" ovviamente...(e non input ed output) 

 Perchè non è valido il cast?!
Perchè stai ragionando "a la C". Delphi distingue fra un array e un
puntatore, quindi se vuoi passare l'indirizzo dell'array dovrai usare
l'operatore @.
-- 
Andrea

Esatto...rimanenze cattive delle scuole superiori...
Ho corretto così:
PtrIngresso,PtrUscita:pointer;
PtrIngresso:=@ingresso;
PtrUscita:=@uscita;
GetAddrDLL(PtrIngresso,PtrUscita);
Il problema è che PtrIngresso e PtrUscita prima della chiamata risultano 
uguali?!?! Come è possibile? Se entro nel debug, non dovrei trovarmi 2 
valori differenti!?

 valori differenti!?
Facci vedere come valorizzi ingreso e uscita...
-- 
Andrea

 O mi sono spiegato male io o hai capito male tu... [...]
Ho capito male io (ma al posto tuo eviterei di ridere in faccia alla gente
che cerca d'aiutarti).  Avevo inteso che volessi utilizzare la DLL,
richiamandone la funzione esportata da un'applicazione esterna alla tua.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 che cerca d'aiutarti).  
Parla lui...
-- 
Andrea


Non credevo di esser stato offensivo, scusa.

 da "eax".
Che devi fare, il crack di una chiave hardware ?
La richiesta č strana, di solito non capita di linkare una dll di
cui non si conosce il prototipo.
Ciao,
-- 
Virgilio Lattanzi        HARPAX srl
Tel: 
+39 0733 818863
     via Fontanella, 38
Fax: 
+39 0733 819133
     62012 Civitanova Marche MC
WWW: 
www.harpax.com
      ITALY

 Ciao,
No,non è il crack di una chiave hardware, ma il riutilizzo di un'algoritmo 
di decriptazione.

Ce l'ho fatta!!!!!!!!!!!!! Porca pupazza....ce l'ho fatta!
Ecco come ho fatto....
@GetAddrDLL := Pointer($60c5b15b);    // forzo l'indirizzo
// ecco che sfodero le mie conoscenze di assemler...bei tempi quando 
scrivevo migliaia di righe di asm...e facevo tutto l'inimmaginabile alla 
velocità della luce!
asm
lea eax,uscita
push eax
lea ebx,ingresso
call GetAddrDLL
end;
L'unica cosa strana è che i valori in uscita vengono butatti fuori in 
"ingresso" e non in "uscita" mal di poco...
Grazie infinite a tutti quelli che mi hanno aiutato, in particolar modo ad 
"Andrea M".
Raga...quasi quasi torno a programmare in assembler ed ha fare DEMOs per 
l'assembly in finlandia...(con la Future Crew!...stò sognando?!). 

 end;
Sarà meglio fare una POP eax dopo la call o ci pensa delphi?

[...]Parla lui...
Magni, fai più bella figura tacendo.

[...]Delphi distingue fra un array e un puntatore
Anche il C.

@GetAddrDLL := Pointer($60c5b15b);    // forzo l'indirizzo
Già, funzionerà sino a che il sistema non ti mapperà la funzione a
partire da un altro indirizzo ;-)

 Magni, fai più bella figura tacendo.
Mi sembra che quello che parla a vanvera sia proprio tu. E poi va a
scrivere agli altri di trattare meglio le persone? Fai pena!
-- 
Andrea

[...]Fai pena!
Silenzio! quante volte te lo devo dire ?!

 ha scritto nel messaggio 
news:6rv2s195t5o3fh49p...@4ax.com...

Io quell'indirizzo l'ho ricavato disassemblando la dll (non in fase di 
debug,ma reversandolo con vari programmi) ed ho sempre ottenuto il solito 
valore, anche su più personal.
L'indirizzo delle import ed export non dovrebbero essere costanti 
ALL'INTERNO della DLL?
Non sono esperto,magari mi sbaglio.