Seite 1 von 3
Verhindern das Laden von DLLs aus dem lokalen Verzeichnis
Verfasst: 17.11.2014 02:29
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!
Re: Verhindern das Laden von DLLs aus dem lokalen Verzeichni
Verfasst: 17.11.2014 09:18
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.
Re: Verhindern das Laden von DLLs aus dem lokalen Verzeichni
Verfasst: 17.11.2014 15:27
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.
Re: Verhindern das Laden von DLLs aus dem lokalen Verzeichni
Verfasst: 17.11.2014 16:17
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.
Re: Verhindern das Laden von DLLs aus dem lokalen Verzeichni
Verfasst: 17.11.2014 16:36
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?
Re: Verhindern das Laden von DLLs aus dem lokalen Verzeichni
Verfasst: 17.11.2014 16:40
von ts-soft
Benutze die API LoadLibrary() oder LoadLibraryEx(). Lies Dir die Beschreibung dazu durch, speziell:
SetSearchPathMode().
Den Rest wirste dann schon finden
LoadLibrary
LoadLibraryEx
Gruß
Thomas
Re: Verhindern das Laden von DLLs aus dem lokalen Verzeichni
Verfasst: 17.11.2014 18:25
von _JON_
Die wsock32.dll ist doch eine Standardbibliothek, wie kommst das da eine verkrüppelte Version im gleichen Verzeichnis wie deine Anwendung rumliegt.

Re: Verhindern das Laden von DLLs aus dem lokalen Verzeichni
Verfasst: 17.11.2014 18:29
von romk
Ich habe sowie
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.
(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.
Re: Verhindern das Laden von DLLs aus dem lokalen Verzeichni
Verfasst: 17.11.2014 19:01
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
Re: Verhindern das Laden von DLLs aus dem lokalen Verzeichni
Verfasst: 17.11.2014 19:19
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.