Hackerboard WikiHaboWeb Linkverzeichnis

[HaBo]

 
(In)security allgemein Sicherheit, Anonymität im Netz. Schutz und Maßnahmen. Prävention und Konzepte. Sicherheitsarchitekturen allgemein und auf der Netzwerkebene.

Umfrageergebnis anzeigen: Ein HowTo zum API-Hooking?
Klar,ich werde es aufjedenfall lesen! 105 89,74%
Knnst du gerne machen,werds aber warscheinlich nicht lesen! 5 4,27%
Unsinn,man braucht dazu kein HowTo. 6 5,13%
Bitte nicht,wer weiß was Kiddies damit anstellen?! 1 0,85%
Multiple-Choice-Umfrage. Teilnehmer: 117. Du darfst bei dieser Umfrage nicht abstimmen

Antwort
Alt 24.08.06, 15:37   #31 (permalink)
Member of Honour
 
Registriert seit: 29.01.05
Karma: 10
NeonZero Leistung: Facit NTK
Arrow Please Help!


Hat jemand von euch seinen Artikel zufällig abgespeichert? Er ist nämlich spurlos verschwunden. Nicht mal Xalon kommt da noch ran und seine lokale Kopie ist auch nicht mehr aufzutreiben. Für einen Cache im Internet war seine Seite zu kurz online (ich konnte jedenfalls nichts finden). Könnt ihr euren lokalen Browser-Cache mal danach durchsuchen?

Gerade wollte ich ihm die Arbeit abnehmen, und den Artikel ins Wiki übertragen (mit seiner Zustimmung natürlich). Da wird wohl nichts draus^^ Wirklich schade.

Bye, nz

NeonZero ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 24.08.06, 19:45   #32 (permalink)
 
Registriert seit: 04.02.06
Karma: 9
shodan Leistung: Facit NTK
Standard

Hier ist es.

mfg
Angehängte Dateien
Dateityp: zip api-hooking.zip (7,3 KB, 194x aufgerufen)
shodan ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 25.08.06, 01:26   #33 (permalink)
 
Registriert seit: 16.08.06
Karma: 7
merker Leistung: Facit NTK
Standard

Hallo Xalon,

mit Deiner im Tutorial beschriebenen Methode lassen sich nur Funktionen "hooken", die keine Parameter haben (z.B. KERNEL32.GetTickCount()).

Ruf doch mal die "gehookte" MessageBox() von irgendwo im Programm auf, d.h. nicht aus der main().
merker ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 25.08.06, 03:17   #34 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
Karma: 31
CDW Leistung: Pentium ICDW Leistung: Pentium I
Standard

Zitat:
"gehookte" MessageBox() von irgendwo im Programm auf, d.h. nicht aus der main().
das ist mir zwar zuviel C Zeug drin , aber als mögliche Fehlerquelle: sicher dass Dein Compiler STDCALL und nicht CDECL benutzt?

in etwa so sollte ein "allgemeiner" Hook gehen: Hooken, den Code wiederherstellen, an derselben Stelle weitermachen, wo der Hook vorher stand -als ob nichts geschehen wäre (daher braucht man sich auch nicht wirklich darum zu kümmern, was man für Anweisungen mit dem Hook auseinanderreißen könnte ) - und wenn man die RET Adresse manipuliert, kann man ein zweites mal in den Hookcode kommen, um den Hook nochmal zu setzen.

Das war mal für ein Injectme (war ein "einmaliger Hook" und wurde gerade erweitert (auf die Uhr schiel )) - wie immer hat der Code eine lange Geschichte hinter sich und wurde zig mal aus den älteren Versionen übernommen (daher auch einige unschöne Passagen - denn "never change working code" ). Im wesentlichen sollte es auch auf DLL übertragbar sein (da wird man sich auch keinen Kopf mit der relativen Adressierung machen müssen)

Im Beispiel hookt er die MessageBox API in einer beliebigen "test.exe" und gibt jedesmal eine eigene (zusätliche) MsgBox aus.
Angehängte Dateien
Dateityp: zip injectme2.zip (3,2 KB, 63x aufgerufen)
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 25.08.06, 06:05   #35 (permalink)
 
