WinAPI-Funktion in ollydbg aufrufen

05/07/2009 23:33 ms​#1
Hi,
ich versuche schon seit einiger Zeit eine Dll mit ollydbg so umzuändern, dass sie in einer bestimmten Stelle die WinAPI-Funktion Sleep aufruft.
Bei einer Exe wäre das ja nicht so schwer. Da hätte ich einfach die Adresse aus den Imports ausgelesen, weil die ja für gewöhnlich immer in die virtuelle Adresse 0x00400000 geladen werden. Bei der Dll ist nun das Problem, dass die mal hierhin und mal dorthin geladen wird, sodass die Imports dementsprechend auch keine feste Adresse besitzen.
Ich habe das bis jetzt so gelöst, dass ich ein kleines Codecave geschrieben habe. Das Programm habe ich dann das Codecave callen lassen. Im Codecave wird die Return-Value mit einer bestimmten Zahl subtrahiert, sodass ich dann das Offset von dem gewünschten Import habe. Dann wird nur noch der Parameter gepusht und die WinAPI-Funktion gecallt.
Am Ende hat das ganze sogar geklappt. Aber da das ziemlich aufwendig ist, wollte ich fragen, wie noch ich das gewünschte Ergebnis erzielen kann. Ich habe mir überlegt, dass man ja dieses "Relocation Table" um einen Eintrag erweitern kann damit der WinAPI-Call immer auf den Imports-Eintrag zeigt. Jedoch habe ich kein Tool gefunden, dass das kann und mit dem Hex-Editor will das auch nicht so recht klappen.
05/08/2009 00:30 RDTSC#2
Ich verstehe nicht so ganz, was du mit den Imports und auch überhaupt machen möchtest.
Hast du ein Programm geschrieben, das eine Dll lädt und diese dann patchen soll?

Die RVA des Codes, den überschreiben möchtest, hast du,
also wäre dein Problem die ImageBase der Dll, habe ich das so richtig verstanden?

Wenn dem so ist, könntest du entweder die ImageBase einfach zu einer wahrscheinlich unbenutzten Adresse ändern :P

Oder, falls du die Dll manuell lädst, hast du schon das, was du willst, und addierst das Offset hinzu.
Falls nicht, mach's halt... oder geh alle Module durch und du erhältst deine VA ;-)

[ Edit ]
Ach, oder willst du die Datei einfach permanent in OllyDbg ändern?
Wegen der Abhängigkeiten werden die Windows API-Dlls immer am Anfang geladen und haben außerdem alle unterschiedliche ImageBases.
Also kannst du einfach die absolute Adresse zur Funktion Sleep benutzen.
05/08/2009 11:48 ms​#3
Quote:
Originally Posted by RDTSC View Post
Ach, oder willst du die Datei einfach permanent in OllyDbg ändern?
Genau

Quote:
Originally Posted by RDTSC View Post
Wegen der Abhängigkeiten werden die Windows API-Dlls immer am Anfang geladen und haben außerdem alle unterschiedliche ImageBases.
Also kannst du einfach die absolute Adresse zur Funktion Sleep benutzen
Wenn die ImageBase der WinAPI-Dll immer unterschiedlich ist, wie komme ich dann an die absolute Adresse heran?

Und zum Verständnis:
ImageBase + RVA = absolute Adresse, oder?
05/08/2009 14:43 RDTSC#4
Ja, so sieht's aus ;-)

Das wird sie bei der gleichen Windows-Version nicht sein.
Aber wenn es halt portierbarer sein soll, kannst du wie geschrieben die Prozesse und deren Module alle durchgehen,
oder du benutzt im selben Addressraum [Only registered and activated users can see links. Click Here To Register...] und addierst das Offset zu EAX.
05/08/2009 16:52 ms​#5
Ich habe mir eben angeschaut, wo in jedem Programm die kernel32.dll liegt. Die hatte zwar in der Tat überall die gleiche ImageBase, doch nach einem Neustart hatte sich diese Adresse wieder geändert.
Das heißt, dass die Dll nach jedem Neustart automatisch gepatcht werden müsste, aber ich würde sie gerne nur einmal manuell patchen.
05/08/2009 18:16 RDTSC#6
Benutzt du Vista?

Manuell am einfachsten zu erledigen wäre, wenn du eine gepatchte Adresse aus der IAT nimmst und da dann das statische Offset der Funktion abziehst, um die ImageBase zu erhalten, und dazu addierst du das der Sleep-Funktion (Oder halt direkt die Differenz beider Funktionen zur Adresse der ersten Funktion).
Hast du das denn nicht schon so?

Du könntest mir auch mal die Datei zukommen lassen inkl. genaueren Erklärungen, was du machen möchtest...