Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 16:25

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

Advertisement



DllMain wird nicht ausgeführt

Discussion on DllMain wird nicht ausgeführt within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
2n0w's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 115
Received Thanks: 18
DllMain wird nicht ausgeführt

Hi,
hab hier folgendes Problem, will MessageBoxW hooken, allerdings wird scheinbar DllMain nicht mal ausgeführt.. da denke ich jetzt versteh ich das Hooken einmal, dann scheitere ich schon am erstellen einer DLL xD
Nach dem Injecten passiert einfach nichts o.0
Habs bei einem selbst erstellten Programm getestet, das in einem Endlosloop MessageBoxW aufruft.
Verwende VS2010.
Hab Win32 Project -> DLL ausgewählt (mit precompiled header).
Hab jetzt echt keine Ahnung an was es scheitert.
Bitte helft mir ^^
Danke im Voraus.
Hier wäre der Source:
Code:
// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"

#define SIZE 6

typedef int (WINAPI *pMessageBoxW) (HWND, LPCWSTR, LPCWSTR, UINT);
int WINAPI MyMessageBoxW(HWND, LPCWSTR, LPCWSTR, UINT);

void BeginRedirect(LPVOID);

pMessageBoxW pOrigMBAdress = NULL;
BYTE oldBytes[SIZE] = {0};
BYTE JMP[SIZE] = {0};
DWORD oldProtect, myProtect = PAGE_EXECUTE_READWRITE;


BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		pOrigMBAdress = (pMessageBoxW) GetProcAddress(GetModuleHandle(L"user32.dll"), "MessageBoxW");
		if(pOrigMBAdress != NULL)
		{
			BeginRedirect(MyMessageBoxW);
		}else
		{
			OutputDebugString(L"Failed to get Procadress");
		}
		break;
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		memcpy(pOrigMBAdress, oldBytes, SIZE);
		break;
	}
	return TRUE;
}

void BeginRedirect(LPVOID newFunction)
{
	OutputDebugString(L"Beginning Redirect");
	BYTE tempJMP[SIZE] = {0xe9, 0x90, 0x90, 0x90, 0x90, 0xc3};
	memcpy(JMP, tempJMP, SIZE);
	DWORD JMPSize((DWORD) newFunction - (DWORD)pOrigMBAdress - 5);
	VirtualProtect((LPVOID)pOrigMBAdress, SIZE, myProtect, &oldProtect);
	memcpy(oldBytes, pOrigMBAdress, SIZE);
	memcpy(&JMP[1], &JMPSize, 4);
	memcpy(pOrigMBAdress, JMP, SIZE);
	VirtualProtect((LPVOID)pOrigMBAdress, SIZE, oldProtect, NULL);
}

int WINAPI MyMessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uiType)
{
	OutputDebugString(L"Hook func called");
	//Unhook
	VirtualProtect((LPVOID)pOrigMBAdress, SIZE, myProtect, NULL);
	memcpy(pOrigMBAdress, oldBytes, SIZE);
	//TODO: Add code here
	int retValue = MessageBoxW(hWnd, L"Hooked Messagebox", lpCaption, uiType);
	memcpy(pOrigMBAdress, JMP, SIZE);
	VirtualProtect((LPVOID)pOrigMBAdress, SIZE, oldProtect, NULL);
	return retValue;
}
2n0w is offline  
Old 04/26/2012, 20:40   #2
 
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
Sweet Jesus, you're doing it totally wrong!

Du hast da hochexplosiven Code geschrieben und ich würde fast darauf wetten, dass es sich hierbei um ein Deadlock handelt (ohne mir auch nur eine Zeile genauer angesehen zu haben).

Ein wenig Lektüre zum Thema Programmcode in DllMain:






Du solltest dein Programm auf jeden Fall entsprechend anpassen!
Mein Rat: Die Finger komplett von der DllMain lassen, wenn du nicht gerade Variablen in ihr initialisierst. Das Teil ist eine Zeitbombe!

Und selbst wenn es nicht daran liegt, du hast dann immerhin sauberen Code geschrieben.
Nightblizard is offline  
Thanks
1 User
Old 04/26/2012, 20:52   #3
 
2n0w's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 115
Received Thanks: 18
Mir reicht's für heute
Werde ich morgen versuchen.
Danke für deine Antwort!
2n0w is offline  
Old 04/26/2012, 20:55   #4
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
debugger dranhängen und gucken ob die outputdebugstrings worken?

