Kernel32 ändern (RestoreLastError)

Hallo erstmal, mein 1. Beitrag :D
Ich hab auch gleich ein Problem:
Ich habe ein Spiel, dass die Function "RestoreLastError" in der Kernel32 aufrufen will. Leider Existiert diese Funktion nicht in der Windows 2000 DLL, aber ie Funtkion "SetLastError", die exact das gleiche tut.
Scheinbar will microsoft die Allgemeinheit dazu zwingen auf XP umzusteigen X(
Da die Exe Datei scheinbar kopiergeschützt (oder warum auch immer) kann ich den Funktionsnamen nicht ändern. (Jeder Hex-Editor, bis auf Hex-Editor ME, kann den Datensatz nicht finden, und der ME zeigt irgendwie nur 4 byte O.o)

Also hab ich mir gedacht, entweder mit einem DLL editor:
Die Funktion einfach umbennenen,
oder besser:
Die Funktion kopieren und in RestoreLastError umbennenen.

Aber wie mach ich das?
Hab es schon mit dem http://www.dependencywalker.com/ versucht. Der Zeigt aber nur Funktionen an und exportiert in Textdateien, kann aber nichts ändern oder importieren...
Hat jemand einen guten editor oder andere Tips parat, bin mit meinem Latein am Ende...
Danke schonmal,
MfG
Extinction
 
schonmal daran gedacht, dass es für das Spiel evtl. einen Patch gibt?
um welches handelt es sich denn?

Im übrigen könnte dir die Windows File Protection probleme machen wenn du in den System Datein rumpfuschst.
 
Original von Sven
Im übrigen könnte dir die Windows File Protection probleme machen wenn du in den System Datein rumpfuschst.
Nicht unbedingt.
Wenn er seine fertig modifizierte DLL ins Spieleverzeichnis kopiert, hat sie eine höhere Priorität als die in System32 und wird vom Program geladen ohne dass er die alte ersetzen müsste.
 
Wenn er seine fertig modifizierte DLL ins Spieleverzeichnis kopiert,
das wird nicht gehen, weil kernel32.dll schon von irgendeinem anderen Programm vorher geladen wurde und diese Kopie dann von Windows-PE-Loader genommen und in den Virtuellen Speicherbereich des Spiels eingeblendet wird (ok, bei Systemdlls bin ich mir nicht mehr so sicher, ob der PE-Loader nicht eine "extrabehandlung" für diese parat hat - allerdings ändert es nicht viel am Gesamtverhalten: systemdlls kann man nicht so einfach laden lassen. Zudem ein kernel32.dll Import afaik eine "Pflicht" für Programme unter win2k ist).
Was man allerdings recht simpel machen könnte: eine Kopie der kernel32.dll erstellen (z.B als yernel32.dll benennen) und diese Kopie modifizieren - LordPE ->"PE-Editor->Directories->Export Table->anzeigen lassen und Edit wählen.
Ich denke das wäre das einfachste - denn einen Export hinzuzufügen wäre nicht unbediengt einfacher (zudem das Spiel sowieso nichts mit der XP Funktion anfangen kann). Im Spielexe müsste nur noch statt "kernel32.dll" ein "yernel" geschrieben werden - mit etwas Glück hat der Kopierschutz nichts dagegen und importiert Kernel32.DLL Funktionen nicht noch durch einen extra Aufruf.

Als Alternativmaßnahme würde mir noch eine art Filterpatch für GetProcessAddress einfallen, was aber nicht ganz trivial wäre (API hooking) ;). Oder man für mit IID King (google) noch einen Import einer eigenen DLL dazu - und in der DLL patcht man die Exports der Kernel32.dll im virtuellen Speicher des Spiels um. Sollte ein Kopierschutz etwas dagegen haben, bleibt noch die Möglichkeit, das Ganze per Loader erledigen zu lassen.

PS: es kann auch sein, dass eine der zahlreichen "Nebendlls" diesen fehlenden import hat - so dass manipulationen an der Hauptexe nicht viel bringen würden.
 