Registriert seit: 16.08.06
Karma: 7
merker Leistung: Facit NTK
Standard

@CDW:

Deine Vermutung ( __cdecl, __stdcall ) geht in die richtige Richtung. Allerdings soll (muss) das aus dem Tutorial hervorgehen.

Ausserdem darf man niemals "Murpy's Gesetz" ausser Acht lassen :

Der Erste, der Beispielcode verwendet, wird USER32.wsprintfA() hooken wollen.
merker ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 25.08.06, 17:18   #36 (permalink)
Member of Honour
 
Registriert seit: 29.01.05
Karma: 10
NeonZero Leistung: Facit NTK
Standard

@shodan: Klasse. Danke. Wo hast Du die Seite gefunden?

@merker & CDW: Womöglich könnt ihr dabei helfen, den Artikel zu erweitern, sobald er im Wiki steht? Das wäre wirklich eine große Hilfe für unser Wiki.

Bye, nz
NeonZero ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 25.08.06, 20:49   #37 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
Karma: 31
CDW Leistung: Pentium ICDW Leistung: Pentium I
Standard

Zitat:
Allerdings soll (muss) das aus dem Tutorial hervorgehen.
....
Der Erste, der Beispielcode verwendet, wird USER32.wsprintfA() hooken wollen.
einerseits hast Du recht (manche Sachen hält man für "selbstverständlich" wenn man sich länger mit einer Thematik beschäftigt und vergisst sie zu erwähnen), andererseits muss man imho bei solchen Themen nicht "Computabild hilft" nachmachen - API Hooking ist durchaus ein komplexeres Thema und sollte eigentlich erst in der Theorie verstanden werden, bevor man es praktisch (Code) umsetzt.


Zitat:
den Artikel zu erweitern, sobald er im Wiki steht?
Ich mag kein C und MASM[1] werden wahrscheinlich die meisten nicht lesen können(wollen) . Wenn sich jemand bereit erklärt, die Beispiele aus dem Artikel weiterzuführen und zu ergänzen (so dass man keinen MASM/C Missmatch machen muss), werde ich gerne meinen Teil beisteuern.

[1]Es sollte sich niemand von diesem MASM Beispiel abschrecken lassen, da hier noch die relative Adressierung berücksichtigt wird und das ganze eher für "private" Zwecke geschrieben wurde. In einer DLL kann man darauf verzichen und der Assemblyanteil sollte sich auch sehr einschränken lassen. Der Trick mit der "Hookeinsetzung" ist zu dem relativ dreckig geschrieben worden.
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 28.08.06, 17:34   #38 (permalink)
 
Registriert seit: 04.02.06
Karma: 9
shodan Leistung: Facit NTK
Standard

Zitat:
orginal von NeonZero
Wo hast Du die Seite gefunden?
Tja, ich hab die Angewohnheit sowas lokal zu speichern und dann
auf ne DVD zu brennen und da lag die Datei auch .

mfg
shodan ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 04.09.06, 02:20   #39 (permalink)
Member of Honour
 
Registriert seit: 29.01.05
Karma: 10
NeonZero Leistung: Facit NTK
Der Artikel ist nun im Wiki verfügbar!

Ich habe das TUT ins Wiki übertragen: http://wiki.hackerboard.de/index.php/Windows_API

Es wäre nett, wenn ihr mal drüber schauen könntet und ggf. Fehler korrigiert. Das wäre eine große Hilfe. Thx.

Bye, nz
NeonZero ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 04.09.06, 12:00   #40 (permalink)
 
Registriert seit: 05.10.05
Karma: 9
Inliferty Leistung: Facit NTK
Inliferty eine Nachricht über ICQ schicken
Standard