EDIT:
ihr immer mit eurem deadlock...
werden nur funcs aus kernel benutzt und die funktion hängt auch nicht, also kein grund sich künstlich aufzuregen.
ist natürlich nicht sauber aber kein grund für panikmache.
Dr. Coxxy is offline  
Old 04/26/2012, 20:59   #5


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
Nö, ein Deadlock sollte es da nicht geben.

Dennoch:


Nimm MS Detours anstatt solcher eigenen Kopievorgänge.

Quote:
Du solltest dein Programm auf jeden Fall entsprechend anpassen!
Mein Rat: Die Finger komplett von der DllMain lassen, wenn du nicht gerade Variablen in ihr initialisierst. Das Teil ist eine Zeitbombe!
Und wie soll es deiner Meinung nach gehen, wenn man nichtmal nen Thread erstellen darf?
MrSm!th is offline  
Thanks
1 User
Old 04/26/2012, 21:13   #6
 
2n0w's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 115
Received Thanks: 18
Funktioniert jetzt, vielen Dank für die Antworten!
Ob das sauber ist, ist jetzt ne andere Sache.. da schaue ich morgen weiter :P
Eigentlich wollte ich das ja absichtlich manuell machen, damit ich verstehe wie das funktioniert, werde es morgen auch noch mit Detours versuchen.
Code:
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	DisableThreadLibraryCalls(hModule);
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		CreateThread(NULL, NULL,(LPTHREAD_START_ROUTINE)&initHook, NULL, NULL, NULL); 
		return TRUE;
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		memcpy(pOrigMBAdress, oldBytes, SIZE);
		break;
	}
	return TRUE;
}
2n0w is offline  
Old 04/26/2012, 22:37   #7
 
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
Quote:
Originally Posted by MrSm!th View Post
Und wie soll es deiner Meinung nach gehen, wenn man nichtmal nen Thread erstellen darf?
Eine Funktion exportieren und diese dann aufrufen.

In der Dll:
Code:
void __declspec(dllexport) Start()
{
     std::cout << "foo" << std::endl;
}
In deinem Programm:
Code:
__declspec(dllimport) void Start();

int main()
{
     //...
     Start();
}

Solltest du die dll in einen fremden Prozess injizieren, kannst du die Adresse der Funktion über GetProcAddress oder über die EAT herausfinden. Ziemlich straight forward.



Quote:
Originally Posted by Dr. Coxxy View Post
werden nur funcs aus kernel benutzt
-> User32.dll
Aber du hast recht, es handelt sich hier fast nur um Funktionen aus Kernel32.dll, da habe ich ein wenig überreagiert, dennoch ist das absolut nicht empfehlenswert!
Meine Devise lautet Fehlerquellen aus den Weg räumen und nicht sie lediglich zu umgehen.
Nightblizard is offline  
Old 04/26/2012, 23:10   #8
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
Quote:
Originally Posted by Nightblizard View Post
-> User32.dll
ruft er ja nirgends auf, holt sich mit getprochandle die adresse und prüft diese sogar.
Dr. Coxxy is offline  
Old 04/26/2012, 23:51   #9


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
Quote:
Originally Posted by 2n0w View Post
Funktioniert jetzt, vielen Dank für die Antworten!
Ob das sauber ist, ist jetzt ne andere Sache.. da schaue ich morgen weiter :P
Eigentlich wollte ich das ja absichtlich manuell machen, damit ich verstehe wie das funktioniert, werde es morgen auch noch mit Detours versuchen.
Code:
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	DisableThreadLibraryCalls(hModule);
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		CreateThread(NULL, NULL,(LPTHREAD_START_ROUTINE)&initHook, NULL, NULL, NULL); 
		return TRUE;
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		memcpy(pOrigMBAdress, oldBytes, SIZE);
		break;
	}
	return TRUE;
}
Wehe initHook ist vom Typen void!

Quote:
Originally Posted by Nightblizard View Post
Eine Funktion exportieren und diese dann aufrufen.
Klasse! Wir reden hier von Dll-Injection.

