Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 21:42

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

Advertisement



Endscene Hook Problem

Discussion on Endscene Hook Problem within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
TheAldi's Avatar
 
elite*gold: 21
Join Date: Jan 2010
Posts: 1,904
Received Thanks: 462
Endscene Hook Problem

Mein Problem ist , dass das Programm sofort abstürzt wenn ich die Endscene hooke.
Bezogen von diesem TuT :

Es muss aber aufjedenfall an meiner eigenen Endscene liegen , denn wenn ich die gefundene Endscene auf sich selbst leite , entsteht eine endlosschleife

Meine eigene Endscene wird nur einmal aufgerufen und dann stürzt das Programm ab (Getestet mit 5 verschiedenen DirectX Testprogrammen)

Code:
#define _CRT_SECURE_NO_WARNINGS 
#include <Windows.h> 
#include <cstdio> 
#include <time.h> 
#include <d3d9.h> 
#include <d3dx9.h>

const D3DCOLOR txtGreen = D3DCOLOR_ARGB(255,0,255,0);
HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice);

typedef HRESULT(__stdcall* EndScene_t)(LPDIRECT3DDEVICE9); 
EndScene_t pEndScene; 

DWORD WINAPI HookThread(); 
void add_log(char* format, ...);
void* DetourFunc(PBYTE src, const PBYTE dst, const int len);
bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask);
DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask);

HMODULE hModD3D9 = NULL;
FARPROC dwEndScene = NULL;
HANDLE tmpHandle = NULL;
DWORD* VTableStart = NULL;
DWORD tempadd = NULL;

BOOL WINAPI DllMain(HINSTANCE hinstDll,DWORD Reason,LPVOID Reserved)
{ 
	switch(Reason)
	{
	case DLL_PROCESS_ATTACH:
		tmpHandle = CreateThread(0,0,(LPTHREAD_START_ROUTINE)&HookThread,0,0,0);
		break;
	case DLL_PROCESS_DETACH:
		break;
	}
	return 1;
}

