|
You last visited: Today at 00:21
Advertisement
API Hooks - ASM (keine hochsprache erwünscht!)
Discussion on API Hooks - ASM (keine hochsprache erwünscht!) within the General Coding forum part of the Coders Den category.
03/21/2007, 13:30
|
#1
|
elite*gold: 0
Join Date: Mar 2007
Posts: 10
Received Thanks: 0
|
Die Überschrift sollte alles sagen, hier mal kurz meine vorgehensweise:
1. Aktuelle Position im Speicher finden. (delta offset)
2. kernel32.dll ImageBase Adresse finden.
3. Und dann finde ich die Funktionsadressen (scanning Export Directory Table).
Code:
;find kernel32.dll image base address. *
* *xor * * * *eax, eax * * * * * * * * * * * * * *
* *ASSUME * * FS:NOTHING
* *mov * * eax,fs:[eax+30h] * * * * * * * *
* *test * *eax,eax * * * * * * * * * * * * * *
* *js * * * * __kernel_9X * * * * * * * * * * * *
__kernel_NT:
* *mov * * eax,[eax+0Ch] * * * * * * * * * *
* *mov * * esi,[eax+1Ch] * * * * * * * * * *
* *lodsd * * * * * * * * * * * * * * * * * *
* *mov * * eax,[eax+8h] * * * * * * * * * *
* *jmp * * __kernel_finish * * * * * * * *
__kernel_9X:
* *mov * * * *byte ptr[ebx+winNT], 0 *;we are at a win9X machine
* *mov * * eax, [eax+34h]
* *lea * * eax, [eax+7Ch]
* *mov * * eax, [eax+3Ch] * * * * * * * *
__kernel_finish:
*; EAX == kernel32.dll image base address
und hier die Funktion die APIs findet:
Code:
GetFuncAddr PROC
;search for function address by scannig Export Directory Table.
pushad
mov ebp, [esp+28h]
mov eax, [ebp+3Ch]
mov edx, [ebp+eax+78h]
add edx, ebp
mov ecx, [edx+18h]
mov ebx, [edx+20h]
add ebx, ebp
GFA_loop:
jecxz GFA_notfound
dec ecx
mov esi, [ebx+ecx*4]
add esi, ebp
GFA_compute_hash:
xor edi, edi
xor eax, eax
cld
GFA_compute_hash_again:
lodsb
test al, al
jz GFA_compute_hash_finished
ror edi, 0Dh
add edi, eax
jmp GFA_compute_hash_again
GFA_compute_hash_finished:
GFA_compare:
cmp edi, [esp+24h]
jnz GFA_loop
mov ebx, [edx+24h]
add ebx, ebp
mov cx, [ebx+2*ecx]
mov ebx, [edx+1Ch]
add ebx, ebp
mov eax, [ebx+4*ecx]
add eax, ebp
mov [esp+1Ch], eax
GFA_finish:
popad
ret 8
GFA_notfound:
xor eax,eax
mov [esp+1Ch], eax
jmp GFA_finish
GetFuncAddr ENDP
Wie schaffe ich es code- UND datensegment in den Adressraum der kernel32.dll jedes Processes zu laden ?
Nen codeschnipsel würd mich freuen...
|
|
|
03/21/2007, 14:41
|
#2
|
elite*gold: 0
Join Date: Mar 2007
Posts: 17
Received Thanks: 2
|
(Ich sage schon mal vor dem schreiben, dass einige kleine Fehler drin sein könnten. Aber meine eigene Implementierung spricht zumindest dafür, das ich das bis ins Detail verstehe habe. Zumindest funktioniert der Code einwandfrei)
Wieso zum Teufel nimmst du ASM dafür? ... err egal
Um deinen Code in den Zielprozess zu bekommen, kompilierst du ihn als Dll (wie du schon in deinem anderen Thread darauf gekommen bist, läuft es auf Dll Injection hinaus).
Es hat einige Vorteile hier eine Hochsprache zu benutzen. Da du C beherrscht, wäre das nicht verkehrt.
Wie auch immer, bleiben wir bei ASM. Das größte Problem was du hast, ist nicht der Code den du in den Prozess schreibst (VirtualAllocEx und WriteProcessMemory) sondern die Strings ... oder generell der ganze Segment.
Um eine Dll zu injizieren, schreibst du als aller erstes den _vollen_ Pfad zu deiner Dll in den Zielprozess. Der nächste Schritt ist dein (Shell)Code. Hier reservierst du auch erstmal Speicher im Zielprozess mit VirtualAllocEx und schreibst ihn mit WriteProcessMemory rein. Danach muss der Pointer auf den String angepasst werden (Standard Encoding). Wenn du schlau bist, reservierst du gleich 1x Speicher mit MAX_PATH + Codelen. Den Pfad schreibst du an den Beginn des reservierten Speichers und für den Code addierst du MAX_PATH hinzu und schreibst ihn dort. Da du deinen Code kennst, subtrahierst du von der derzeitige Position MAX_PATH und ggf. die Länge der Instruktionen, die davor sind bevor du den Pointer auf den Dll-Pfad auf den Stack pusht um LoadLibrary aufzurufen.
Danach ein Aufruf in deinem Injector an CreateRemoteThread mit deiner Codeposition (Beginn des reservierten Speichers + MAX_PATH) und im Zielprozess wird ein Thread gestartet, der den Code ausführt und somit deine Dll läd.
Kleiner Hinweis: Kernel32.dll wird bei den derzeitigen Systemen _immer_ unter seiner ImageBase geladen und kollidiert mit keiner anderen System-Dll. Microsoft gibt aber keine Garantie dafür. Damit brauchst du eigentlich kein RemoteGetFuncProc.
In der Dll könntest du wie gewohnt auf deine Daten zugreifen. Für API Hooking bietet sich Dll-Injection an, da du auf herkömmliche Weise - da die volle Positon kriegst - mit dem Function Pointer arbeiten kannst, überschreibst du die ersten paar Byte der API mit einem Jmp auf deine Funktion (den Jump musst du natürlich auch kodieren/"generieren") und fertig bist du. Mit XP SP2 hat Microsoft z. B. bei den Winsock APIs vor dem push ebp den mov edi, edi Befehle eingeführt, der das Hooking mit Jumps vereinfachen soll. Damit kannst du getrost die ersten 5 byte mit deinem Jump überschreiben und bevor du die echte API aufrufst rekonstruierst den Prolog-Code und rufst die ursprüngliche Funktion auf (natürlich vorher 5 byte auf den Pointer addieren, sonst landest du wieder in deiner Funktion).
Wie dir vielleicht auffällt, sind bei vielen APIs nach push ebp und mov ebp, esp der folgende ASM Befehl nicht immer konstant (insbesondere die Länge). Damit müsstest du mit der Methode eigentlich einen Disassembler benutzen um die Länge der Befehle zu ermitteln bevor du sie hookst (und den "Rest" NOPst).
Eine andere Methode wäre Win32 Structured Exceptions zu nutzen. Der Software-Breakpoint (int 03) hat eine Länge von 1, womit du dir den Length Disassembler sparen könntest wenn du auf mov edi, edi und push ebp prüfst. Damit müsstest du zumindest alle Win APIs hooken können.

