OldSchoolHack

Register / Login English

Prob mit Detour


icon Prob mit Detour #1

Join Date: Sep 2010

Posts: 38

Hey ho, ich habe mich gerad an dem D3d8 Hook tut von Knavker versucht und bekomme Probleme.
Wer das Tut nicht kennt:
Man sucht die Stelle im Speicher, wo die BeginScene Funktion liegt und detourt dann in der Funktion.
Mein erstes Problem:
Wenn ich Olly1.x verwende finde ich eine andere Funktionsadresse, als wenn ich Olly2.x benutze:
Olly1 Funktionebsginn :
CPP Code:
  1. 6E3043A0 8BFF MOV EDI,EDI
Olly2 Funktionsbeginn :
CPP Code:
  1. 6E4243A0 8BFF MOV EDI,EDI
Nun gut, ich habe dann also versucht das ganze zu detourn: (nicht am Funktionsanfang)
CPP Code:
  1. #include <Windows.h>
  2. #include "d3d8.h"
  3. #include "detours.h"
  4. #pragma comment (lib,"detours.lib")
  5.  
  6.  
  7.  
  8. IDirect3DDevice8* deviceptr = NULL;
  9. typedef void (*oBeginScene)();
  10. oBeginScene pBeginScene;
  11.  
  12. void __declspec (naked) GetDevicePointer(){
  13. if (deviceptr == NULL){
  14. __asm{
  15. push eax
  16. mov eax, [esp + 0x34 + 0x04]
  17. mov deviceptr,eax
  18. pop eax
  19. jmp pBeginScene
  20. }
  21. }else{
  22. __asm jmp pBeginScene
  23. }
  24. }
  25.  
  26. void initHook(){
  27. pBeginScene = (oBeginScene)DetourFunction((PBYTE)0x6E3043BE,(PBYTE)GetDevicePointer);
  28. }
  29.  
  30. BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved){
  31. if (fdwReason == DLL_PROCESS_ATTACH){
  32. initHook();
  33. }
  34. }
Der Prozess stürzt ab beim Injecten. Wenn ich mir den Detour Jump anschaue:
6E4243BE    JMP 6E3B1258
kann ich der Adresse in Olly nicht folgen, Olly sagt
Quote
No Memory at this address
MsDetous setzt den Jump also nicht zu meiner Funktion, sondern irgendwo anders hin.
Könnte mir jemand sagen, was da falsch läuft, bzw was ich falsch mache ?
mfg Krusty.

icon #2

Join Date: Nov 2007

Posts: 11

6E3043A0,6E4243A0 fällt iwas auf?

probiers mal mit d3d8.dll+0x43A0

dein jump problem find ich etwas seltsam zumal "6E4243BE JMP 6E3B1258" eine ganz andere addresse zu sein scheint. (6E4243BE)
icon #3

Join Date: Sep 2010

Posts: 38

Erledigt!

Spoiler
CPP Code:
  1. #include <Windows.h>
  2. #include "d3d8.h"
  3. #include "detours.h"
  4. #pragma comment (lib,"detours.lib")
  5.  
  6.  
  7.  
  8. IDirect3DDevice8* deviceptr = NULL;
  9. typedef void (*oBeginScene)();
  10. oBeginScene pBeginScene;
  11.  
  12.  
  13. void __declspec (naked) GetDevicePointer(){
  14. MessageBox(0,"BeginScene wird aufgerufen","funcktioniert",0);
  15. if (deviceptr == NULL){
  16. __asm{
  17. push eax
  18. mov eax, [esp + 0x34 + 0x04]
  19. mov deviceptr,eax
  20. pop eax
  21. jmp pBeginScene
  22. }
  23. }else{
  24. __asm jmp pBeginScene
  25. }
  26. }
  27.  
  28. void initHook(){
  29. char buff[200];
  30. DWORD offset = 0x443A0;
  31. DWORD funcadr = (DWORD)GetModuleHandle("d3d8.dll") + offset + 0x1e;
  32. itoa(funcadr,buff,16);
  33. strcat(buff," hier wird gehookt.");
  34. MessageBox(0,buff,"[DEBUG]",0);
  35. pBeginScene = (oBeginScene)DetourFunction((PBYTE)(funcadr),(PBYTE)GetDevicePointer);
  36. }
  37.  
  38. BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved){
  39. if (fdwReason == DLL_PROCESS_ATTACH){
  40. initHook();
  41. }
  42. }