DWORD WINAPI HookThread(void)
{
	while(!hModD3D9)
	{
		hModD3D9 = GetModuleHandle(L"d3d9.dll");
		Sleep(100);
	}
tempadd = dwFindPattern((DWORD)hModD3D9, 0x128000, (PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx");
VTableStart = (DWORD*) *(DWORD*)(tempadd+2);
dwEndScene = (FARPROC)VTableStart[42];
pEndScene = (EndScene_t) DetourFunc((PBYTE) dwEndScene, (PBYTE)hkEndScene, 5);
while (true)
{
	Sleep(500);
}
return 0;
}
void* DetourFunc(PBYTE src, const PBYTE dst, const int len)
{
	DWORD dwback;
	BYTE* jmp = (BYTE*)malloc(len+5);
	VirtualProtect(jmp, len+5, PAGE_EXECUTE_READWRITE, &dwback);
	VirtualProtect(src, len, PAGE_READWRITE, &dwback);
	memcpy(jmp, src, len);
	jmp += len;
	jmp[0] = 0xE9;
	*(DWORD*)(jmp+1) = (DWORD)(src + len - jmp) - 5;
	src[0] = 0xE9;
	*(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
	VirtualProtect(src, len, dwback, &dwback);
	return (jmp - len);
}
bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask) 
{ 
	for(;*szMask;++szMask,++pData,++bMask)
	{ 
		if(*szMask=='x' && *pData!=*bMask ) { return false; }
	} 
	return (*szMask) == NULL; 
}
DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
{ 
	for(DWORD i=0; i < dwLen; i++)
	{ 
		if( bDataCompare( (BYTE*)( dwAddress+i ),bMask,szMask) ) {return (DWORD)(dwAddress+i); }
	} 
	return 0; 
}
HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice) 
{ 
Beep(750,300);
	return pEndScene(pDevice); 
}
TheAldi is offline  
Old 05/09/2013, 16:46   #2
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
komisch, in welchem spiel denn?

solltest vllt aus:
Code:
VirtualProtect(src, len, PAGE_READWRITE, &dwback);
das hier:
Code:
VirtualProtect(src, len, PAGE_EXECUTE_READWRITE, &dwback);
machen.

gerade bei mir im ms dx9 sampleprogramm MultiAnimation ausprobiert, funktioniert einwandfrei.
vllt solltest du aber nicht Beep in endscene benutzen, die funktion hängt nämlich, vllt hat das spiel probleme damit.
Dr. Coxxy is offline  
Old 05/09/2013, 16:51   #3
 
TheAldi's Avatar
 
elite*gold: 21
Join Date: Jan 2010
Posts: 1,904
Received Thanks: 462
Habs auf "PAGE_EXECUTE_READWRITE" gesetzt aber trotzdem gleicher Fehler
Ich versuchs auch im MS Sampleprogramm aber das stürzt sofort ab

Das Beep war nur zum testen drinne ob der überhaupt in die gehookte Funktion geht


Evtl liegts daran , dass ich Win8 x64 nutze
TheAldi is offline  
Old 05/09/2013, 16:56   #4
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
Quote:
Originally Posted by TheAldi View Post
Habs auf "PAGE_EXECUTE_READWRITE" gesetzt aber trotzdem gleicher Fehler
Ich versuchs auch im MS Sampleprogramm aber das stürzt sofort ab

Das Beep war nur zum testen drinne ob der überhaupt in die gehookte Funktion geht


Evtl liegts daran , dass ich Win8 x64 nutze
hmm gute frage.
hab leider kein windoof 8 zum testen, kompilierst du als 32 bit und im release modus?
injector als admin gestartet, die release dll ausgewählt und zielprozess auch 32 bit programm?
Dr. Coxxy is offline  
Old 05/09/2013, 17:02   #5
 
TheAldi's Avatar
 
elite*gold: 21
Join Date: Jan 2010
Posts: 1,904
Received Thanks: 462
DLL : Find ich grad keine Option zum einstellen der ZielCPU
Realese Mode : Nein
Admin : *** alles als Admin
Ziel : 32Bit DirectX Sample (im 64Bit Sample wird nichts ausgelöst mit der DLL auch kein Absturz bzw. veränderung wenn ich ein Rechteck zeichnen lasse)

Edit:
Aber unterschied machts nich zwischen Debug/Release Mode stürzen beide ab ^^
TheAldi is offline  
Old 05/09/2013, 17:44   #6
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
Quote:
Originally Posted by TheAldi View Post
DLL : Find ich grad keine Option zum einstellen der ZielCPU
Realese Mode : Nein
Admin : *** alles als Admin
Ziel : 32Bit DirectX Sample (im 64Bit Sample wird nichts ausgelöst mit der DLL auch kein Absturz bzw. veränderung wenn ich ein Rechteck zeichnen lasse)

Edit:
Aber unterschied machts nich zwischen Debug/Release Mode stürzen beide ab ^^
dann mal debugger nehmen und gucken wo/was schiefgeht :P
Dr. Coxxy is offline  
Old 05/09/2013, 17:59   #7
 
TheAldi's Avatar
 
elite*gold: 21
Join Date: Jan 2010
Posts: 1,904
Received Thanks: 462
Laut Olly :

"Access violation when writing to [Address]"

Ist doch richtig wenn ich Olly an die exe hänge und dann injecte oder ?

Edit: Fehler laut Olly nach Häufigkeit (immer gleiche Bedingungen)
1. "Access violation when writing to [Address]"
2. "Access violation when reading [Address]"
3. Iwas mit Priveligiert (erst einmal aufgetreten)
TheAldi is offline  
Old 05/09/2013, 19:00   #8
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
lad mal deine kompilierte dll hoch.
kannst auch mal konsole attachen und mit cout/printf mal adressen ausgeben lassen von endscene etc., auf nen tastendruck warten und erst danach hooken.
in der zwischenzeit kannst du olly/cheatengine attachen, auf endscene nen breakpoint machen und gucken ob dein hook korrekt installiert wird, also ersten 5 bytes mit nem e9 <adresse> überschrieben werden, ob evtl. schon vorher ein hook/relative adresse an der adresse stand, ob der jump zu deiner funktion führt, ob deine funktion korrekt das trampolin callt, ob im trampolin die 5 bytes aus der origfunktion sind, ob die 5 bytes ein sinnvoller befehl ohne relative adresse ist, etc.
Dr. Coxxy is offline  
Old 05/09/2013, 19:26   #9
 
TheAldi's Avatar
 
elite*gold: 21
Join Date: Jan 2010
Posts: 1,904
Received Thanks: 462
OK meld mich dann morgen wieder sobald ich dazu zeit gefunden habe ^^

DLL :

Source der DLL:
Code:
#define _CRT_SECURE_NO_WARNINGS 
#include <Windows.h> 
#include <cstdio> 
#include <time.h> 
#include <d3d9.h> 
#include <d3dx9.h>

const D3DCOLOR txtGreen = D3DCOLOR_ARGB(255,0,255,0);
HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice);