Quote:
Solltest du die dll in einen fremden Prozess injizieren, kannst du die Adresse der Funktion über GetProcAddress oder über die EAT herausfinden. Ziemlich straight forward.
Ja, oder man lässt es und nutzt die dafür gedachte DllMain.
Normalerweise gehören in diese nur die allernötigsten Initialisierungen und die Erstellung eines neuen Threads und genau das passiert hier.
Solange man auf diesen nicht wartet, kann es auch nicht zu einem Deadlock kommen.
Und im Gamehacking, wo es sowieso schmutzig zugeht, kann man sich sowas ruhig erlauben.
Und nebenbei hilft DisableThreadLibraryCalls da ja auch ab.

Ergänzend noch:

Quote:
Quote:
Du hast da hochexplosiven Code geschrieben und ich würde fast darauf wetten, dass es sich hierbei um ein Deadlock handelt (ohne mir auch nur eine Zeile genauer angesehen zu haben).
Sollte man vielleicht aber doch mal tun.

Wie schon gesagt wurde, MessageBox ruft er in der DllMain nicht auf.
MrSm!th is offline  
Old 04/27/2012, 01:18   #10
 
Tyrar's Avatar
 
elite*gold: 0
Join Date: Oct 2008
Posts: 1,637
Received Thanks: 1,119
mit exportierten funktionen zu arbeiten is auch bei injections kein problem D:

mein M2XT v2 läuft komplett sauber (mit allem was dazu gehört) - ohne DllMain!
Tyrar is offline  
Old 04/27/2012, 14:00   #11
 
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
Quote:
Originally Posted by MrSm!th View Post
Klasse! Wir reden hier von Dll-Injection.
Und? Selbst dann ist es kein Problem mit exportierten Funktionen zu arbeiten!

Quote:
Originally Posted by MrSm!th View Post
Und im Gamehacking, wo es sowieso schmutzig zugeht, kann man sich sowas ruhig erlauben.
Das ist doch kein Argument... Schreib du nochmal irgendwo etwas gegen system() oder void main, ich werde darauf zurückkommen!

Quote:
Originally Posted by MrSm!th View Post
Sollte man vielleicht aber doch mal tun.

Wie schon gesagt wurde, MessageBox ruft er in der DllMain nicht auf.
Ja, sollte man.
Dennoch, in der DllMain arbeiten ist unklug und ausgehend von der Tatsache, dass das Programm noch wachsen wird, ist der Gedanke auch nicht falsch.
Und am Ende habe ich mir ja noch die Türe mit dem "fast" offen gehalten, der Satz hat so gar keine Gewichtung.


Quote:
Originally Posted by HeavyHacker
mein M2XT v2 läuft komplett sauber (mit allem was dazu gehört) - ohne DllMain!
Meine Library erfordert das exportieren einer Funktion mit dem Namen "Start", wenn du eine Dll injizieren möchtest. Es gibt keinen Grund DllMain in die .dll zu schreiben.
Nightblizard is offline  
Old 04/27/2012, 17:26   #12
 
2n0w's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 115
Received Thanks: 18
Für den Anfang ist das dann doch ein bisschen viel für mich, ich bleibe erstmal dabei in DllMain nen Thread zu starten.
@MrSm!th
Natürlich ist initHook BOOL

Danke für die Hilfe
2n0w is offline  
Old 04/27/2012, 17:46   #13


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
Quote:
Originally Posted by Nightblizard View Post
Und? Selbst dann ist es kein Problem mit exportierten Funktionen zu arbeiten!
Es macht unnötige Arbeit.

Quote:
Das ist doch kein Argument... Schreib du nochmal irgendwo etwas gegen system() oder void main, ich werde darauf zurückkommen!
void main ist schlicht und ergreifend falsch.
system() sehe ich selten in Hacks, eher in normalen Programmen und den Anfänger-Tools und gerade Anfänger sollten es sich gerade nicht angewöhnen.
Ein Hacker sollte wissen, dass er sich sowas nicht angewöhnt. Außerdem ist zwischen Gamehacking im Sinne von ein Konsolentool, das mit WriteProcessMemory 1-2 Werte umschreibt und Gamehacking mit Dll-Injection, viel lowlevel Arbeit und am besten noch inline ASM nochmal ein Unterschied. Dll-Injection selbst ist schon ein Exploit und nicht gerade sauber. Da pfeife ich doch darauf, ob es gut oder schlecht ist, die Dll Main zu nutzen.
Die Standardprozedur sieht so aus, dass man einen neuen Thread erstellt, quasi den eigentlichen Main Thread der Dll. Dort findet alles weitere statt. Egal, wie sehr er die Dll noch erweitert, das sollte sich niemals verändern und demnach geht davon auch keine Gefahr aus.
Und wie gesagt, es gibt immer noch DisableThreadLibraryCalls.

