AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon
Thema durchsuchen
Ansicht
Themen-Optionen

GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

Ein Thema von Bbommel · begonnen am 26. Nov 2020 · letzter Beitrag vom 27. Nov 2020
Antwort Antwort
Seite 1 von 2  1 2      
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
659 Beiträge
 
Delphi 12 Athens
 
#1

GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 26. Nov 2020, 19:03
Hi zusammen,

ich komme nicht mehr weiter und brauche mal Tipps von euch. Direkt vorweg: "ja, du musst ja auch die 64-Bit-DLL nehmen, wenn du für 64-Bit kompilierst!" werden vielleicht einige direkt zurecht antworten wollen. Ja, habe ich. Ganz so einfach ist es leider nicht. Geht noch nicht mal um meinen eigenen Code, sondern um eine Bibliothek, die ich nutzen möchte. Aber der Reihe nach:

Wenn man sich mit "modernen" Anmeldeverfahren im Netz rumschlägt, dann stolpert man irgendwann über OAuth2 und die "Access Token" und "Identity Token", die man da so bekommt. Meistens liegen diese Token in Form eines "JSON Web Tokens" vor, welche diverse Informationen über die Anmeldung enthalten und schließlich auch mit einem Zertifikat signiert sind, mit dem man die Echtheit prüfen kann und soll. Damit man nicht bei Null anfangen muss, wenn man so ein Token auswerten und prüfen will, haben andere zum Glück schon vorgearbeitet, in dem Fall gibt es u.a. die Delphi JOSE and JWT Library von Paolo Rossi. Hier ist vor allem auch die ganze Zertifikatsprüfung mit eingebaut und die basiert zum Teil wiederum auf OpenSSL.

Und hier kommt es nun zu meinem Problem. Folgender Code aus der Unit JOSE.Signing.RSA von Paolo:

Delphi-Quellcode:
unit JOSE.Signing.RSA;

interface

uses
  [...]IdSSLOpenSSLHeaders,
  [...]

class procedure TRSA.LoadOpenSSL;
begin
  if not IdSSLOpenSSLHeaders.Load then
    raise Exception.Create('[RSA] Unable to load OpenSSL libraries');

  if @EVP_DigestVerifyInit = nil then
    raise Exception.Create('[RSA] Please, use OpenSSL 1.0.0. or newer!');

  if GetCryptLibHandle <> 0 then
  begin
    // *** Die folgende Zeile macht nicht, was sie soll! ***
    _PEM_read_bio_RSA_PUBKEY := GetProcAddress(GetCryptLibHandle, 'PEM_read_bio_RSA_PUBKEY');
    if @_PEM_read_bio_RSA_PUBKEY = nil then
      raise Exception.Create('[RSA] Unable to get proc address for "PEM_read_bio_RSA_PUBKEY"');

    [...]
  end;
end;
Hier soll also GetProcAddress(GetCryptLibHandle, 'PEM_read_bio_RSA_PUBKEY') in der libeay32.dll die Funktion PEM_read_bio_RSA_PUBKEY finden. Die Funktion GetCryptoLibHandle kommt aus der Indy-Unit IdSSLOpenSSLHeaders und liefert das Handle auf die libeay32.dll. Unter Win32 funktioniert das auch alles ganz wunderbar. Unter Win64 bekomme ich immer ein NIL von der Funktion.

Mit einem "DLL Export Viewer" habe ich gesehen, dass die gesuchte Funktion in der DLL auch tatsächlich existiert. Mit dem ProcessMonitor habe ich geprüft, dass auch tatsächlich die richtige, 64 bittige Version von libeay32.dll geladen wird. Wird sie ohnehin schon vorher, weil das ganze in einer Web Broker-Anwendung läuft, die auch auf OpenSSL zugreift. Da kann man beim Debuggen dann auch sehen, dass die ganzen Funktionen auch unter Win64 in der dll problemlos gefunden werden, wenn man sich die Funktion "Load" in der IdSSLOpenSSLHeaders anguckt und da einen Breakpoint setzt. Nur oben klappt es nicht.

Ich hab auch schon mal
@_PEM_read_bio_RSA_PUBKEY := GetProcAddress(GetCryptLibHandle, PChar('PEM_read_bio_RSA_PUBKEY'));
probiert, aber das brachte keinen Unterschied.

Hat irgendwer irgendeine Idee?

(Zur Info: hab das auch in einem Issue auf Github gepostet, weil dort schon jemand ein ähnliches Problem mit Mac32/Mac64 hatte)
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#2

AW: GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 26. Nov 2020, 19:25
Zitat:
Ich hab auch schon mal
@_PEM_read_bio_RSA_PUBKEY := GetProcAddress(GetCryptLibHandle, PChar('PEM_read_bio_RSA_PUBKEY'));
definition in 64Bit..

Delphi-Quellcode:
function GetProcAddress(hModule: HMODULE; lpProcName: LPCSTR): FARPROC; external kernel32 name 'GetProcAddress';
function GetProcAddress(hModule: HMODULE; lpProcName: LPCWSTR): FARPROC;
begin
  if ULONG_PTR(lpProcName) shr 16 = 0 then // IS_INTRESOURCE
    Result := GetProcAddress(hModule, LPCSTR(lpProcName))
  else
    Result := GetProcAddress(hModule, LPCSTR(TMarshal.AsAnsi(lpProcName)));
