Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding
You last visited: Today at 18:17

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



D3D Hook WriteMem Problem

Discussion on D3D Hook WriteMem Problem within the General Coding forum part of the Coders Den category.

Reply
 
Old   #1
 
germanhacker's Avatar
 
elite*gold: 0
Join Date: May 2010
Posts: 84
Received Thanks: 13
Question D3D Hook WriteMem Problem

Hallo Epvp,

Hab ein problem bei der WriteMem Funktion, aus dem D3D Hooking Tutorial von purple.d1amond.

die Funktion sieht folgendermaßen aus:

Code:
void WriteMem(DWORD dwOffset, DWORD dwValue, int len)
{
unsigned long Protection;
VirtualProtect((void*)dwOffset, 1, PAGE_READWRITE, &Protection);
memcpy((void*)dwOffset, (const void*)dwValue, len);
VirtualProtect((void*)dwOffset, 1, Protection, 0);
}
Also hab die Adresse (0x14052F8C), die Offset(0x30) und die Value(1). Doch dort muss ich anscheinend keine Adresse einsetzten. Wie soll das ganze denn funktionieren o.O

wie das z.b. :

Code:
    unsigned long address2;
    unsigned long address1 = 0x14052F8C; 
    unsigned long offset = 0x30;
    int value = 1;
    ReadProcessMemory(hProc, (LPCVOID)address1, &address2, sizeof(long), &numBytesRead); 
    address2 = address2+offset ; 
    WriteProcessMemory(ProcessHandle,(LPVOID)address2,&value,sizeof(int),NULL);
??????
_________________________

Und was hat es mit dem "int len" auf sich ?
Welcher Wert soll dort zugewiesen werden ? :/

Ich hoffe, ihr könnt mir weiter helfen ...
germanhacker is offline  
Old 01/29/2011, 09:23   #2
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
Deine Frage könntest du dir selber beantworten, wenn du dir die Dokumentation zur memcpy() - Funktion betrachten würdest.

DWORD dwOffset ist die Speicheradresse, in der du den Wert kopieren willst, den du als zweiten Parameter angegeben hast. Der dritte Parameter gibt dabei an, wie viele Elemente kopiert werden sollen. Folgendes kleines Beispiel soll das erklären.

Value-Address-Range:
0x001: 50
0x002: 103
0x003: 56

Ziel-Adresse:
0x004: 0
0x005: 0
0x006: 0

Beispiel1: Rufst du dann WriteMem() folgendermaßen auf:
WriteMem( 0x001, 0x004, 2 );

enthält die Ziel-Adresse folgenden Inhalt:
0x004: 50
0x005: 103
0x006: 0

Beispiel2:
WriteMem( 0x001, 0x004, 3 );

führt zu:
0x004: 50
0x005: 103
0x006: 56

Beispiel3:
WriteMem( 0x001, 0x005, 1 );

führt zu:
0x004: 0
0x005: 50
0x006: 0
xNopex is offline  
Old 01/29/2011, 12:00   #3
 
germanhacker's Avatar
 
elite*gold: 0
Join Date: May 2010
Posts: 84
Received Thanks: 13
Ich hab das ganze jetzt so probiert:

Code:
void WriteMem(char* window, LPCVOID address, int value)
{
	HWND hWnd = FindWindow(0, window);
	DWORD proc_id; 
	GetWindowThreadProcessId(hWnd, &proc_id); 
	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proc_id); 
	BYTE newdata[]={value}; 
	DWORD newdatasize = sizeof(newdata); 
	WriteProcessMemory(hProcess, (LPVOID)address, &newdata, newdatasize, 0);
	CloseHandle(hProcess); 
}
Code:
if (godmode == true)
	{
		DWORD offset = 0x14;
		DWORD Base = (DWORD) GetModuleHandleA("server.dll"); 
        DWORD Address = (Base + 0x0037492C) + offset; 
		WriteMem("Left4Dead2", (LPCVOID)Address, 1 );
		DrawFont ( 10, 70, txtGreen, "            godmode" );
	}
	else
	{
		DWORD offset = 0x14;
		DWORD Base = (DWORD) GetModuleHandleA("server.dll"); 
        DWORD Address = (Base + 0x0037492C) + offset; 
		WriteMem("Left4Dead2", (LPCVOID)Address, 0 );
	    DrawFont ( 10, 70, txtRed, "            godmode" );
	}
Doch es funktioniert immer noch nicht ganz so wie ich will

Das wird wohl noch dauern bis ich des mir zurecht gebastelt habe


So wie du das oben erklärt hast heißt das also

WirteMem(Adresse1, Value von Adresse1 auf Adresse2 schreiben, wv Adressen beschrieben werden sollen)