Quote:
Meine Library erfordert das exportieren einer Funktion mit dem Namen "Start", wenn du eine Dll injizieren möchtest. Es gibt keinen Grund DllMain in die .dll zu schreiben.
Genau so gibt es auch keinen sich die Extra-Arbeit zu machen.
Quote:
Natürlich ist initHook BOOL
Dafuq? Ich hoffe das ist Ironie.
Ich habs doch nicht so mit Ironie
MrSm!th is offline  
Old 04/27/2012, 18:34   #14
 
2n0w's Avatar
 
elite*gold: 0
Join Date: Feb 2012
Posts: 115
Received Thanks: 18
Quote:
Originally Posted by MrSm!th View Post
Dafuq? Ich hoffe das ist Ironie.
Ich habs doch nicht so mit Ironie
Mit void war nicht der Rückgabetyp gemeint, oder?
Es sieht so aus:
Code:
BOOL initHook()
{}
Sollte ich's so machen?
Code:
LPTHREAD_START_ROUTINE initHook()
{}
Oder hat das was mit Funktionszeiger zu tun? ^^
Mit denen kenne ich mich leider nicht aus, programiere eigentlich fast nie in C.. sollte ich mir wohl mal genauer anschauen.
2n0w is offline  
Old 04/27/2012, 19:04   #15
 
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
Quote:
Originally Posted by MrSm!th View Post
Es macht unnötige Arbeit.
Sicheren, sauberen Code zu schreiben ist unnötige Arbeit? Uff, unsere Ansichten sind doch sehr verschieden!

Quote:
Originally Posted by MrSm!th View Post
void main ist schlicht und ergreifend falsch.
Das hatten wir erst vor kurzem und es ist zumindest mit dem Windows Compiler nicht falsch.

Quote:
Originally Posted by MrSm!th View Post
system() sehe ich selten in Hacks, eher in normalen Programmen und den Anfänger-Tools und gerade Anfänger sollten es sich gerade nicht angewöhnen.
Ersetze system() mit DllMain. system hat "lediglich" Performanceschwächen, DllMain kann dir dein Programm killen. Keine Ahnung wie du gewichtest, aber wenn ich die Wahl hätte buße ich lieber etwas performance ein, als mit der Möglichkeit eines Deadlocks weiterarbeiten zu müssen.

Quote:
Originally Posted by MrSm!th View Post
Ein Hacker sollte wissen, dass er sich sowas nicht angewöhnt.
Aber genau das tuen sie nicht. Viele haben deine Einstellung und sagen "schmutziges Geschäft, schmutziger Programmcode" (so kommt zumindest deine Aussage rüber) und arbeiten dementsprechend. Da muss man einfach hart bleiben und die Leute zum Einlenken bewegen.

Quote:
Originally Posted by MrSm!th View Post
Außerdem ist zwischen Gamehacking im Sinne von ein Konsolentool, das mit WriteProcessMemory 1-2 Werte umschreibt und Gamehacking mit Dll-Injection, viel lowlevel Arbeit und am besten noch inline ASM nochmal ein Unterschied.
Das stimmt nicht. Ich kann beides sehr gewissenhaft, robust und performant gestalten. Der Kosten/Nutzen Faktor rechnet sich, nach meinen Erfahrungen, _immer_ in der Programmierung!

Quote:
Originally Posted by MrSm!th View Post
Dll-Injection selbst ist schon ein Exploit und nicht gerade sauber. Da pfeife ich doch darauf, ob es gut oder schlecht ist, die Dll Main zu nutzen.
Siehe oben. Aus "schmutziges Geschäft, schmutziger Programmcode" wächst Code wie dieser:
Das bezieht sich nicht unbedingt auf dich, aber de facto sind viele Anfänger davon betroffen.

Quote:
Originally Posted by MrSm!th View Post
Die Standardprozedur sieht so aus, dass man einen neuen Thread erstellt, quasi den eigentlichen Main Thread der Dll. Dort findet alles weitere statt. Egal, wie sehr er die Dll noch erweitert, das sollte sich niemals verändern und demnach geht davon auch keine Gefahr aus.
Doch, tut es. Wartet er auf Beendigung des Threads ist feierabend. Aber ich bezog mich auch gar nicht auf das Erstellen eines Threads in DllMain. Das ist zwar auch nicht ganz so schön, aber so lange man wirklich nur den Thread erstellt okay.
Schaue dir seinen ursprünglichen Code an, da erstellt er noch keinen Thread und daher auch die ganzen Links mit Infomaterial.
Er hat es auch sofort abgeändert, sprich er hat verstanden worum es geht! Ziel erreicht, mehr wollte ich nicht.