typedef HRESULT(__stdcall* EndScene_t)(LPDIRECT3DDEVICE9); 
EndScene_t pEndScene; 

DWORD WINAPI HookThread(); 
void add_log(char* format, ...);
void* DetourFunc(PBYTE src, const PBYTE dst, const int len);
bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask);
DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask);

HMODULE hModD3D9 = NULL;
FARPROC dwEndScene = NULL;
HANDLE tmpHandle = NULL;
DWORD* VTableStart = NULL;
DWORD tempadd = NULL;

BOOL WINAPI DllMain(HINSTANCE hinstDll,DWORD Reason,LPVOID Reserved)
{ 
	switch(Reason)
	{
	case DLL_PROCESS_ATTACH:
		tmpHandle = CreateThread(0,0,(LPTHREAD_START_ROUTINE)&HookThread,0,0,0);
		break;
	case DLL_PROCESS_DETACH:
		break;
	}
	return 1;
}

DWORD WINAPI HookThread(void)
{
	while(!hModD3D9)
	{
		hModD3D9 = GetModuleHandle(L"d3d9.dll");
		Sleep(100);
	}
tempadd = dwFindPattern((DWORD)hModD3D9, 0x128000, (PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86", "xx????xx????xx");
VTableStart = (DWORD*) *(DWORD*)(tempadd+2);
dwEndScene = (FARPROC)VTableStart[42];
pEndScene = (EndScene_t) DetourFunc((PBYTE) dwEndScene, (PBYTE)hkEndScene, 5);
while (true)
{
	Sleep(500);
}
return 0;
}
void* DetourFunc(PBYTE src, const PBYTE dst, const int len)
{
	DWORD dwback;
	BYTE* jmp = (BYTE*)malloc(len+5);
	VirtualProtect(jmp, len+5, PAGE_EXECUTE_READWRITE, &dwback);
	VirtualProtect(src, len, PAGE_EXECUTE_READWRITE, &dwback);
	memcpy(jmp, src, len);
	jmp += len;
	jmp[0] = 0xE9;
	*(DWORD*)(jmp+1) = (DWORD)(src + len - jmp) - 5;
	src[0] = 0xE9;
	*(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
	VirtualProtect(src, len, dwback, &dwback);
	return (jmp - len);
}
bool bDataCompare(const BYTE* pData, const BYTE* bMask, const char* szMask) 
{ 
	for(;*szMask;++szMask,++pData,++bMask)
	{ 
		if(*szMask=='x' && *pData!=*bMask ) { return false; }
	} 
	return (*szMask) == NULL; 
}
DWORD dwFindPattern(DWORD dwAddress,DWORD dwLen,BYTE *bMask,char * szMask)
{ 
	for(DWORD i=0; i < dwLen; i++)
	{ 
		if( bDataCompare( (BYTE*)( dwAddress+i ),bMask,szMask) ) {return (DWORD)(dwAddress+i); }
	} 
	return 0; 
}
HRESULT __stdcall hkEndScene(LPDIRECT3DDEVICE9 pDevice) 
{
	D3DRECT rect = {10,10,110,110};
	pDevice->Clear(1,&rect,D3DCLEAR_TARGET,txtGreen,0,0);
	return pEndScene(pDevice); 
}
TheAldi is offline  
Old 05/09/2013, 19:56   #10
 
Master674b's Avatar
 
elite*gold: 0
Join Date: Dec 2012
Posts: 255
Received Thanks: 110
Als erstes würde ich vorschlagen mit etwas leichterem anzufangen. Du hast da einen wahnsinnig schlechten Aufbau und Stil auch wenns nur die paar Zeilen sind.

Danach auf jeden Fall von der Detours Funktion verabschieden und am besten eine eigene machen (ansonsten tuts auch MS Detours 3.0 - threadsicher).

Falls du eine eigene Detours Funktion machen möchtest brauchst du erst mal einen Längendisassembler damit du dein Trampolin zum Rücksprung richtig aufsetzen kannst. Für das Trampolin empfiehlt sich HeapAlloc auf einem Heap der mit HEAP_CREATE_ENABLE_EXECUTE erstellt wurde.

Um das ganze noch Threadsicher zu machen kannst du dann noch alle Threads suspendieren und mal schauen ob gerade einer über der Instruktion verweilt, auf die du deinen Detour setzen willst. Mache das momentan so:

Code:
const auto &lstThreads = threadGrabber.threads();
std::list<std::shared_ptr<Thread>> lstCriticalThreads;
_detourSuspendThreads(lstThreads);

do {
	lstCriticalThreads = _threadExecutingInstruction(lstThreads, dwAddress, uSize);
	for (const auto& thread: lstCriticalThreads) {
		if (thread->open(thread->access() | THREAD_SUSPEND_RESUME)) {
			thread->resume();
			Sleep(rand() % 10); // give him some time to move along... :D
			thread->suspend();
		}
	}
}
while (!lstCriticalThreads.empty());

ByteBuffer jump(uSize, 0xCC);
jump << byte(0xE9);
jump << reinterpret_cast<DWORD_PTR>(pRedirect) - (dwAddress + 5);

WriteMemory_Safe(dwAddress, jump);
_detourResumeThreads(lstThreads);
Um rauszufinden, wo ein Thread gerade ist kannst du EIP (Extended Instruction Pointer) auslesen.

Code:
std::list<std::shared_ptr<Thread>> SharkMemory::_threadExecutingInstruction(
						const std::list<std::shared_ptr<Thread>> &threads,
						DWORD_PTR dwAddress, DWORD_PTR dwLength) const {
	uint32 curThreadId = GetCurrentThreadId();
	std::list<std::shared_ptr<Thread>> lstThreads;
	for (const auto& thread: threads) {
		if (thread->id() != curThreadId &&
			thread->open(thread->access() | THREAD_GET_CONTEXT)) {
			CONTEXT ctx = {0};
			if (GetThreadContext(thread->handle(), &ctx) == FALSE)
				continue;

			if (ctx.Eip >= dwAddress && ctx.Eip < dwAddress + dwLength)
				lstThreads.push_back(thread);
		}
	}

	return lstThreads;
}
Master674b is offline  
Old 05/10/2013, 00:57   #11




 
Omdi's Avatar
 
elite*gold: 93616
Join Date: Apr 2010
Posts: 13,737
Received Thanks: 14,990
Die DLL funktioniert wunderbar bei mir ;o

Windows 7 64 Bit
Omdi is offline  
Old 05/10/2013, 09:49   #12
 
TheAldi's Avatar
 
elite*gold: 21
Join Date: Jan 2010
Posts: 1,904
Received Thanks: 462
Ok scheint also wirklich iwie an win 8 zu liegen :/

Ich lad mir Grad mal win xp aus der msdnaa runter und Haus mal in ne vm

Aber naja 250kb/s Download dauert
TheAldi is offline  
Old 05/10/2013, 14:24   #13
 
Master674b's Avatar
 
elite*gold: 0
Join Date: Dec 2012
Posts: 255
Received Thanks: 110
Quote:
Originally Posted by TheAldi View Post
Ok scheint also wirklich iwie an win 8 zu liegen :/

Ich lad mir Grad mal win xp aus der msdnaa runter und Haus mal in ne vm

Aber naja 250kb/s Download dauert
Das es dabei zu Fehlern kommt wundert dich noch?! Du solltest dir besser mal meinen Post durchlesen, dann klappts auch.
Master674b is offline  
Old 05/10/2013, 15:24   #14
 
TheAldi's Avatar
 
elite*gold: 21
Join Date: Jan 2010
Posts: 1,904
Received Thanks: 462
Hab deinen Beitrag schon wahrgenommen war ich noch nicht wirklich am pc ums mir genau anzuschauen

Handy formatiert das So unschön

Edit 11.05.2013 - 15:30 :
Nun läufts
Danke an alle Beteiligten

TheAldi is offline  
Old 05/17/2013, 15:51   #15


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
Arrow General Coding -> C/C++

#moved
MrSm!th is offline  
Reply


Similar Threads Similar Threads
Selling - VMT Hook + Includded HS ByPass + for DIP - EndScene - Etc Etc
05/07/2012 - WarRock Hacks, Bots, Cheats & Exploits - 10 Replies
VMT Hooks + HS BYPASS Working To Any OS Windows XP,Vista/Windows7 32/64 BIT Selling Full Way Undetected with VMT Hook , for hooking EndScene/Present/DIP/SetTransformer On VMT Hook is Includded HS BYPASS For hackshield , with that they wont detect VMT Hooks + Also is includded another addy for didnt detect STRING of your dll or detecting your dll after some day !! also you can use packer to protect your dll because with this address they wont detect packer/string/dll/ or if they do...
D3D EndScene Hook Tutorial Frage
10/03/2011 - General Coding - 5 Replies
Hey, ich habe mir das Tutorial von purple.d1amond angeschaut, und habe als Test ( da ich noch nie ne D3D Funktion gehooked habe ) mal den Source aus dem Tut abgetippt und wollte ihn testen. Ich habe die .dll anschließend mit Winject in den Prozess von wow injected. Doch es passiert nichts, da wo eigentlich ein Rechteck sein sollte ( oben Rechts ) ist nichts :D ) Habe ich was falsch gemacht ? : #include "stdafx.h" #include <windows.h> #include <cstdio> #include <d3d9.h> #include...
[C++]EndScene hook
01/04/2011 - C/C++ - 7 Replies
Hallo Community, ich habe ein Problem mit dem Thema 'EndScene' hooking. Ich habe eine DLL geschrieben (Source unten). Wenn ich diese in z.b. Css injecte um zu gucken ob bis jetzt alles richtig ist, sprich ob das game crasht oder nicht. Jedoch sagt Winject beim injecten der DLL "Both injection methods failed, target is protectet?". Wenn ich jedoch eine DLL injecte, die einfach nur ne MSGBOX ausgibt, klappt es wunderbar. Nun ist meine Frage, liegt der Fehler im Source meiner DLL oder ist...
D3D Hook Frage (Endscene)
10/18/2010 - General Coding - 9 Replies
Hallo, Hab mir mal ein Tutorial zu dem Thema angeschaut. Scheint alles relativ einfach zu sein. Allerdings finde ich in meiner D3D9.dll kein Endscene usw. Ich bin scheinbar nicht der einzige mit dem Problem? :confused: Zumindest wenn ich mir das Forum anschau woher das Tutorial kommt. Aber dort kennt scheinbar auch niemand eine Lösung. Woran liegt das? Oder hat mir jemand ein paar neuere Tutorials zu dem Thema? (Gerne auch englisch). Grüße.



All times are GMT +2. The time now is 21:42.


Powered by vBulletin®
Copyright ©2000 - 2024, 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 ©2024 elitepvpers All Rights Reserved.