Ich glaube es währe einfacher den Eintrag in die Kernel32 zu schleusen als die Exe zu ändern. Da geht garnix, sowas ist mir noch nicht untergekommen. Scheinbar können die Hex-Editoren (hab auch den PE Editor probiert) die Datei nicht richtig laden, denn wenn ich sie ohne Änderungen speichere kann sie nicht mehr gestartet werden.
(bei Doppelklick passiert garnichts mehr, Großteils verschwindet auch das Icon und wird durch dieses standart exe Bild ersetzt, nur der PE-Editor übernimmt das Icon...)

Ich hab es aber nicht geschafft, den Namen der Funktion in der Kernel32 zu ändern.
Beim PE-explorer kann ich ihn zwar anzeigen, in den Editor wechseln etc., aber der Name lässt sich nicht ändern.
Würde sich das mit dem "IID King" machen lassen? Mit etwas Glück übersieht die Windows File Protection das. Dann währe die möglichkeit, dass die Funktion über eine andere Datei aufgerufen wird, auch nicht vorhanden...
Oder überprüft Windows die größe der Systemdateien bytegenau?
 
Oder überprüft Windows die größe der Systemdateien bytegenau?
ich glaube, es gibt sogar einen CRC Check. Allerdings sollte bei win2k die Fileprotection nicht so nervig sein - trotzdem wird man ihmo nicht ohne ein externes Bootmedium auskommen. Am besten ersetzt man dann auch die DLL in dem Ordner, aus dem die FileProtection diese nimmt (ich denke, das ist der dllcache ordner oder i386 im Driver Cache Unterordner).
IID kann afaik keine Exports hinzufügen - zumindest die alte Version (die neue habe ich noch nicht begutachtet).
Auf jedenfall müsstest Du nicht einfach SetLastError ersetzten sondern wirklich einen zusätzlichen Export hinzufügen(sonst läuft das System wohl icht mehr) - mir ist auch kein DLL Editor bekannt, der es kann (eventuell findet sich nach einer Suche was).
 
Sooo, Ich wollte dieses alte Thema nochmal ausgraben, nur zu Infozwecken. :)
Ich hab mal ein wenig rumgesucht und irgendwann einen Crack gefunden, der die Funktion nicht benutzt, läuft nun einwandfrei.

Eins interessiert mich aber noch: Hätte man nicht auch die Funktion in der DLL hexen können? DLL sind ja nicht so kompliziert gestrickt wie exe-Dateien, oder?
 
Original von Extinction
Sooo, Ich wollte dieses alte Thema nochmal ausgraben, nur zu Infozwecken. :)
Ich hab mal ein wenig rumgesucht und irgendwann einen Crack gefunden, der die Funktion nicht benutzt, läuft nun einwandfrei.

Eins interessiert mich aber noch: Hätte man nicht auch die Funktion in der DLL hexen können? DLL sind ja nicht so kompliziert gestrickt wie exe-Dateien, oder?

Nun also DLLs sind genauso "kompliziert" wie Exe-Dateien da beide das selbe Format besitzen(Portable Executable). Um die Funktion darein zu bekommen müsste man, wie CDW schon sagte einen Eintrag in der Export-Tabelle hinzufügen und die restlichen Header anpassen. Mit etwas Pech ist dann hinter der Export-Tabelle nicht genug Platz frei, wodurch man dann wahrscheinlich eine neue Section anlegen müsste, die Tabelle kopieren und den eigenen Eintrag anhängen müsste. Das größere Problem ist wie schon gesagt die Fileprotection des OS.
Leider ist mir nicht so ganz klar was du mit "die Funktion in der DLL hexen können" meinst. Theoretisch könnte man auch die ganzen Änderungen mit einem Hexeditor vornehmen(meinst du das mit "hexen") wobei das ziemlich umständlich und fehleranfällig ist und man sich doch lieber ein Programm schreiben sollte, was dies für einen erledigt, wenn man nichts findet.
 
Zurück
Oben