Ładowanie libeay32.dll z zasobów.

0

Witam
Korzystam z biblioteki libeay32.pas, która to wymaga do startu pliku libeay32.dll .
Próbowałem dllke wrzucić w zasoby i wypakować przy starcie, ale niestety wyrzuca błąd iż nie umie znaleźć pliku :-(
Z tego co rozumiem to to co jest w uses leci przed tym co w OnCreate wiec dlatego to nie dziala ?
I jak inaczej to zrobić żebym mógł tą dllke wkompilować w projekt ?

Mój kod ;

libeay32_res RCDATA libeay32.dll
procedure TForm1.FormCreate(Sender: TObject);
var
   Res: TResourceStream;
begin
   Res := TResourceStream.Create(hInstance,'libeay32_res',RT_RCDATA);
   Res.SaveToFile(ExtractFilePath(application.Exename)+'libeay32.dll');
   Res.Free;
end;
0

No patrz wypisz wymaluj ten sam problem: Biblioteka SQLite bez dllki

Ale po co szukać jak można pospamować?

0

Res.SaveToFile(ExtractFilePath(application.Exename)+'libeay32.dll');

Ale wiesz co to jest UAC, i że od Visty w górę użytkownik (nawet admin) domyślnie nie ma prawa do zapisu w Program Files?

0

@TaczMajTralala: pokazujesz lenistwo i bezmyślnośc, że aż strach :/ Ech, przecież jak zauważył @babubabu taki wątek był chwilę temu. Po drugie, jak wspomniał @Azarien kwestia UAC i praw zapisu. Po trzecie wcale nie ładujesz nic tylko z zasobów, bo zapisujesz to tymczasowo na dysku.

Ok, zlitowałem się. I do tego posta masz dołaczony kod z exekiem i wszystkimi potrzebnymi plikami. Nie ma problemów z tym żeby załadować libeay32.dll z zasobów. Dllkę mam w trochę starszej wersji i plik nagłowkowy wygooglowany, być może też stary. Ale najważniejsza jest idea, że wszystko powinno bez problemów działać. Pod nowszymi od Delphi 7, mogą być problemy, ale to już sobie ogarnij sam. Jakby "bazę do kombinowania" ode mnie dostałeś. Teraz wykaż się samodzielnością.

0

Jejku ale zjebki :P widziałem post poniżej ale mi chodziło o coś prostego a nie przerabianie calego pliku libeay32.pas

@olesio : dzieki za pliczek, ale po dodaniu innych funkcji sypie mi "Access violation". Moze to dziala z odczytem wersji ale chyba przy czymś ambitniejszym to wysiada

moj kodzik :

 public
    DLL : TDLLLoader;
    SSLeay_version : function(t : integer) : PCharacter; cdecl;
    OpenSSL_add_all_algorithms :    procedure ;
....
procedure TForm1.FormCreate(Sender: TObject);
var
  Res : TResourceStream;
begin
  Application.Title := Caption;
  Res := TResourceStream.Create(hInstance, 'libeay32_res', RT_RCDATA);
  DLL := TDLLLoader.Create;
  DLL.Load(Res);
  SSLeay_version := DLL.FindExport('SSLeay_version');

OpenSSL_add_all_algorithms := DLL.FindExport('OpenSSL_add_all_algorithms');

//proba
OpenSSL_add_all_algorithms;

  Res.Free;

end;

Probowalem z innymi funkcjami i jest to samo :-(

1

Nie zjebki, tylko napisałem niczym Max Kolonko, czyli jak jest :P Ponieważ to, co teraz piszesz należało sprawdzić najpierw skoro widziałeś mój wątek i o tym wspomnieć, a nie w kolejnej odpowiedzi. Anyway, w domu to sprawdzę jutro po południu lub wieczorem. Fakt, że to co pokazujesz może być tylko procedurą, ale zdaje się mi że konwencja wywołania również musi zostać zachowana.

Chociaż coś jest nie tak z tym plikiem nagłówkowym, bo raz jest cdecl, a raz nie przy procedurach. A przerobienie kodu do użycia DllLoadera nie jest takie trudne, bo wystarczy wyciąć z pliku co najważniejsze i wspomóc się edytorem z zastępowaniem wspierającym wyrażenia regularne.

0

Bo akurat ta procedura jest zawarta w pliku libeay32.pas :

procedure OpenSSL_add_all_algorithms;
var
  hLibeayDLL: THandle;
  Add_all_algorithms_procedure: TOpenSSL_InitFunction;
begin
hLibeayDLL := GetModuleHandle(LIBEAY_DLL_NAME);
if hLibeayDLL = 0 then
  raise Exception.Create('libeay32.dll not loaded');
// Try to load new version
@Add_all_algorithms_procedure := GetProcAddress(hLibeayDLL, 'OPENSSL_add_all_algorithms_noconf');
// Fallback to old version
if @Add_all_algorithms_procedure = nil then
  @Add_all_algorithms_procedure := GetProcAddress(hLibeayDLL, 'OpenSSL_add_all_algorithms');
if @Add_all_algorithms_procedure <> nil then
  begin
  Add_all_algorithms_procedure;
  end
else
  raise Exception.Create('OpenSSL_add_all_algorithms procedure not defined in libeay32.dll');
end;

Ale probowalem tak :

// OpenSSL_add_all_algorithms;
  OpenSSL_add_all_ciphers;
  OpenSSL_add_all_digests;
ctx:=EVP_CIPHER_CTX_new();
 EVP_CIPHER_CTX_init(ctx);
EVP_BytesToKey.......

i błędu Access violation juz nie ma, ale jak dołoże te funkcje to juz jest :-(

 EVP_CipherInit_ex(....);
 EVP_CIPHER_CTX_set_key_length(...);
 EVP_CipherUpdate(....);
 EVP_CipherFinal_ex(.....); 

chyba ze do ich poprawnego odpalenia wymagana jest ta : OpenSSL_add_all_algorithms; ????????

0

Ech. Ja pod Androidem nie mogę wygodnie przejrzeć tak dużego pliku, z mnóstwem treści. A widzę, że Ty kompletnie nie znasz podstaw. Jakim cudem chciałeś ładować procedurę, która ładuje inne exporty i sama nie jest exportem procedury z dllki? Nic dziwnego, że miałeś błąd Acces Violation. W ogóle to najpierw powinieneś sprawdzać czy adres ładowanego exportu jest rózny od nil. A w kodzie tego co wkleiłeś nie widzę dynamicznego ładowania wspomnianych przez Ciebie metod. Także nie wiem skąd wniosek, że ma na to wpływ wklejony kod.

Musisz rozgraniczyć to, że jeśli chcesz mieć exporty zaladowane z dllki w zasobach, to należy sobie taki kod przygotować, by wszystko co potrzebne, a jest exportowane, zostało załadowane przez FindExport. I nie wiem na jakiej dllce operujesz, ponieważ ta której ja używam jest z 2006 roku, więc nie wiem czy posiada wszystkie funkcje i/lub procedury, które są w pliku nagłówkowym. Należało by sprobować pobrać nowszą dllkę i ją dodać przekompilowując zasoby i kod. Podsumowując, rozumiem że to dział dla początkujących, ale dalszą pomoc osobie, która wyczynia takie "cuda", jak ładowanie exportów czegoś, czego nie ma w dllce wyeksportowanego, uważam za bezcelową. Powinieneś najpierw poznać podstawy Obiektowego Pascala. Dopiero później brać się za rzeczy bardziej zaawansowane, jak korzystanie z dllek i to jeszce z zasobów.

0

Witam
Dobra już zauważyłem mój błąd :P Tylko nie wiem skąd znowu takie oburzenie, mam ograniczona wiedze którą chce poszerzyć o nowe zagadnienia, więc liczę na pomoc. Tym bardziej ze jest to dział Newbie w którym nie każdy siedzi całymi dniami w programowaniu , przez co pewnych kwestii od razu nie załapie. Bo wedle Twojej logiki musiałbym iść na studia lub skończyć kursy żeby mnie ktoś programowania nauczył i po paru latach tu wrócić i wtedy mam prawo pytać. Trochę cierpliwości bo aż tak z moją wiedzą źle nie jest ;-) Nigdy na dllkach nie operowałem więc dopiero poznaje te szlaki.

Teraz zrozumiałem że tą procedurkę też muszę zrobić pod dllloadera, czyli :

@Add_all_algorithms_procedure := GetProcAddress(hLibeayDLL, 'OPENSSL_add_all_algorithms_noconf');

zastapić :

@Add_all_algorithms_procedure  := DLL.FindExport('OPENSSL_add_all_algorithms_noconf');

Ale to już nawet nie chodzi o tą procedure bo praktycznie wszystkie inne które operują na zmiennej ctx też mi sypie błędami.
Dllke i plik nagłówkowy mam swój który to normalnie mi fungował ale z tym dllloaderem już nie.

TO jest to co mam dołożone u siebie (libeay32.pas) :

pEVP_CIPHER_CTX = Pointer;

.......

function EVP_BytesToKey(cipher: pointer; md: pEVP_MD; salt: PCharacter; data: PCharacter; datal: integer; count: integer; key: PCharacter; iv: PCharacter): integer; cdecl;
procedure EVP_CIPHER_CTX_init(ctx: pEVP_CIPHER_CTX); cdecl;
function EVP_CIPHER_CTX_new(): pEVP_CIPHER_CTX; cdecl;
procedure EVP_CIPHER_CTX_free(ctx: pEVP_CIPHER_CTX); cdecl;
function EVP_CipherInit_ex(ctx: pEVP_CIPHER_CTX; const _type: pEVP_CIPHER;  const engine: PChar; const key: PChar; const Iv: PChar; const encrypt: integer): Integer; cdecl;
function EVP_CipherUpdate(ctx: pEVP_CIPHER_CTX; _out: PChar;  var outl: Cardinal; const _in: Pchar; _inl: Cardinal): Integer; cdecl; 
function EVP_CipherFinal_ex(ctx: pEVP_CIPHER_CTX; _out: PChar; var _outl: Cardinal): Integer; cdecl;
function EVP_CIPHER_CTX_set_key_length(ctx: pEVP_CIPHER_CTX; keylen: Integer): Integer; cdecl;

I takie coś już nie funguje :

var
   ctx: pEVP_CIPHER_ctx;
......
EVP_CIPHER_CTX_set_key_length := DLL.FindExport('EVP_CIPHER_CTX_set_key_length');
EVP_CIPHER_CTX_new := DLL.FindExport('EVP_CIPHER_CTX_new');
EVP_BytesToKey := DLL.FindExport('EVP_BytesToKey');


ctx:=EVP_CIPHER_CTX_new();
EVP_BytesToKey(EVP_des_ebc(),EVP_md2(),nil,pchar(klucz),length(kucz),1,kluczxxx,ivxxx);
EVP_CIPHER_CTX_set_key_length(ctx, 64); //gdy usune ta linijke to dziala i błędu nie ma

Więc jeśli to możliwe to prosze o jakąś podpowiedź :-)

0

Dobra opanowałem to i obyło się to bez "wracania do podstaw" ;-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1