Api wieder Dehooken

Morgen,

habe folgendes Problem würde gern ein Programm beenden, dass die API aber so hookt, dass es nicht möglich ist einen Handler auf den Prozess zu bekommen.

Nun meine Frage, ist es irgendwie möglich die API wieder zu dehooken, während das Programm noch läuft....


MFG PsycoB
 
Eigentlich müsste es scho n gehen, wenn man "hart" die Adressen für den Callback Funktion ändern würde aber das ist echt hart ;)

Das sauberste wäre doch wirklich ein WindowsPE oder sowas zu starten und dann den Schädling aus dem Autostart zu entfernen.

Ansonsten kommst du vlt. mit den Sysinterlas.com Process Explorer weiter...
 
Ich gehe davon aus, dass du ein Betriebsystem der Windows NT Reihe meinst.

Das Programm, das du beenden willst hookt die API also global? Nur im Usermode?
Dann hast du Glück. Denn dann kannst du "direct syscalls" machen, die man im Usermode schwer abfangen kann.

Hier [1] ist es ganz gut erklärt. Dann suchst du einfach mal die typedefs von NtOpenProcess und NtTerminateProcess.
Wie du den ServiceIndex der beiden Funktionen bekommst, steht hier [1] zwei posts weiter unten.

Wenn du die API wirklich unhooken möchtest, dann wird das etwas komplizierter.
Der Funktionskopf ist bei fast allen APIs gleich. Das erleichtert Hooken und Hotpatching enorm.

Code:
8BFF            MOV EDI,EDI
55              PUSH EBP
8BEC            MOV EBP,ESP

Du könntest also prüfen ob die Bytes des Funktionsrumpfes oben gezeigten Bytes entsprechen.(Vorsicht, es gibt Ausnahmen!) Wenn nicht, dann hast du es mit einer gehookten API zu tun und du kannst die API nun dadurch unhooken, dass du einfach die original-bytes über den Detour schreibst.

Hooks können aber auch viel tiefer sitzen und müssen nicht unbedingt am Funktionsanfang stehen. In diesem Fall wird es schwieriger. Notfalls muss man die Funktion im Speicher mit der Funktion in dem Image auf der Festplatte vergleichen und den Hook suchen. Man kann übrigens auch eine DLL ein zweites mal Laden, wenn man eine bestimmte API hookt... Ich kann mich über dieses komplexe Thema auch nahezu zu Tode labern. Also orientier dich erstmal. Wäge ab, was du genau erreichen willst und orientier dich erstmal.


[1] http://forum.gamedeception.net/showthread.php?t=5807&page=2&p=82161
 
Erstmal vielen Dank für eure guten Antworten....

Man kann übrigens auch eine DLL ein zweites mal Laden, wenn man eine bestimmte API hookt...
das klingt interessant, wenn ich das richtig verstehe könnte man dann ja auch die saubere nicht gehookte DLL laden??? Bin noch ziemlicher Anfänger was hooken angeht, möchte da aber mein Wissen auf jeden Fall erweitern.....

MFG PsycoB
 
Zu dem DLL ein zweites mal Laden.
Hier ein Codesnippet von brechi aka uall aus der DelphiPraxis:

[1]
Code:
var oldRtlEqualUnicodeString: function(a,b: pointer; c: boolean): boolean; stdcall;
    nextRtlEqualUnicodeString: function(a,b: pointer; c: boolean): boolean; stdcall;
    forcename: string;

function myRtlEqualUnicodeString(a,b: pointer; c: boolean): boolean; stdcall;
begin
  if pos(forcename,uppercase(pwidechar(pointer(cardinal(b)+4)^))) > 0 then
    result := false else
    result := nextRtlEqualUnicodeString(a,b,c);
end;

function ForceLoadLibraryNtA(dllname: pchar): cardinal; stdcall;
begin
  @oldRtlEqualUnicodeString := GetProcAddress(GetModuleHandle('ntdll.dll'),'RtlEqualUnicodeString');
  if (@oldRtlEqualUnicodeString <> nil) then
  begin
    uallTableHook.HookAPIJMP(@oldRtlEqualUnicodeString,@myRtlEqualUnicodeString,@nextRtlEqualUnicodeString);
    forcename := uppercase(dllname);
    result := LoadLibraryA(dllname);
    uallTableHook.UnhookAPIJMP(@nextRtlEqualUnicodeString);
  end else
    Result := LoadLibraryA(dllname);
end;

LoadLibrary checkt intern ob eine DLL schon geladen wurde mit RtlEqualUnicodeString.
Wurde die DLL schon geladen gibt LoadLibrary nur das ModuleHandle der schon geladenen DLL zurück. Wenn man nun diese API hookt und bei der DLL, die man ein zweites mal laden möchte, ein false zurück gibt, dann mappt die Funktion die DLL komplett nochmal neu in den Speicher des Prozesses.

[1] http://www.delphipraxis.net/topic59...hooks+umgehen.html&highlight=forceloadlibrary
 
Zurück
Oben