d.h. es werden die values von einer adresse auf eine andere kopiert. Was ich aber möchte ist, dass die Value von einer Adresse (server.dll+0x0037492C) mit dem Offset(0x14) mit 1 überschrieben werden soll.
germanhacker is offline  
Old 01/29/2011, 12:30   #4
 
mydoom's Avatar
 
elite*gold: 0
Join Date: Dec 2007
Posts: 322
Received Thanks: 98
Ich gehe davon aus, dass es sich dabei um Code handelt, der via Dll in einen Prozess injiziert wird. Dann brauchst du OpenProcess(), FindWindow() und Co. nicht.
mydoom is offline  
Old 01/29/2011, 12:44   #5
 
xNopex's Avatar
 
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
Quote:
Was ich aber möchte ist, dass die Value von einer Adresse (server.dll+0x0037492C) mit dem Offset(0x14) mit 1 überschrieben werden soll.
Heute 09:23
Dann addiere auf die Adresse das Offset und übergebe die Summe an die Funktion :-/
Dir fehlt es an Grundlagenkenntnisse. Und falls du per Injektion arbeitest, dann nimm dir den Beitrag meines Vorredners zu Herzen und arbeite mit Zeigern. Um einiges schneller.
xNopex is offline  
Old 01/29/2011, 13:45   #6
 
germanhacker's Avatar
 
elite*gold: 0
Join Date: May 2010
Posts: 84
Received Thanks: 13
Quote:
Originally Posted by xNopex View Post
Dann addiere auf die Adresse das Offset und übergebe die Summe an die Funktion :-/
Code:
		DWORD offset = 0x14;
		DWORD Base = (DWORD) GetModuleHandleA("server.dll"); 
		DWORD Address = (Base + 0x0037492C) + offset; 
		WriteMem("Left4Dead2", (LPCVOID)Address, 1 );
Das hab ich gemacht. Lies sich auch Kompilieren, aber hat zuletzt ingame nicht funktioniert
germanhacker is offline  
Old 01/29/2011, 14:20   #7
 
mydoom's Avatar
 
elite*gold: 0
Join Date: Dec 2007
Posts: 322
Received Thanks: 98
mydoom is offline  
Old 01/29/2011, 14:24   #8


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Quote:
BYTE newdata[]={value};
Au au au, das sollte eigentlich einen Compiler-Fehler geben, du willst du eine Variable vom Typ int (4Bytes groß) in eine Variable vom Typ Byte (1 Byte groß) verschieben, das kannst du natürlich nicht einfach machen.
Ich frage mich sowieso, was das mit dem BYTE Array soll.

Gib es doch direkt so an:

Code:
WriteProcessMemory(hProcess, (LPVOID)address, &value, sizeof(int), 0);
MrSm!th is offline  
Thanks
1 User
Old 01/29/2011, 15:04   #9
 
germanhacker's Avatar
 
elite*gold: 0
Join Date: May 2010
Posts: 84
Received Thanks: 13
Quote:
Originally Posted by MrSm!th View Post
Au au au, das sollte eigentlich einen Compiler-Fehler geben, du willst du eine Variable vom Typ int (4Bytes groß) in eine Variable vom Typ Byte (1 Byte groß) verschieben, das kannst du natürlich nicht einfach machen.
Ich frage mich sowieso, was das mit dem BYTE Array soll.

Gib es doch direkt so an:

Code:
WriteProcessMemory(hProcess, (LPVOID)address, &value, sizeof(int), 0);
Also ich habs jetzt so gemacht...

Code:
		HWND hWnd = FindWindow(0, "Left4Dead2");
		DWORD proccess_ID;
		GetWindowThreadProcessId(hWnd, &proccess_ID);
		HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, proccess_ID);
		DWORD offset = 0x14;
		DWORD Base = (DWORD) GetModuleHandleA("Server.dll") + 0x0037492C;
		DWORD Address = Base + offset; 
		int value = 1;
		WriteProcessMemory(hProcess, (LPVOID)Address, &value, sizeof(int), 0);
Jetzt gibts keinen Absturz mehr, funktioniert aber trotzdem noch nicht. Wie würde das ganze ohne OpenProcess(), FindWindow() und CO aussehen ?
germanhacker is offline  
Old 01/29/2011, 15:45   #10


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Ist das eine Dll oder eine externe Anwendung?
MrSm!th is offline  
Old 01/29/2011, 19:25   #11
 
germanhacker's Avatar
 
elite*gold: 0
Join Date: May 2010
Posts: 84
Received Thanks: 13
Das ist eine Dll, d.h. Findwindow und so brauch ich nicht. Aber weiß leider nicht wies sonst aussehn soll x)
germanhacker is offline  
Old 01/29/2011, 20:11   #12


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
memcpy
MrSm!th is offline  
Old 01/29/2011, 20:15   #13
 
