Nell'articolo articolo78.htm abbiamo visto come
caricare la dll direttamente da un buffer in memoria; questo può essere il punto
di partenza per svariate implementazioni. In pratica una volta creato il nostro
programma, lo convertiamo in dll come descritto nell'articolo
articolo77.htm e ci creiamo un eseguibile semplice
semplice che carica la nostra dll nel suo spazio di memoria: in questo modo
otteniamo un applicativo che ha lo stesso comportamento del nostro eseguibile
originale; la dll può essere prelevata ad esempio dal web (si specifica un url e
si esegue il download proprio come nel caso del .exe nell'articolo
articolo75.htm) e caricata da un buffer in memoria
senza doverla prima salvare su disco (come descritto nell'articolo
articolo78.htm). La dll può anche essere integrata
come risorsa all'interno del .exe che fa da loader: la procedura è semplicissima
ed è già stata descritta nell'articolo articolo8.htm
dove appunto viene spiegato come inglobare un file all'interno di un eseguibile.
Di seguito il risultato dell'immagazzinamento della dll nel .exe visto con
Resource Hacker

Come si può vedere abbiamo creato una risorsa di nome A01 e ci abbiamo messo
dentro al dll. Quello che resta da fare è modificare il .exe addetto al
caricamento specificando il codice per estrarre la dll dalla risorsa e mapparla
nel proprio spazio di memoria:
program Runner;
uses
Windows, Classes, SysUtils, BTMemoryModule;
{$R prog.res} //contiene la dll
type
TMainProc = procedure(); stdcall;
var
pMemoryModule: PBTMemoryModule;
MainProc: TMainProc;
function LoadDllResource(resName: string): PBTMemoryModule;
var
rs: TResourceStream;
begin
try
rs := TResourceStream.Create(HInstance, resName, RT_RCDATA);
Result := BTMemoryLoadLibary(rs.Memory, rs.Size);
finally
rs.Free;
end;
end;
begin
pMemoryModule := LoadDllResource('a01');
if pMemoryModule = nil then
Exit;
MainProc := TMainProc(BTMemoryGetProcAddress(pMemoryModule, 'MainProc'));
MainProc();
BTMemoryFreeLibrary(pMemoryModule);
end.
exe_convertito_dll_resource.7z
|