bin jetzt soweit gekommen, habe das richtige offset gefunden.
Allerdings springt msdetours immernoch ins nirvana, also nicht zu meiner GetDevicePointer funktion!
Benutze VC++ unter win64 bit. ich injiziere die DLLs mit dem Programm ProcessHacker2, ist ein erweiterter Taskmanager.
Noch eine Sache. Ich habe versucht initHook Funktion im Thread zu starten:
CPP Code:
  1. CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)initHook,0,0,NULL);
aus der DLL Main raus schmiert der Prozess sofort ab.


Ohje, wie peinlich. ich hatte vergessen der Dllmain einen Rückgabewert zu verpassen. Nun funktioniert alles so weit.
icon #4

Join Date: Aug 2007

Posts: 8643

User-Rating:

199 positive
33 negative
MessageBox kannst du glaub ich nicht in einer naked func verwenden ohne vorheriges pushad. Und ich würde nochmal schauen ob der Hook wirklich so funktioniert wie du willst.

greetz KN4CK3R

__________________

Hallo
icon #5

Join Date: Sep 2010

Posts: 38

Habs jetzt garnicht mehr mit MessageBox() probiert. Ohne funktionierts auf jeden Fall perfekt. Danke nochmal für die Hilfe. Gibts es irgendwelche Tricks, wie man recht leicht an die Funktionsadresse kommt ?
Ich habe es so gemacht:
1. Ich lasse mir die Base Adresse vom D3d8.dll Modul ausgeben
2. Ich schaue mit Olly nach der Adresse der BeginScene Funktion im Prozess
3. ich subtrahiere von der Funktionsadresse die Base Adresse des Moduls
Das scheint mir ein wenig aufwendig, zumal du (KN4CKER) in dem Tut eine statische Adresse verwendest. Das Berechnen wäre auch nicht weiter schlimm, wenn man nur schnell zum Call der BeginScene Funktion finden würde.
Mfg Krusty.
icon #6

Join Date: Aug 2008

Posts: 2594

User-Rating:

17 positive
5 negative
Wie wärs mit FindPattern Funktion?

icon #7

Join Date: Sep 2010

Posts: 38

FindPattern ist doch aber ziemlich Programmabhängig oda ? Ich überlege eher, wie ich schnell den Call der Funktionen in anderen Spielen o.ä. finde.
Danke für die schnellen Antworten
icon #8

Join Date: Aug 2008

Posts: 2594

User-Rating:

17 positive
5 negative
Quote from krusty
FindPattern ist doch aber ziemlich Programmabhängig oda ? Ich überlege eher, wie ich schnell den Call der Funktionen in anderen Spielen o.ä. finde.
Danke für die schnellen Antworten
Es ist nur davon abhängig ob es eine DLL zum injecten sein wird oder nicht. Die typische FindPattern Funktion von Gordon funktioniert nur in eine dll die injected wird, aber da du eh injecten und hooken willst sollte es eigentlich kein Problem sein.
icon #9

Join Date: Sep 2010

Posts: 38

oO
es wäre egal in welches Programm ich injecte und durch FindPattern bekomme ich immer die richtige Adresse zum hooken oO
das kann ich mir nicht vorstellen.
icon #10

Join Date: Aug 2008

Posts: 2594

User-Rating:

17 positive
5 negative
Quote from krusty
oO
es wäre egal in welches Programm ich injecte und durch FindPattern bekomme ich immer die richtige Adresse zum hooken oO
das kann ich mir nicht vorstellen.
Genau das ist der Sinn der Sache.
icon #11

Join Date: Sep 2010

Posts: 38

Ich dachte das funktioniert nur bei einem Programm, um die Offsets zu updaten. Allerdings wird der Call der BeginScene Funktion überall recht gleich ablaufen. Ich werds mir mal genauer anschauen.
Edit: ich habe auf die Schnelle jetze keine tuts gefunden, hätte jemand eventuell eines ?
Ist der Call der Funktion denn nicht von Compiler zu Compiler unterschiedlich.

Edit, habe jetzt ein tut für autoit gefunden, habs soweit auch verstanden. Funktioniert soweit auch recht gut in cpp