end;
Aber keine Ahnung ob dir das hilft.

Habe da einiges recherchiert.
HModule <> THandle
Int <> IntPtr wenn die DLL geladen wird.

Viele haben damit ein Problem.
Bei Google suchen GetProcAddress 64bit

Geändert von venice2 (27. Nov 2020 um 11:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 26. Nov 2020, 20:35
Und natürlich kann man auch mal schauen, ob es auch einen Export mit diesem Namen in der 64-Bit-DLL gibt.
https://www.nirsoft.net/utils/dll_export_viewer.html
$2B or not $2B
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#4

AW: GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 26. Nov 2020, 20:48
Und natürlich kann man auch mal schauen, ob es auch einen Export mit diesem Namen in der 64-Bit-DLL gibt.
https://www.nirsoft.net/utils/dll_export_viewer.html
Zitat:
Mit einem "DLL Export Viewer" habe ich gesehen, dass die gesuchte Funktion in der DLL auch tatsächlich existiert.
Hat er ja schon.

Aber ich finde den Key definitiv nicht!
Zumindest nicht in der DLL die ich auf dem System habe.

Geändert von venice2 ( 1. Dez 2020 um 16:05 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 26. Nov 2020, 20:57
Habe da einiges recherchiert.
HModule <> THandle
Ganz sicher?

Windows SDK:
Code:
typedef PVOID HANDLE;
typedef HANDLE HINSTANCE;
typedef HINSTANCE HMODULE;
Die Delphi RTL ebenso:
Delphi-Quellcode:
  THandle = NativeUInt;
  HINST = THandle; { HINSTANCE from widnef.h }
  HMODULE = HINST; { from windef.h }
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#6

AW: GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 26. Nov 2020, 21:02
Habe da einiges recherchiert.
HModule <> THandle
Ganz sicher?

Windows SDK:
Code:
typedef PVOID HANDLE;
typedef HANDLE HINSTANCE;
typedef HINSTANCE HMODULE;
Die Delphi RTL ebenso:
Delphi-Quellcode:
  THandle = NativeUInt;
  HINST = THandle; { HINSTANCE from widnef.h }
  HMODULE = HINST; { from windef.h }
Es geht hier um 64Bit und 32Bit.
Nein aber so wie ich gelesen (Recherchiert) habe ist Cardinal 64Bit und THandle 32 oder?
http://codeverge.com/embarcadero.del...hi-get/1071384

Geändert von venice2 (26. Nov 2020 um 21:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 26. Nov 2020, 21:03
Aber ich finde den Key definitiv nicht!
Ich seh ihn auf dem Bild auch nicht.
$2B or not $2B
  Mit Zitat antworten Zitat
venice2
(Gast)

n/a Beiträge
 
#8

AW: GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 26. Nov 2020, 21:18
Aber ich finde den Key definitiv nicht!
Ich seh ihn auf dem Bild auch nicht.
Hmmm. nur den hier! PEM_read_bio_RSAPUBKEY instead of PEM_read_bio_RSA_PUBKEY
Keine Ahnung wie viele DLL's es davon gibt.

Geändert von venice2 ( 1. Dez 2020 um 16:05 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 26. Nov 2020, 21:44
Es geht hier um 64Bit und 32Bit.
Nein aber so wie ich gelesen (Recherchiert) habe ist Cardinal 64Bit und THandle 32 oder?
Am besten direkt an die Doku halten, da ist das klar definiert:
http://docwiki.embarcadero.com/Libra...ystem.Cardinal
Zitat:
The size of Cardinal is 32 bits across all 64-bit and 32-bit platforms.
http://docwiki.embarcadero.com/Libra...tem.NativeUInt
Zitat:
The size of NativeUInt is equivalent to the size of the pointer on the current platform.
Auch wenn ich nicht weiß was "Cardinal" damit jetzt zu tun hat. HMODULE = HINST = THandle , egal wieviel Bit.
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
659 Beiträge
 
Delphi 12 Athens
 
#10

AW: GetProcAddress liefert kein Ergebnis unter Win64, unter Win32 schon

  Alt 26. Nov 2020, 21:51
Hallo zusammen,

Danke für euer erstes Feedback.

dass ich das schon geprüft habe, dass die Funktion auch wirklich vorhanden ist, hatte ich ja schon im Eingangspost geschrieben. Die Funktion ist in der DLL vorhanden (und auch in älteren Versionen der DLL). Also, wenn ich die OpenSSL-Doku richtig verstanden habe, müsste das zumindest in der Version 1.0.2 dabei sein.

Auszug aus dem DLL Export Viewer als Bildchen im Anhang.

Vielleicht gibt es ja tatsächlich irgendwelche Eigenarten bzgl. HModule <> THandle oder irgendwelcher anderer Typen bei der Funktion unter Win64. Ich versuche morgen mal mit frischem Kopf ein Demo-Projekt zu basteln.
Miniaturansicht angehängter Grafiken
dp2020_2.jpg  
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz