Verhindern das Laden von DLLs aus dem lokalen Verzeichnis

Für allgemeine Fragen zur Programmierung mit PureBasic.
romk
Beiträge: 7
Registriert: 17.11.2014 02:21

Verhindern das Laden von DLLs aus dem lokalen Verzeichnis

Beitrag von romk »

Ich vermute, dass meine Frage recht speziell ist, da ich nahezu keine Infos dazu finden konnte.


Soweit ich das verstanden habe, werden DLLs ganz am Anfang des kompilierten Codes importiert, dabei wird zuerst das lokale Verzeichnis und dann die Verzeichnisse aus den Umgebungsvariablen durchsucht. Mein Programm allerdings darf das lokale Verzeichnis nicht durchsuchen, weil sich dort eine DLL mit demselben Namen aber einer anderen Funktion befindet (welche von einem anderen Programm verwendet wird, das sich auch im selben Verzeichnis befindet).

Die DLL, um die es geht, ist die wsock32.dll. Alles funktionier bestens, solange die "falsche" DLL nicht im selben Ordner wie mein Programm ist. Ist sie es doch, kommt sofort nach der Ausführung folgende kritische Fehlermeldung, bevor das Programm irgendwas tut:
Der Prozedureinsprungpunkt "select" wurde in der DLL "WSOCK32.DLL" nicht gefunden.
Es wäre sehr praktisch wenn es hierfür Startparameter für den Compiler/Linker, entsprechenden PB-Code, oder ein sonstiges Workaround gäbe.

Vielen Dank im Voraus!
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Verhindern das Laden von DLLs aus dem lokalen Verzeichni

Beitrag von STARGÅTE »

DLLs werden ja gerade nicht in die eigene Exe importiert, sondern liegen als gemeinsam benutzbare Ressource im Speicher. Erst beim Start der Exe werden die DLL-Funktionen verlinkt.

In Pure Basic kannst/musst du aber eh bei OpenLibrary() den Pfad angeben, somit solltest du eh die richtige Version der DLL mit in deinen Ordner legen, ggf. umbenennen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
romk
Beiträge: 7
Registriert: 17.11.2014 02:21

Re: Verhindern das Laden von DLLs aus dem lokalen Verzeichni

Beitrag von romk »

Ich habe es schon mit

Code: Alles auswählen

OpenLibrary(#PB_Any, "C:\windows\system32\wsock32.dll")
versucht, hatte keinen Erfolg. Der Punkt ist, dass er die richtige DLL immer selbst im C:\Windows\system32\ Verzeichnis findet, außer es ist eine bereits im lokalen Pfad mit dem Namen der gesuchten, in meinem Fall der falschen.
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Verhindern das Laden von DLLs aus dem lokalen Verzeichni

Beitrag von _JON_ »

Der Fehler kommt weil dein Program die wsock32.dll in der IAT der exe hat.

Du müsstest komplett auf Openlibrary und Prototyps umsteigen.
Und keine einzige von PB unterstützten wsock32 API aufrufen.

Das wird aber ein Problem da InitNetwork() und co. hier auch weg fällt.
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
romk
Beiträge: 7
Registriert: 17.11.2014 02:21

Re: Verhindern das Laden von DLLs aus dem lokalen Verzeichni

Beitrag von romk »

Gibt es denn keine Möglichkeit, den Eintrag in der IAT zu ändern?

So problematisch ist das Umsteigen auf Prototypen nicht, da ich einen überschaubar langen Code im Programm habe. Gibt es da Empfehlungen mit guten Tutorials zu den Libs?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Verhindern das Laden von DLLs aus dem lokalen Verzeichni

Beitrag von ts-soft »

Benutze die API LoadLibrary() oder LoadLibraryEx(). Lies Dir die Beschreibung dazu durch, speziell:
SetSearchPathMode().
Den Rest wirste dann schon finden :wink:

LoadLibrary
LoadLibraryEx

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Verhindern das Laden von DLLs aus dem lokalen Verzeichni

Beitrag von _JON_ »

Die wsock32.dll ist doch eine Standardbibliothek, wie kommst das da eine verkrüppelte Version im gleichen Verzeichnis wie deine Anwendung rumliegt. :?
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
romk
Beiträge: 7
Registriert: 17.11.2014 02:21

Re: Verhindern das Laden von DLLs aus dem lokalen Verzeichni

Beitrag von romk »

Ich habe sowie

Code: Alles auswählen

LoadLibrary_("C:\windows\system32\wSock32.dll")
als auch

Code: Alles auswählen

LoadLibraryEx_("wsock32.dll", #Null, #LOAD_LIBRARY_SEARCH_SYSTEM32)
und

Code: Alles auswählen

LoadLibraryEx_("C:\windows\system32\wSock32.dll", #Null, #LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR)
versucht, ohne Erfolg.

~~~~~~~~~~~~~~~~~~~~

Die Funktion SetSearchPathMode würde eventuell abhelfen, danke für den Tipp, ts-soft, aber leider erkennt PureBasic sie beim Kompilieren nicht.

Code: Alles auswählen

SetSearchPathMode_(#WHATEVS)
(Kritischer Fehler) Zeile 1: SetSearchPathMode_() ist keine Funktion, Array, Makro oder LinkedList.

~~~~~~~~~~~~~~~~~~~~
@_JON_
Die andere Anwendung ist veraltet und benutzt nur IPX. Ich habe keinen Sourcecode von der exe, welche selbst nach der wsock32.dll sucht. Die, wie du so schön sagst, verkrüppelte DLL gaukelt der veralteten Anwendung IPX/SPX-Verbindungen vor, während sie in Wirklichkeit TCP/IP für sie wrappt.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Verhindern das Laden von DLLs aus dem lokalen Verzeichni

Beitrag von ts-soft »

Code: Alles auswählen

EnableExplicit

#BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE  = $00001
#BASE_SEARCH_PATH_DISABLE_SAFE_SEARCHMODE = $10000
#BASE_SEARCH_PATH_PERMANENT               = $08000

Prototype SetSearchPathMode(flag.l)

Define DLL = OpenLibrary(#PB_Any, "Kernel32.dll")
If DLL
  Define SetSearchPathMode.SetSearchPathMode = GetFunction(DLL, "SetSearchPathMode")
  If SetSearchPathMode <> 0
    SetSearchPathMode(#BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE)
  EndIf
EndIf

PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
romk
Beiträge: 7
Registriert: 17.11.2014 02:21

Re: Verhindern das Laden von DLLs aus dem lokalen Verzeichni

Beitrag von romk »

Danke für die Tipps, ts-soft, habe ich genau so gemacht, zeigt aber keine Auswirkungen. Habe auch schon alle Kombinationen mit den Flags von SetSearchPathMode ausprobiert.

Das seltsame ist auch, dass der Fehler
PureBasic hat geschrieben:Der Prozedureinsprungpunkt "select" wurde in der DLL "WSOCK32.DLL" nicht gefunden.
mit der "falschen" wsock32.dll im selben Verzeichnis nur dann kommt, wenn z.B. sowas wie InitNetwork() oder ReceiveHTTPFile() im Code vorkommt. Wie schon erwähnt wird sämtlicher Code ignoriert und der Fehler kommt sofort beim Ausführen der exe.

Dabei kann ich

Code: Alles auswählen

OpenLibrary(#PB_Any,"C:\windows\system32\wSock32.dll")
oben hinschreiben, oder auch weglassen, das Verhalten ist das gleiche.
Antworten