| (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 | |||
![]() |
|
|
#31 (permalink) |
|
Member of Honour
![]() Registriert seit: 29.01.05
![]() |
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 |
|
|
|
|
|
#33 (permalink) |
|
Registriert seit: 16.08.06
![]() |
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(). |
|
|
|
|
|
#34 (permalink) | |
|
Moderator
![]() Registriert seit: 20.07.05
![]() ![]() |
Zitat:
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 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 Beispiel hookt er die MessageBox API in einer beliebigen "test.exe" und gibt jedesmal eine eigene (zusätliche) MsgBox aus.
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf! Selig, wer nichts zu sagen hat und trotzdem schweigt. |
|
|
|
|
|
|
#35 (permalink) |
|
Registriert seit: 16.08.06
![]() |
@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. |
|
|
|
|
|
#36 (permalink) |
|
Member of Honour
![]() Registriert seit: 29.01.05
![]() |
@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 |
|
|
|
|
|
#37 (permalink) | ||
|
Moderator
![]() Registriert seit: 20.07.05
![]() ![]() |
Zitat:
Zitat:
[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. |
||
|
|
|
|
|
#38 (permalink) | |
|
Registriert seit: 04.02.06
![]() |
Zitat:
auf ne DVD zu brennen und da lag die Datei auch .mfg |
|
|
|
|
|
|
#39 (permalink) |
|
Member of Honour
![]() Registriert seit: 29.01.05
![]() |
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 |
|
|
|
|
|
#40 (permalink) |
|
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 |
|
|
|
|
|
|
#41 (permalink) | |
|
Registriert seit: 13.01.08
![]() |
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:
) 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.
.garfield |
|
|
|
|
|
|
#42 (permalink) |
| Themenstarter |
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 |
|
|
|
|
|
#43 (permalink) |
|
Registriert seit: 13.01.08
![]() |
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 |
|
|
|
|
|
#44 (permalink) |
| Themenstarter |
Der Code in den Nops schaut nicht richtig aus, kannst ihn ja mal mit dem der original Funktion vergleichen
mfg |
|
|
|
|
|
#45 (permalink) |
|
Registriert seit: 13.01.08
![]() |
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
|
|
|
|
![]() |
| Themen-Optionen | Thema durchsuchen |
| Ansicht | |
|
|
Ä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 |