Quote:
Originally Posted by MrSm!th View Post
Und wie gesagt, es gibt immer noch DisableThreadLibraryCalls.
Darum geht es mir nicht, da auch das nicht im ursprünglichen Quellcode drinnen war.

Quote:
Originally Posted by MrSm!th View Post
Genau so gibt es auch keinen sich die Extra-Arbeit zu machen.
Wie bereits gesagt, unsere Ansichten scheinen recht verschieden zu sein. Ich versuche so sauber wie möglich zu arbeiten und da meine Lib open source ist, sitzt der angestrebte Level nocheinmal etwas höher.
Und am Ende war es lediglich mehr Aufwand für mich, der User merkt davon kaum etwas. Das läuft dann so ab:

Code:
//user .dll

void __declspec(dllexport) Start()
{
    //programmcode. läuft in einem eigenen thread
}
Code:
//user injector
void foo()
{
     Module loadedDll;
     auto startAddress = Injector::Inject(process, _T("dllPath.dll"), loadedDll);
     Injector::CallStart(process, startAddress);
     //...
     Injector::UnloadDll(process, loadedDll);
}
Das ist nicht nur sicherer, sondern auch viel flexibler als Code in DllMain zu packen! So kann ich bestimmen wann das Ganze starten soll!
Und wenn Sicherheit und Flexibilität für mich ein paar Zeilen Code mehr bedeuten (ich glaube es waren ca. 5 Stück), dann gehe ich den Deal ohne nachzudenken ein!
Die Arbeit sieht der User gar nicht.


@2n0w:
Code:
DWORD WINAPI initHook(LPVOID lpThreadParameter)
Nightblizard is offline  
Thanks
1 User
Reply


Similar Threads Similar Threads
Screencapture wird schon beim start ausgeführt.
11/13/2011 - AutoIt - 3 Replies
Wie der Titel schon sagt macht mein momentanes Script schon ein Screenshot wenn ich es öffne, das soll aber so nicht sein. 1. Screenshot bei klicken auf Button 2. Screenshot bei drücken von F12 ( auch hidden ? ) 3. Oben nur ein Minimieren Knopf, im moment ist dort garnichts Script #include <WindowsConstants.au3> #include <ScreenCapture.au3> GUICreate ( "Premaiders Desktop Tool",310,270,-1,-1,$WS_CAPTION)
Der Audiodienst wird nicht ausgeführt
04/10/2011 - Technical Support - 19 Replies
Bei PC Tools Internet Security kam gerade eine Meldung, dass ein glaub verdächtiger Prozess läuft. Ich hab dann auf Quarantäne geklickt. Und plötzlich war mein Ton weg Oo ; und auch das rote Kreu über dem Lautsprecher (s.Bild). Habe Doppelklick draufgeklickt auf den Lautsprecher und dann kam das. (s.Bild) Ich dachte mir dann so, wenn ich es wieder aus der Quarantäne entferne geht es wieder und das rote Kreuz geht weg, aber nachdem ich es bei PC Tools Internet Security aus der Q....
Make.sh kann nicht ausgeführt werden!
03/07/2011 - Metin2 Private Server - 9 Replies
Hallo Da ich nichts zu diesem Thema nichts gefunden haben frag ich jetzt mal hier. Wenn ich neue Quests einfüge und Make.sh ausführen will klappt alles bis zum ersten Schritt. cd /usr/rain/channel/share_data/locale/english und wenn ich dannach chmod u+x make.sh
wie kann ich eine exe in ein jpg verstecken und das durch kliken ausgeführt wird
05/06/2010 - General Coding - 7 Replies
wie kann ich eine exe in ein jpg verstecken und das durch kliken ausgeführt wird
wie kann ich eine exe in ein jpg verstecken und das durch kliken ausgeführt wird
04/26/2010 - Main - 7 Replies
wie kann ich eine exe in ein jpg verstecken und das durch kliken ausgeführt wird.



All times are GMT +2. The time now is 16:25.


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.