Ein Hook auf KiUserExceptionDispatcher garantiert dir, dass du als erstes die Exception zu Gesicht bekommst und dann EXCEPTION_CONTINUE_EXECUTION oder EXCEPTION_CONTINUE_SEARCH zurücklieferst und dann den Rest des Codes anhand dieses Resultats anspringst oder überspringst.
(Das ändern der Importtable werde ich nicht mal anschneiden, dafür hat es zu viele Nachteile).
Codebeispiele in ASM bekommst du leider nicht von mir. Dafür habe ich nicht die Zeit und nicht die Lust. Ich weiss auch ohne was Schmerzen sind
|
|
|
03/21/2007, 14:55
|
#3
|
elite*gold: 0
Join Date: Mar 2007
Posts: 10
Received Thanks: 0
|
deine api befehle sind ja ganz nett, du zeugst auch davon ahnung zu haben, von dem was du laberst, dennoch soll es in asm laufen  . Wer benutzt denn die einfache methode wenns schwer auch geht ? ^^
|
|
|
03/21/2007, 16:32
|
#4
|
elite*gold: 0
Join Date: Mar 2006
Posts: 145
Received Thanks: 14
|
Quote:
Originally posted by cc_ip@Mar 21 2007, 14:55
deine api befehle sind ja ganz nett, du zeugst auch davon ahnung zu haben, von dem was du laberst, dennoch soll es in asm laufen . Wer benutzt denn die einfache methode wenns schwer auch geht ? ^^
|
die ganzen funktionen die er erwähnt hat sollte auch im asm funzen (VirtualAllocEx, WriteProcessMemory, CreateRemoteThread). bei WriteProcessMemory bin ich 100% sicher bei VirtualAllocEx nich ganz so sicher aber ich würde wetten das es geht und CreateRemoteThread sag mit nix aber wenns ne "standart funktion" ist wie die anderen 2 wird auch das gehen.
wenn ich zuhause bin und den code noh hab zeig ich dir wie man zumindest WriteProcessMemory in asm aufruft fals interesse besteht ^^
Gruß
|
|
|
03/21/2007, 16:49
|
#5
|
elite*gold: 0
Join Date: Aug 2005
Posts: 443
Received Thanks: 72
|
machst du das nur zu lernzwecken oder willst du damit was wirklich sinnvolles schreiben?
Dann kämen nämlich noch ettliche andere Dinge hinzu, die du beachten musst, z.b.
1) was passiert, wenn ein anderes Programm auch einen Hook setzt und damit deinen Jump wieder überschreibt?
2) Teilweise stellt Windows aus Sicherheitsgründen den Originalcode wieder her, du müsstest den Hook nach bestimmten Aktionen also wieder erneuern
3) Alle neuen "linkings", sowohl dynamische als auch statische) werden zwar auf deine Callback funktionen umgeleitet, jedoch hat es keine Auswirkung auf bereits existierende linksings (z.b. statische von bereits geladenen DLLs)
4) Man kann EAT Hooks nur sehr schwer wieder entfernen , wenn überhaupt
Außerdem kann es zu Problemen kommen, wenn man die Export Tabelle von DLL's die in der Shared Area von Win9x geladen wurde, oder nicht da geladen wurden, aber eine Shared Export Table haben, ändert (komplizierter Satz Oo)
Export Table Patching kann immer nur ein bestandteil von einem guten Hook sein.
Mit deinem ASM Problem kann ich dir leider nicht helfen, aber wollte dich trotzdem darauf aufmerksam machen
|
|
|
03/21/2007, 21:32
|
#6
|
elite*gold: 20
Join Date: Jan 2006
Posts: 539
Received Thanks: 228
|
Quote:
Originally posted by DodgeX+Mar 21 2007, 16:32--></span><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>QUOTE (DodgeX @ Mar 21 2007, 16:32)</td></tr><tr><td id='QUOTE'> <!--QuoteBegin--cc_ip@Mar 21 2007, 14:55
deine api befehle sind ja ganz nett, du zeugst auch davon ahnung zu haben, von dem was du laberst, dennoch soll es in asm laufen . Wer benutzt denn die einfache methode wenns schwer auch geht ? ^^
|
die ganzen funktionen die er erwähnt hat sollte auch im asm funzen (VirtualAllocEx, WriteProcessMemory, CreateRemoteThread). bei WriteProcessMemory bin ich 100% sicher bei VirtualAllocEx nich ganz so sicher aber ich würde wetten das es geht und CreateRemoteThread sag mit nix aber wenns ne "standart funktion" ist wie die anderen 2 wird auch das gehen.
wenn ich zuhause bin und den code noh hab zeig ich dir wie man zumindest WriteProcessMemory in asm aufruft fals interesse besteht ^^
Gruß  [/b][/quote]
Man kann jeden API befehl in asm nutzen, was anderes macht eine hochsprache doch auch nicht (:
|
|
|
03/22/2007, 11:54
|
#7
|
elite*gold: 0
Join Date: Mar 2007
Posts: 10
Received Thanks: 0
|
jedoch gibt es einen kleinen unterschied zwischen können und wollen, ich könnte ja z.b. auch ein c programm schreiben und darin(wenn auch nur teileweise) mit asm befehlen arbeiten...
|
|
|
03/22/2007, 13:15
|
#8
|
elite*gold: 0
Join Date: Mar 2006
Posts: 145
Received Thanks: 14
|
wo is das problem mit den api befehlen?
|
|
|
03/23/2007, 06:37
|
#9
|
elite*gold: 0
Join Date: May 2005
Posts: 232
Received Thanks: 52
|
wieso möchtest du es denn unbedingt schwer machen? interessiert mich wirklich da die meisten coder die ich kenne wirklich faul sind !  (abgesehen wenn es um den lerneffekt geht)
ich kann mich aber meinen vorrednern nur anschließen, c++ nehmen und alles in inline asm machen, api calls dann ohne probleme aufrufen. btw evtl solltest du bei deinem proc oben auch auf die flags achten (stichwort pushfd), ich hatte schon öfter probleme mit unsauberen hooks, die durch call xy die flags total verhunzt haben
EDIT:
lol 100% c & p. lern erstmal was bevor du mit kopiertem code fragen stellst, dass du so nix hinkriegst ist ja klar ROFL
|
|
|
03/23/2007, 12:27
|
#10
|
elite*gold: 71
Join Date: Apr 2004
Posts: 7,163
Received Thanks: 3,096
|
*LACHFLASH*
selfowned?
|
|
|
03/25/2007, 14:49
|
#11
|
elite*gold: 0
Join Date: Mar 2007
Posts: 10
Received Thanks: 0
|
ist copy paste denn nicht erlaubt ? ^^ der andre thread von mir ist auch nur copy paste ^^. habe in meinen ersten thread doch gesagt ich stell nen paar fragen das hab ich gemacht.
|
|
|
 |
Similar Threads
|
[C++]Hooks
03/25/2010 - Coding Tutorials - 12 Replies
so... ich denke mal, dass ich euch eine der wichtigsten teile in sachen gamehacking hier erklären kann, oder zumindest versuchen zu erklären:p
fangen wir mal damit an, was ich benutze:
-Visual Studio 2008 Professional + Visual Assist X
-IDA Pro Free
-ein game
los gehts:
erstellt euch eine struktur, wodrin ihr informationen über einen hook speichert.
bei mir sieht das so aus:
|
[c++]hooks
11/02/2009 - C/C++ - 2 Replies
brauche hilfe bei meinen hooks!
ms detours will ich nich benutzen (vorallem weil die nich für meine zwecke laufen :D), ausserdem um weiterzu lernen eigenes system schreiben!
mein problem is wenn ich in einer funktion die ersten 5 bytes mit jmp dword überschreibe, und z.b. das 2 byte auch nen jmp dword ist, bleibt am ende 1 byte über!
in meiner subfunc speicher ich die register mit pushad, call , popad, den überschriebenen code hier einfügen, und dann jmp ....
|
Bot in Hochsprache schreiben?
03/16/2009 - GW Bots - 15 Replies
Hi,
hab mir mal ueberlegt einen Bot mal nich in Au3 zu schreiben.
Aber ich weiss nicht, in welcher Hochsprache ich den dann schreiben sollte.
Entweder C++ oder C#.
Und vorallem nicht wie, denn ich kenn die befehle wie send oder mouseclick unter den c sprachen nicht (werd mir mal den Au3 quellcode ansehen, wie die das machen).
Ich gedachte das volle programm, ausser evtl. mit GUI. D.h. Bot an sich, alle items aufsammeln, resignen, identen, verkaufen, gold in truhe deponieren.
Naja das...
|
Hooks mit VB?
04/22/2007 - .NET Languages - 21 Replies
Nabend,
Ich versuch mich momentan den Tinytoon Hook hiermit zum implementieren, da mich Forceshock langsam.... :eek:
Wär nett wenn jemand noch sinnvolle Beispiele dazu hätte, ua. selbst Erfahrung damit hat.
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long ...
|
All times are GMT +1. The time now is 00:21.
|
|