Frage zu naked Funktion und WriteProcessMemory, help!
-
Tag'chen,
In groben Zügen versuche ich in einem fremden Process eine "CodeCave" zu erstellen um mir ein paar Informationen zugänglich zu machen. Sicher evtl. nicht gerade der Gentelman, aber im moment habe ich noch eine andere Methode finden können. Naja egal zurück zum Thema, ich habe mich an dieses Tutorial gehalten: http://www.codeproject.com/KB/cpp/codecave.aspx
mein Problem ist es jetzt: Wie schreibe ich jetzt den Funktionsaufruf in den Dump der fremden Anwendung. Klar mit WriteProcessMemory und das würde eigentlich auch wundrbar funktionieren, ich habe genau 5Bytes Platz://6F4973D1 8907 MOV DWORD PTR DS:[EDI ], EAX //6F4973D3 896F 04 MOV DWORD PTR DS:[EDI+4], EBPAn dieser Stelle will ich die CC einbetten, da ich den Registerinhalt von EAX, EBP und ECX brauche. Und das ganze wollte ich so anstellen:
void DetourIt( ) { //6F4973D1 8907 MOV DWORD PTR DS:[EDI ], EAX //6F4973D3 896F 04 MOV DWORD PTR DS:[EDI+4], EBP const DWORD dwStartAdd = 0x6F4973D1; const BYTE bCall = 0xE8; HANDLE hWar3Process = 0; if( !( GetWar3ProcessHandle( hProcess ) ) ) { MessageBox( 0, "Could not open process handle!", "Error!", MB_OK | MB_ICONERROR ); return; } DWORD pAdd = (DWORD)GetProcAddress( GetModuleHandle( "MyDLL.dll" ), "CodeCave" ); WriteProcessMemory( hWar3Process, (LPVOID)0x6F4973D1, (LPCVOID)&bCall, sizeof( BYTE ), 0 ); WriteProcessMemory( hWar3Process, (LPVOID)0x6F4973D2, (LPCVOID)&CodeCave, sizeof( (DWORD)CodeCave ), 0 ); }Meine naked Funktion:
__declspec(naked) void CodeCave( ) { _asm { pop g_dwReturnAddress MOV g_cunit.dwUnitID , ECX MOV g_cunit.xPos , EAX MOV g_cunit.yPos , EBP // ***** execute replaced code ***** MOV DWORD PTR DS:[EDI ], EAX MOV DWORD PTR DS:[EDI+4], EBP push g_dwReturnAddress ret } }Naja aber irgendwie raucht das ganze mit ner dicken Fehlermeldung ab, wenn die Stelle ausgeführt wird. Ich bin mir an der Stelle nicht sicher wie ich die naked Funktionsadresse in den Dump schreiben soll.
Hoffe ihr könnt mir da weiter helfen.Greetz Tobi
-
Ich glaube nicht das Blizzard das gerne sieht, wenn man in deren Prozesse reinfuhrwerkt. Davon abgesehen das es nicht einmal legal ist.
-
Wie kommst du darauf das ich nen Game von Blizzard reserve

Naja okay, ich hab jetzt den Fehler gefunden, es lag daran das ich die Sprungdistanz nicht berechnet hab:
DWORD dwJumpSize = ( (DWORD)CodeCave - ( dwStartAdd + 5 ) );Allerdings steh ich nun vor dem nächsten Problem, und zwar scheinen die Register nicht wirklich ausgelesen zu werden, wenn ich nämlich die inhalte meiner globalen Structur abfragen möchte( aus einem anderen prog, welches die dll injected hat ) erhlte ich keine Werte.
Ja ich habe die structur als Shared deklariert:#pragma data_seg( "Shared" ) CUNIT g_cunit; #pragma data_seg( ) #pragma comment( linker, "/SECTION:Shared,RWS" )Wer ne Idee?
-
Dein Edit ändert nichts an der Tatsache das du hier Beihilfe für etwas willst, was nicht legal ist.
-
Ich sehe hier nur jemand der wild behauptet er wolle eine Software von Blizzard manipulieren.
Also kein Aufruf ihm bei etwas eventuell(!) verbotenem zu helfen.Somit können ich und andere ihm ohne Probleme helfen.
P.S. In Deutschland ist die Gesetzeslage übrigens anders, hier wird ja noch nicht einmal ein Binary disassembliert, sondern zur Laufzeit in den Speicher einer anderen Anwendung geschrieben/gelesen, das ist in Deutschland definitiv nichs illegales.
Illegal wäre erst, wenn man dies nutzt um einen Rechtsverstoß zu begehen, beispielsweise TAN-Nummern aus einer Online-Banking Software auslesen und sich von dem Konto Geld abzuheben.
-
Okay ich sehe schon da stößt man in diesen Forum auf verschlossene Türen. Jedoch ohne das ich jetzt extra einen neuen Thread startet möchte habe ich eine frage die aufjedenfall NICHT illegal ist oder sonstiges.
Ich hab es geschaft die Registerinhalte auszulesen, so weit so gut... nur habe nun das Problem, dass ich dies Register in DWORD variablen einlesen musste, ansonsten würde ich immer Null erhalten. Ich brauche aber die Registerinhalte als float, gibts ne möglichkeit aus einem unsigned long ein float zu machen?
Ich habe hier so eien Converter der macht sowas, aber ich weiß nicht wie er es macht, ein Beispiel:unisgned long: 1120403456
als float: 100.00wenn ich das so versuche DWORD dwWord = 1120403456 -> float fFloat = (float)dwWord, wird es nichts. Wie macht er das sonst? Oder gibt es eine bessere möglichkeit den Registerinhalt gleich als float zu erhalten?
Greetz Tobi
-
Dann musst Du halt den Register Inhalt gemäss dem IEEE- irgendwas interpretieren.
Such mal den IEEE zu Float und Double und so weiter und so fort.
Simon
-
Was ist IEEE?
EDIT:
Ok ich weiß nun das IEEE 754 die Standartnorm für die Darstellung von Gleitkommazahlen auf Computern ist, aber wie ich ein unsigned long zu ein float umrechne habe ich dennoch nicht herraus gefunden. hm....EDIT2:
SOO wird gemacht:
DWORD dwVal = 1120403456;
FLOAT fValue = *(PFLOAT)&dwVal;Greetz Tobi
-
Ein schönerer Weg wäre: float float_val = reinterpret_cast< float >( dwVal );
Warum ging das Auslesen der Registerwerte denn nicht?
-
Fellhuhn schrieb:
Davon abgesehen das es nicht einmal legal ist.
bullshit.
-
Helferlein schrieb:
Ein schönerer Weg wäre: float float_val = reinterpret_cast< float >( dwVal );
Warum ging das Auslesen der Registerwerte denn nicht?
Wenn dwVal = 1120403456 und du so castest, folgt: 1120403456.000

Greetz
-
Also bei mir kompiliert dieser Cast gar nicht, was auch zu erwarten ist, da ein Umwandeln eines Floats in ein Integer mit static_cast geschieht und dann trifft dein Ergebnis auch zu.
Was man hier möchte ist ja einen Speicherbereich neu zu interpretieren, das geschieht über die Adresse auf diesen, d.h.
float float_val = *( reinterpret_cast< float* >( &int_val ) );Sieht natürlich nicht wirklich schön aus, ist aber durchaus beabsichtigt.
-
Hi!
Ich versuche auch grade, ein Register auszulesen.
Doch ich verstehe nicht, wie man den ASM Code in Laufzeit generieren soll?@T0bi hat geschrieben...
WriteProcessMemory( hWar3Process, (LPVOID)0x6F4973D2, (LPCVOID)&CodeCave, sizeof( (DWORD)CodeCave ), 0 );
Aber das geht doch so nicht, oder?
Wenn ich OllyDBG hernehme und eine ASM Line zu "CALL xxxxxxxx" ändere, ist von diesen xxxxxxxx im HEX- Code nix zu sehen.Wie funktioniert das alles?
