Nell'articolo articolo79.htm abbiamo visto come
inglobare una dll all'interno di un eseguibile e lasciare che sia l'eseguibile
stesso ad estrarla ed a mapparla nel suo spazio di memoria senza prima salvarla
su disco. Ora aggiungiamo un'altra caratteristica: andiamo a criptare la dll e
quindi l'eseguibile dovrà eseguire la decriptazione prima di mappare il
contenuto della risorsa nel suo spazio di memoria. Per la criptazione facciamo
riferimento all'articolo articolo76.htm dove è
stata esposta una implementazione dell'algoritmo di Rijndael. Useremo il
programma in allegato all'articolo stesso per creare la versione criptata della
nostra dll (l'output è un file il cui nome è dato dal nome originale con la
stringa "crypted" attaccata in fondo). Vediamo di seguito come implementare il
sorgente del .exe di caricamento inserendo la procedura per il decrypting:
program Runner;
uses
Windows, Classes, SysUtils, BTMemoryModule, uUtilsCrypto;
{$R prog.res} //contiene la dll criptata
type
TMainProc = procedure(); stdcall;
var
pMemoryModule: PBTMemoryModule;
MainProc: TMainProc;
function LoadDllResourceEncrypted(resName: string): PBTMemoryModule;
var
rs: TResourceStream;
mem: TMemoryStream;
begin
try
rs := TResourceStream.Create(HInstance, resName, RT_RCDATA);
mem := TMemoryStream.Create;
//decripto la dll
RDLEncryptStreamCBC(rs, mem, False);
Result := BTMemoryLoadLibary(mem.Memory, mem.Size);
finally
rs.Free;
mem.Free;
end;
end;
begin
pMemoryModule := LoadDllResourceEncrypted('a01');
if pMemoryModule = nil then
Exit;
MainProc := TMainProc(BTMemoryGetProcAddress(pMemoryModule, 'MainProc'));
MainProc();
BTMemoryFreeLibrary(pMemoryModule);
end.
exe_convertito_dll_resource_encrypted.7z
|