Nettes Tutorial.
Wäre aber nett wenn auch noch andere Hooking Methoden erklärt werden würden. (Exception Handling, IAT Patching, ...)
Einen Length Disassembler kann man in der Engine von PVDasm finden [http://pvdasm.reverse-engineering.ne....php?Section=3]

Mfg Iarumas
Inliferty ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 13.01.08, 11:57   #41 (permalink)
 
Registriert seit: 13.01.08
Karma: 4
.garfield Leistung: Facit NTK
Standard Problem mit dem COde

Also zuerst einmal Hallo, dies ist mein erster Beitrag hier im Board, und der ist natürlich gleich wieder eine (wahrs.) dumme Frage.
Ich programmiere mit Delphi (vorher jahrelang VB6*duck*) und bin erst seit kurzem in die Tiefen der etwas systemnäheren Programmierung eingestiegen. Das Tutorial hat mir sehr gut gefallen und ist mir vom Prinzip her auch verständlich. Ich habe jetzt einmal versucht das gleiche in Delphi zu machen.
Und wie man es sich hätte denken können:
Es funktioniert nicht richtig.
Das Umbiegen der Funktion auf die Check-Funktion funktioniert tadellos, aber wenn ich new_address aufrufen will, kommt folgender Fehler:
Zitat:
Exception EAccessViolation in module API_hook_real2.exe at 0000874D.
Ich habe schon alles versucht, beim ersten Mal hatte ich das Tutorial etwas freier interpretiert, als der Fehler da auch schon auftrat, habe ich es noch einmal ganz genau nach Vorlage probiert, was aber auch nichts geändert hat. Vllt ist es ein ganz einfacher Fehler der entweder durch meine Blödheit, oder den etwas "dörti" Code von Xalon (sieht für mich so aus ) hervorgerufen wird.
Mein Code sieht so aus: (Konsolenanwedung)



Code:
program API_hook_real2;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  windows;


procedure new_adress(i : Integer);
begin
  asm
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  NOP
  end;
end;

procedure Output(I : Integer);
begin
If i = 5 Then WriteLn('HA Ha..5 Geht doch!');
If i <> 5 Then WriteLn('Kein Problem! ' + IntToStr(i) + ' ist eine erlaubte Zahl.');
end;


procedure check(I : Integer);
begin
WriteLn('CHECKED ' + IntToSTr(i));
new_adress(i); //Fehlerquelle
end;

function SprungOffset(Absprung : Pointer; Ziel : Pointer) : Integer;
begin
Integer(Absprung) := Integer(Absprung) + 5;
Integer(Result)   := Integer(ziel) - Integer(Absprung);
end;




procedure hook_function(source_function : Pointer;
                       bytes_to_save : Integer;
                       new_adress : Pointer;
                       instead_call : Pointer;
                       ProcessID : Cardinal) ;
var
hProz : Cardinal;
byteq : integer;
temp_adress : array[0..10] of Pointer;
i : Integer;
rw : Cardinal;
sprungweite : Integer;
sprungweite2 : Integer;
begin
rw := 0 ;
hProz := OpenProcess(PROCESS_ALL_ACCESS,False, ProcessID);
temp_adress[0] := source_function;
temp_adress[1] := new_adress;
For i := 0 To (bytes_to_save) Do begin
  //erstes Byte wird gelesen
  ReadProcessMemory(hProz, source_Function, @byteq, SizeOf(byteq),rw );
  //und in die neue Funktion Eingefügt
  WriteProcessMemory(hProz,new_adress, @byteq, sizeOf(byteq),rw);
  //dann wird die neue Adresse um eins Erhöht
  new_adress := Pointer(Integer(new_adress) + 1);
  byteq := $90;
  //die Stelle in der Original Funktion wird mit NOP überschrieben
  WriteProcessMemory(hProz,source_function, @byteq, sizeOf(byteq),rw);
  source_function := Pointer(Integer(source_function) + 1);
end;

source_function := temp_adress[0];
byteq := $E9;
//JUMP SCHREIBEN AN DER ORIGINALFUNKTION
WriteProcessMemory(hproz, source_function, @byteq, sizeof(byteq), rw);
sprungweite := sprungoffset(source_function,instead_call);
source_function := Pointer(Integer(source_function) + 1);
WriteProcessMemory(hproz, source_function, @sprungweite, sizeof(Sprungweite), rw);
//JUMP SCHREIBEN BEI DEN GESICHERTEN BYTES
byteq := $E9;
new_adress := temp_adress[1];  //wiederherstellen
new_adress := Pointer(Integer(new_Adress) + Integer(bytes_to_save));//erhöhen
//einen JMP zu der "Anstatt"funktion schreiben
WriteProcessMemory(hproz,new_adress,@byteq,sizeof(byteq),rw);
new_adress := Pointer(Integer(new_adress) + 1);//erhöhen
//Die Sprungweite hinter den JMP schreiben
sprungweite2 := sprungoffset(Pointer(Integer(temp_adress[1]) + Integer(bytes_to_save)), Pointer(Integer(temp_adress[0]) +5 ));
WriteProcessMemory(hproz, new_adress, @sprungweite2, sizeof(sprungweite2), rw);
Closehandle(hProz);
end;
begin
  Hook_FunctioN(@output, 6, @new_Adress, @Check, GetCurrentProcessID);
  output(4);
  output(5);
  ReadLn;
end.
Danke im Voraus...
.garfield
Angehängte Dateien
Dateityp: rar api_hook_problem.rar (2,2 KB, 4x aufgerufen)
.garfield ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 14.01.08, 14:55   #42 (permalink)
Themenstarter
 
Registriert seit: 23.05.05
Karma: 10
Xalon Leistung: Facit NTK
Xalon eine Nachricht über ICQ schicken
Standard

Da haste schon recht, der Code suckt (aber er funzt )

Hast du das ganze schon mal mitm OllyDebugger geladen und dann geschaut was er genau macht?
So hab ich jedenfalls den Code im Tut debuggt und es is gar nicht so schwer wie man denkt.

mfg
Xalon
Xalon ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 14.01.08, 16:03   #43 (permalink)
 
Registriert seit: 13.01.08
Karma: 4
.garfield Leistung: Facit NTK
Standard

Ich kenne mich damit nicht besonders gut aus, aber soweit ich nachvollziehen konnte, wird in das NOP-Array durchaus geschrieben.

Olly zeigt mir aber als Fehlermeldung :
[quote] Access Violation when Writing to [00000004]

Diese Meldung kommt wiederholt, wahrs. bei jedem Durchgang der For-Schleife, mit exakt der selben Adresse.
//edit:
das ist die neue_adresse funktion
Olly markiert stets dabei folgende Zeile:
Code:
0040874C  /$ 55             PUSH EBP
0040874D  |. 0000           ADD BYTE PTR DS:[EAX],AL <- Die hier!
0040874F  |. 0000           ADD BYTE PTR DS:[EAX],AL
00408751  |. 00E9           ADD CL,CH
00408753  |. 1A00           SBB AL,BYTE PTR DS:[EAX]
00408755  |. 0000           ADD BYTE PTR DS:[EAX],AL
00408757  |. 90             NOP
00408758  |. 90             NOP
00408759  |. 90             NOP
0040875A  |. 90             NOP
0040875B  |. 90             NOP
0040875C  |. 90             NOP
0040875D  |. 90             NOP
0040875E  |. 90             NOP
0040875F  |. 90             NOP
00408760  |. 90             NOP
00408761  |. 90             NOP
00408762  |. 90             NOP
00408763  |. 90             NOP
00408764  |. 90             NOP
00408765  |. 90             NOP
00408766  |. 90             NOP
00408767  |. 90             NOP
00408768  |. 90             NOP
00408769  |. 90             NOP
0040876A  \. C3             RETN
.garfield ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 14.01.08, 18:34   #44 (permalink)
Themenstarter
 
Registriert seit: 23.05.05
Karma: 10
Xalon Leistung: Facit NTK
Xalon eine Nachricht über ICQ schicken
Standard

Der Code in den Nops schaut nicht richtig aus, kannst ihn ja mal mit dem der original Funktion vergleichen

mfg
Xalon ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 14.01.08, 19:30   #45 (permalink)
 
Registriert seit: 13.01.08
Karma: 4
.garfield Leistung: Facit NTK
Standard

Hmm Stimmt, die Originalfunktion sieht in Wirklichkeit so aus:
Code:
0040876C  /$ 55             PUSH EBP
0040876D  |. 8BEC           MOV EBP,ESP
0040876F  |. 6A 00          PUSH 0
00408771  |. 6A 00          PUSH 0
00408773  |. 53             PUSH EBX
00408774  |. 8BD8           MOV EBX,EAX
00408776  |. 33C0           XOR EAX,EAX
00408778  |. 55             PUSH EBP
00408779  |. 68 FD874000    PUSH API_hook.004087FD
0040877E  |. 64:FF30        PUSH DWORD PTR FS:[EAX]
00408781  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP
00408784  |. 83FB 05        CMP EBX,5
00408787  |. 75 19          JNZ SHORT API_hook.004087A2
00408789  |. A1 04934000    MOV EAX,DWORD PTR DS:[409304]
0040878E  |. BA 14884000    MOV EDX,API_hook.00408814                ;  ASCII "HA Ha..5 Geht doch!"
00408793  |. E8 C4BBFFFF    CALL API_hook.0040435C
00408798  |. E8 DBA8FFFF    CALL API_hook.00403078
0040879D  |. E8 06A2FFFF    CALL API_hook.004029A8
004087A2  |> 83FB 05        CMP EBX,5
004087A5  |. 74 3B          JE SHORT API_hook.004087E2
004087A7  |. 68 30884000    PUSH API_hook.00408830                   ;  ASCII "Kein Problem! "
004087AC  |. 8D55 F8        LEA EDX,DWORD PTR SS:[EBP-8]
004087AF  |. 8BC3           MOV EAX,EBX
004087B1  |. E8 5ED5FFFF    CALL API_hook.00405D14
004087B6  |. FF75 F8        PUSH DWORD PTR SS:[EBP-8]
004087B9  |. 68 48884000    PUSH API_hook.00408848                   ;  ASCII " ist eine erlaubte Zahl."
004087BE  |. 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4]
004087C1  |. BA 03000000    MOV EDX,3
004087C6  |. E8 55BAFFFF    CALL API_hook.00404220
004087CB  |. 8B55 FC        MOV EDX,DWORD PTR SS:[EBP-4]
004087CE  |. A1 04934000    MOV EAX,DWORD PTR DS:[409304]
004087D3  |. E8 84BBFFFF    CALL API_hook.0040435C
004087D8  |. E8 9BA8FFFF    CALL API_hook.00403078
004087DD  |. E8 C6A1FFFF    CALL API_hook.004029A8
004087E2  |> 33C0           XOR EAX,EAX
004087E4  |. 5A             POP EDX
004087E5  |. 59             POP ECX
004087E6  |. 59             POP ECX
004087E7  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX
004087EA  |. 68 04884000    PUSH API_hook.00408804
004087EF  |> 8D45 F8        LEA EAX,DWORD PTR SS:[EBP-8]
004087F2  |. BA 02000000    MOV EDX,2
004087F7  |. E8 14B7FFFF    CALL API_hook.00403F10
004087FC  \. C3             RETN
aber warum das so ist, kann ich wirklich nicht erraten.
.garfield ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Antwort

[HaBo] » Security Area » (In)security allgemein » [HowTo] Api-Hooking -- Interesse?
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are an
Refbacks are an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Inline Hooking Schurke (In)security allgemein 5 03.05.09 14:44
Dll Hooking über Api Hook Schurke Code Kitchen 5 11.03.09 17:38
zum Hooking Schurke Code Kitchen 4 07.06.08 14:48
Seite über Debian ! Interesse vorhanden ? Dawen Linux/UNIX 8 29.05.05 23:17
Frage aus Interesse bzgl. ME-Bootfehler non Windows 2 03.09.03 20:09


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58