germanhacker's Avatar
 
elite*gold: 0
Join Date: May 2010
Posts: 84
Received Thanks: 13
meinste das hier ?

Code:
void WriteMem(DWORD dwOffset, DWORD dwValue, int len)
{
unsigned long Protection;
VirtualProtect((void*)dwOffset, 1, PAGE_READWRITE, &Protection);
memcpy((void*)dwOffset, (const void*)dwValue, len);
VirtualProtect((void*)dwOffset, 1, Protection, 0);
}
Wenn ja erklär mal, wurd mir schon erklärt, verstehs aber trotzdem nit :S


DWORD offset = 0x14;
DWORD Base = (DWORD) GetModuleHandleA("server.dll") + 0x0037492C;
DWORD Address = Base + offset;

also "Address" ist jetzt meine Adresse.

int value = 0;

"value" meine value

ja und wie soll das aussehn. so vllt ?

WriteMem(Address, 1, "und kp was hier hin soll^^")
germanhacker is offline  
Old 01/29/2011, 20:53   #14


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Die Funktion ist vollkommen bescheuert, kein Wunder, dass das in nem Crash endet:

Du brauchst übrigens generell keine Funktionen, wenn du in den Speicher des Prozesses schreiben willst, in dem sich die DLL schon befindet, da nutzt man einfach Pointer.
Nur kann es auch mal sein, dass eben die Code Section, das ist der Teil im Programm, in dem die ausführbaren Daten sind und damit auch die EndScene, welche ja für einen D3D Hook gehookt wird, keinen Schreibzugriff erlaubt und eigentlich nur deshalb sind da die Aufrufe von VirtualProtect.

Um übrigens auf deine Frage im ersten Post zu kommen: Die Namen der Parameter sind doch scheiß egal, mit dwOffset ist in dem Fall die Adresse gemeint!

Hier mal ne bessere Version der Funktion:
Code:
void WriteMem(void *Adresse, void *Quelle, int len)
{
unsigned long Protection;
VirtualProtect(Adresse, len, PAGE_READWRITE, &Protection);   //hier stand vorher statt len 1, das ist natürlich Quatsch, da nicht nur das erste Byte auf schreibzugriff gestellt werden muss!
memcpy(Adresse, Quelle, len);
VirtualProtect(Adresse, len, Protection, 0); //hier genauso
}
Und, falls du unbedingt eine Funktion haben möchtest, die den Speicher auf nen gewissen Wert setzt:

Code:
void WriteMem(void *Adresse, int Wert, int len)
{
unsigned long Protection;
VirtualProtect(Adresse, len, PAGE_READWRITE, &Protection);
memset(Adresse, Wert, len);
VirtualProtect(Adresse, len, Protection, 0);
}

Ein kleiner Tipp: du solltest die Sprache vielleicht erstmal richtig lernen.
MrSm!th is offline  
Old 01/29/2011, 21:32   #15
 
germanhacker's Avatar
 
elite*gold: 0
Join Date: May 2010
Posts: 84
Received Thanks: 13
Quote:
Originally Posted by MrSm!th View Post
Die Funktion ist vollkommen bescheuert, kein Wunder, dass das in nem Crash endet:

Du brauchst übrigens generell keine Funktionen, wenn du in den Speicher des Prozesses schreiben willst, in dem sich die DLL schon befindet, da nutzt man einfach Pointer.
Nur kann es auch mal sein, dass eben die Code Section, das ist der Teil im Programm, in dem die ausführbaren Daten sind und damit auch die EndScene, welche ja für einen D3D Hook gehookt wird, keinen Schreibzugriff erlaubt und eigentlich nur deshalb sind da die Aufrufe von VirtualProtect.

Um übrigens auf deine Frage im ersten Post zu kommen: Die Namen der Parameter sind doch scheiß egal, mit dwOffset ist in dem Fall die Adresse gemeint!

Hier mal ne bessere Version der Funktion:
Code:
void WriteMem(void *Adresse, void *Quelle, int len)
{
unsigned long Protection;
VirtualProtect(Adresse, len, PAGE_READWRITE, &Protection);   //hier stand vorher statt len 1, das ist natürlich Quatsch, da nicht nur das erste Byte auf schreibzugriff gestellt werden muss!
memcpy(Adresse, Quelle, len);
VirtualProtect(Adresse, len, Protection, 0); //hier genauso
}
Und, falls du unbedingt eine Funktion haben möchtest, die den Speicher auf nen gewissen Wert setzt:

Code:
void WriteMem(void *Adresse, int Wert, int len)
{
unsigned long Protection;
VirtualProtect(Adresse, len, PAGE_READWRITE, &Protection);
memset(Adresse, Wert, len);
VirtualProtect(Adresse, len, Protection, 0);
}

