|
You last visited: Today at 04:21
Advertisement
NtProtectVirtualMemory hook problem
Discussion on NtProtectVirtualMemory hook problem within the General Coding forum part of the Coders Den category.
06/15/2012, 12:26
|
#1
|
elite*gold: 0
Join Date: Jun 2008
Posts: 451
Received Thanks: 410
|
NtProtectVirtualMemory hook problem
Hey,
ich versuche gerade "NtProtectVirtualMemory" zu hooken und stoße auf ein ungewöhnliches Problem.
Wieso führt das zum Crash?
Code:
NTSTATUS NTAPI hkNtProtectVirtualMemory(HANDLE ProcessHandle, PVOID BaseAddr, PULONG NumberBytes, ULONG NewAccessProt, PULONG OldAccessProt)
{
return oNtProtectVirtualMemory(ProcessHandle, BaseAddr, NumberBytes, NewAccessProt, OldAccessProt);
}
und das nicht.
Code:
NTSTATUS NTAPI hkNtProtectVirtualMemory(HANDLE ProcessHandle, PVOID BaseAddr, PULONG NumberBytes, ULONG NewAccessProt, PULONG OldAccessProt)
{
return 0;
}
Ich mache ja eig. nicht besonderes ausser nen normalen hook durchzuführen.
mfg Lazeboy
|
|
|
06/15/2012, 12:48
|
#2
|
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
|
weil das programm dann ne protection durchführt, sich z.b. schreibrechte holt und dann beim darauffolgenden schreiben failt, da er in wirklichkeit keine rechte hat?
muss ja net unbedingt das return 0 auswerten, oder entscheidet sich für nen exit(0) bei nem fehler :P
|
|
|
06/15/2012, 13:00
|
#3
|
elite*gold: 0
Join Date: Jun 2008
Posts: 451
Received Thanks: 410
|
was kann ich denn tun um das zu hooken ich will ja die Funktion normal ausführen lassen und nicht irgendwelche status werte zurückgeben.
|
|
|
06/15/2012, 13:08
|
#4
|
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
|
ups hab mich verlesen...
dachte das obere würde funtzen und das untere nicht - und nicht umgekehrt :P
zeig mal wie du hookst, aber eigtl komisch.
EDIT:
wahrscheinlich erstellste dein trampolin nicht richtig, oder aufm trampolin sind keine execute rechte.
|
|
|
06/15/2012, 13:21
|
#5
|
elite*gold: 0
Join Date: Jun 2008
Posts: 451
Received Thanks: 410
|
Code:
typedef NTSTATUS (NTAPI* pNtProtectVirtualMemory)(HANDLE, PVOID, PULONG, ULONG, PULONG);
pNtProtectVirtualMemory oNtProtectVirtualMemory = NULL;
Detour Func
Code:
void *DetourFunc(BYTE *src, const BYTE *dst, const int len) // credits to gamedeception
{
BYTE *jmp = (BYTE*)malloc(len+5);
DWORD 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);
}
Code:
HMODULE ntdllMod = GetModuleHandle("ntdll.dll");
DWORD NtProtectVirtualMemoryAddr = (DWORD)GetProcAddress(ntdllMod, "NtProtectVirtualMemory");
if(NtProtectVirtualMemoryAddr!= 0)
{
oNtProtectVirtualMemory= (pNtProtectVirtualMemory)DetourFunc((PBYTE)NtProtectVirtualMemoryAddr, (PBYTE)&hkNtProtectVirtualMemory, 5);
}
joa und dann noch die neue Funktionen
Code:
NTSTATUS NTAPI hkNtProtectVirtualMemory(HANDLE ProcessHandle, PVOID BaseAddr, PULONG NumberBytes, ULONG NewAccessProt, PULONG OldAccessProt)
{
return oNtProtectVirtualMemory(ProcessHandle, BaseAddr, NumberBytes, NewAccessProt, OldAccessProt);
}
|
|
|
06/15/2012, 13:24
|
#6
|
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
|
jop, dein trampolin hat keine execute rechte, entweder du (Data Execution Prevention) von windoof, oder du benutzst z.b. die funktion hier:
Code:
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;
for (int i = 5; i < len; i++)
{
src[i] = 0x90;
}
VirtualProtect(src, len, dwback, &dwback);
return (jmp - len);
}
|
|
|
06/15/2012, 13:31
|
#7
|
elite*gold: 0
Join Date: Jun 2008
Posts: 451
Received Thanks: 410
|
ich bedanke mich
EDIT: crasht aber leider immer noch sowohl bei der neuen detour func und beim ausschalten von DEP bei windows
|
|
|
06/15/2012, 13:49
|
#8
|
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
|
dann mach dep mal wieder an, gibts nicht ohne grund.
sehe jetzt so keinen fehler mehr, vllt hast du mit den parametern mist gebaut, oder in der funktion sind am anfang keine 5 bytes frei/genau am ende von nem asm befehl, musst du mal mitm debugger rübergucken.
oder benutz die microsoft detour lib, die achtet auf sowas eigtl.
|
|
|
06/15/2012, 14:23
|
#9
|
elite*gold: 1
Join Date: Feb 2009
Posts: 6,378
Received Thanks: 7,996
|
Das ist recht einfach zu begründen. Dein Aufruf wird ja in etwa so aussehen:
Code:
oNtProtectVirtualMemory = (oNtProtectVirtualMemory_t)DetourFunc((PBYTE)pNtPVM, (PBYTE)hkNtProtectVirtualMemory, 5);
Wenn du jetzt noch mal einen Blick auf deine Detour-Function wirfst, wird dir auffallen, dass diese VirtualProtect aufruft, welche dann wiederrum auf die NtProtectVirtualMemory Funktion der ntdll zurückgreift, NACHDEM bereits der Execution-Flow umgeleitet wurde. Der Pointer enthält folglich noch nicht den Pointer zum Trampoline, da DetourFunc noch nicht returned ist.
Add:
Code:
void DetourFunc(PBYTE src, const PBYTE dst, void **ppTramponline, 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;
for (int i = 5; i < len; i++)
{
src[i] = 0x90;
}
*ppTrampoline = (jmp - len);
VirtualProtect(src, len, dwback, &dwback);
}
Code:
DetourFunc((PBYTE)pNtPVM, (PBYTE)hkNtProtectVirtualMemory, &oNtProtectVirtualMemory, 5);
So würde das Ganze funktionieren, da der Pointer so direkt mit dem korrekten Wert gefüllt wird.
Im Übrigen möchte ich anmerken, dass DetourFunc schrecklich implementiert ist - ich empfehle dir die Verwendung einer Detour-Librarys wie die von Microsoft.
|
|
|
06/15/2012, 14:42
|
#10
|
elite*gold: 0
Join Date: Jun 2008
Posts: 451
Received Thanks: 410
|
dann kann ich doch einfach die addr als ptr urückgeben also als 4. parameter oder ?
nur ich stell mir die frage bei der detour function wird ja zuerst das Trampolin vervollständigt und nachdem alles vorbereitet ist sozusagen wird der Execution Flow umgeleitet.
Also zuerst Trampolin
Code:
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;
und dann die umleitung aufs Trampolin also sollte doch eig. alles den richtigen weg nehmen oder ?
Code:
src[0] = 0xE9;
*(DWORD*)(src+1) = (DWORD)(dst - src) - 5;
Achja was ich vlt vergessen habe zu sagen es crasht direkt nach dem injecten.
Edit:
ahh ok ich teste es mal ^^
Edit2:
Danke
ja es funktioniert jetzt nur bin ich mir da immer noch nicht genau im klaren wieso das davor nicht funktioniert hat, weil s.o
Edit3:
omg ich habs gerafft das letzte VirtualProtect vor dem return  ok danke für die Hilfe
|
|
|
06/15/2012, 14:53
|
#11
|
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
|
Quote:
Originally Posted by Ende!
Das ist recht einfach zu begründen. Dein Aufruf wird ja in etwa so aussehen:
Code:
oNtProtectVirtualMemory = (oNtProtectVirtualMemory_t)DetourFunc((PBYTE)pNtPVM, (PBYTE)hkNtProtectVirtualMemory, 5);
Wenn du jetzt noch mal einen Blick auf deine Detour-Function wirfst, wird dir auffallen, dass diese VirtualProtect aufruft, welche dann wiederrum auf die NtProtectVirtualMemory Funktion der ntdll zurückgreift, NACHDEM bereits der Execution-Flow umgeleitet wurde. Der Pointer enthält folglich noch nicht den Pointer zum Trampoline, da DetourFunc noch nicht returned ist.
Add:
Code:
void DetourFunc(PBYTE src, const PBYTE dst, void **ppTramponline, 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;
for (int i = 5; i < len; i++)
{
src[i] = 0x90;
}
*ppTrampoline = (jmp - len);
VirtualProtect(src, len, dwback, &dwback);
}
Code:
DetourFunc((PBYTE)pNtPVM, (PBYTE)hkNtProtectVirtualMemory, &oNtProtectVirtualMemory, 5);
So würde das Ganze funktionieren, da der Pointer so direkt mit dem korrekten Wert gefüllt wird.
Im Übrigen möchte ich anmerken, dass DetourFunc schrecklich implementiert ist - ich empfehle dir die Verwendung einer Detour-Librarys wie die von Microsoft.
|
hat natürlich vollkommen recht, garnicht dran gedacht, dass du da vp hookst :P
|
|
|
 |
Similar Threads
|
D3D Hook Problem
11/02/2011 - General Coding - 13 Replies
Hi,
ich habe jetzt versucht nen D3D Hook zu schreiben, nachdem ich das Tutorial von purple diamond gelesen habe: http://www.homeofgamehacking.de/attachment.php?aid =120. Leider hab ich echt keine Ahnung was ich hier falsch mache. Bevor ich vor die DllMain Funktion extern "C" hinzugefügt habe, lies sich die Dll nicht mal injecten. Jetzt funktioniert das, allerdings wird kein Rechteck gezeichnet. Die Adresse hab ich auch wie im Tutorial mit IDA bekommen. Wäre wirklich sehr nett wenn sich das...
|
D3D Hook WriteMem Problem
02/01/2011 - General Coding - 45 Replies
Hallo Epvp,
Hab ein problem bei der WriteMem Funktion, aus dem D3D Hooking Tutorial von purple.d1amond.
die Funktion sieht folgendermaßen aus:
void WriteMem(DWORD dwOffset, DWORD dwValue, int len)
{
unsigned long Protection;
|
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;
|
All times are GMT +1. The time now is 04:22.
|
|