Ł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" ;-)

0

Nie trzeba kończyć studiów. Aby poznać podstawy Delphi. Nic takiego nie napisałem. Po prostu trzeba logicznie pomyśleć. I nie wiem dlaczego masz błąd. Poniższy kod działa ok i pokazuje również po sprawdzeniu wersji odpowiedni komunikaty EVP_BytesToKey found. A także pokazuje Caption formatki "wzbogacony" o cyfry od 1 do 6. Także wszystko działa. Nie wiem jakim plikiem nagłowkowym w Delphi dysponujesz, bo na sieci znajduje różne starsze wersje. Może źle szukam. Niemniej jednak nawet dllka w wersji jaką dodałem z 2006 roku, posiada te funkcje exportowane. I ich załadowanie nie sprawia problemów. Czy całość będzie działać ok, tego nie wiem, ale sądze, że powinna. I na koniec radzę używac takiego darmowego oraz prostego komponentu, który każdy powinien posiadać. Zwie się TBrain. I najpierw na prawdę ogarnąć podstawy. Dział Newbie czy nie. Po prostu porwałeś się niestety na coś, co początkowo Cie przerosło. A samodzielnie nie chciało się Tobie spróbować znaleźć rozwiązania. No coż, najważnejsze, że problem został rozwiązany :)

P.S.: i do szybkiej zmiany deklaracji z pliku nagłówkowego w Delphi do postaci deklaracji dla ładowania dllki z zasobów, wystarczy jak wspominałem edytor z opcją zamieniania, wspierającą wyrażenia regularne. Po prostu wyszukujesz: (.+?) (.+?)\((.+?) i zamieniasz na $2 : $1($3. I ot cała "filozofia". Podobnie można kombinować z wyłuskaniem samych nazw procedur i funkcji i podstawienia ich pod DLL.FindExport('Nazwa');. Bo przecież nikt nie zabrania Tobie ułatwiania sobie pracy :)

unit a_code_main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  dllloader, libeay32;

type
  PEVP_CIPHER_CTX = Pointer;

type
  TMainForm = class(TForm)
    procedure FormCreate(Sender : TObject);
  private
  public
    DLL : TDLLLoader;
    SSLeay_version : function(t : integer) : PCharacter; cdecl;
    EVP_BytesToKey : function(cipher : pointer; md : pEVP_MD; salt : PCharacter; data : PCharacter; datal : integer; count : integer; key : PCharacter; iv : PCharacter) : integer; cdecl;
    EVP_CIPHER_CTX_init : procedure(ctx : pEVP_CIPHER_CTX); cdecl;
    EVP_CIPHER_CTX_new : function() : pEVP_CIPHER_CTX; cdecl;
    EVP_CIPHER_CTX_free : procedure(ctx : pEVP_CIPHER_CTX); cdecl;
    EVP_CipherInit_ex : function(ctx : pEVP_CIPHER_CTX; const _type : pEVP_CIPHER; const engine : PChar; const key : PChar; const Iv : PChar; const encrypt : integer) : Integer; cdecl;
    EVP_CipherUpdate : function(ctx : pEVP_CIPHER_CTX; _out : PChar; var outl : Cardinal; const _in : Pchar; _inl : Cardinal) : Integer; cdecl;
    EVP_CipherFinal_ex : function(ctx : pEVP_CIPHER_CTX; _out : PChar; var _outl : Cardinal) : Integer; cdecl;
    EVP_CIPHER_CTX_set_key_length : function(ctx : pEVP_CIPHER_CTX; keylen : Integer) : Integer; cdecl;
  end;

var
  MainForm : TMainForm;

implementation

{$R *.dfm}

{$R data.res}

procedure TMainForm.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');
  Res.Free;
  if @SSLeay_version <> nil then
  begin
    MessageBox(Application.Handle, PChar(SSLeay_version(0)),
      PChar(Application.Title), MB_ICONINFORMATION + MB_OK);
  end;
  EVP_BytesToKey := DLL.FindExport('EVP_BytesToKey');
  if @EVP_BytesToKey <> nil then
  begin
    ShowMessage('EVP_BytesToKey found.');
  end;
  EVP_CIPHER_CTX_init := DLL.FindExport('EVP_CIPHER_CTX_init');
  if @EVP_CIPHER_CTX_init <> nil then
  begin
  end;
  EVP_CIPHER_CTX_new := DLL.FindExport('EVP_CIPHER_CTX_new');
  if @EVP_CIPHER_CTX_new <> nil then
  begin
    Caption := Caption + ' 1';
  end;
  EVP_CIPHER_CTX_free := DLL.FindExport('EVP_CIPHER_CTX_free');
  if @EVP_CIPHER_CTX_free <> nil then
  begin
    Caption := Caption + ' 2';
  end;
  EVP_CipherInit_ex := DLL.FindExport('EVP_CipherInit_ex');
  if @EVP_CipherInit_ex <> nil then
  begin
    Caption := Caption + ' 3';
  end;
  EVP_CipherUpdate := DLL.FindExport('EVP_CipherUpdate');
  if @EVP_CipherUpdate <> nil then
  begin
    Caption := Caption + ' 4';
  end;
  EVP_CipherFinal_ex := DLL.FindExport('EVP_CipherFinal_ex');
  if @EVP_CipherFinal_ex <> nil then
  begin
    Caption := Caption + ' 5';
  end;
  EVP_CIPHER_CTX_set_key_length := DLL.FindExport('EVP_CIPHER_CTX_set_key_length');
  if @EVP_CIPHER_CTX_set_key_length <> nil then
  begin
    Caption := Caption + ' 6';
  end;
end;

end.

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