Ein kleiner Tipp: du solltest die Sprache vielleicht erstmal richtig lernen.
Danke, für deine Hilfe, dennoch funktioniert das ganze noch nicht so, wie ich es möchte.

Ich hab die obrige Funktion einwenig umgeändert. Da meine Adressen in DWORD geschrieben sind.

Code:
void WriteMem(DWORD dwAdresse, int Wert, int len)
{
unsigned long Protection;
VirtualProtect((void*)dwAdresse, len, PAGE_READWRITE, &Protection);
memset((void*)dwAdresse, Wert, len);
VirtualProtect((void*)dwAdresse, len, Protection, 0);
}
Jetzt wollte ich das ganze anwenden also ...

Code:
	if (godmode == true)
	{
		DWORD offset = 0x14;
		DWORD Base = (DWORD) GetModuleHandleA("server.dll") + 0x0037492C;
		DWORD Address = Base + offset; 
		WriteMem(Address, 1, 0);
        //DrawFont ( 10, 70, txtGreen, "            godmode" );
	}
	else
	{
		DWORD offset = 0x14;
		DWORD Base = (DWORD) GetModuleHandleA("server.dll") + 0x0037492C;
		DWORD Address = Base + offset; 
		WriteMem(Address, 0, 0);
	    //DrawFont ( 10, 70, txtRed, "            godmode" );
	}
	if(GetAsyncKeyState(VK_NUMPAD1) &1) // Öffnen mit NUMPAD1
	{
		godmode = !godmode;
	}
Bei "len" hab ich erstmal 0 eingesetzt, da bei 1 oder anderen Werten das Spiel abkrazt.
Für dwAdresse habe ich meine fertige Adresse verwendet und bei "Wert" meinen Wert "1" eingetragen.
Wenn ich dann ingame über numpad1 das ganze einschalten möchte, bekomme ich trotzdem noch schaden. Dann hab ich über cheat engine nachgeschaut, ob die Adresse sich auf 1 gesetzt hat. Diese war allerdings immer noch auf 0...


Quote:
Ein kleiner Tipp: du solltest die Sprache vielleicht erstmal richtig lernen.
Du hast recht ich hab nach den wichtigsten basics schon aufgehört, aber es war so interessant mit D3D Hooking anzufangen.

Aber ich wusste auch nicht, dass es so schwer ist eine Value einer bestimmten Adresse zu ändern. :S
germanhacker is offline  
Reply


Similar Threads Similar Threads
[C++]Hook all Recv function Problem
08/21/2010 - C/C++ - 5 Replies
Hi Leute wenn ich send hooke egal welches läuft das alles super nur wenn ich irgendein recv hooke habe ich immer eine Packet size von 1000 bis 10000. sry das ich schon wieder nerve #include "WinSock2.h" #include <cstdio> #include <ctime> #include <fstream> #include <iomanip>
Urban WR D3D Hook PROBLEM!!
06/01/2010 - WarRock - 11 Replies
Hi, Bei dem Urban WR D3D Hook Hack ( http://www.elitepvpers.com/forum/warrock-hacks-bots -cheats-exploits/589000-warrock-urban-wr-d3d-hook- undetected-30-05-2010-a.html ) habe ich ein Problem. Ich habe alles entpackt und extrahiert aber wenn ich den Injector öffne steht da " Auf das angegebene Gerät , bzw. den Pfad oder die Datei kann nicht zugegriffen werden. Sie verfügen eventuell nicht über ausreichende Berechtigungen, um auf das Element zugreifen zu können" !!!! Ich bin aber Administrator...
[C++]D3D hook Problem
11/09/2009 - C/C++ - 28 Replies
#pragma once #pragma comment(lib, "d3d9.lib") #pragma comment(lib, "d3dx9.lib") #include <windows.h> #include <cstdio> #include <d3d9.h> #include <d3dx9.h> LPDIRECT3DDEVICE9 pDevice; const D3DCOLOR txtPink = D3DCOLOR_ARGB(255, 255, 0, 255); // Alpha, Rot, Grün, Blau
C++ hook Problem
10/19/2009 - C/C++ - 15 Replies
Also ich habe mir einen Keyboardhook geschrieben und habe das programm gestartet und es wieder beendet ohne den hook unzuhooken und nun geht meine tastatur nicht mehr (auch im bios nicht mehr) tja ich denke ,dass der hook immernoch läuft und ich bräuchte so eine art hook manager . Oder einfach ein stückcode,das mir alles unhooked . mein code : void MsgLoop() { MSG message;
BiG problem With hook edx33
07/28/2009 - Silkroad Online - 8 Replies
I hook edx33 and now 80 % of my programs no start :rtfm: and too unhook don't start im into 64X bit vista windows pls fast reply how to fix them



All times are GMT +1. The time now is 18:17.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.