|
You last visited: Today at 11:55
Advertisement
Qt dll
Discussion on Qt dll within the C/C++ forum part of the Coders Den category.
07/03/2013, 00:09
|
#1
|
elite*gold: 1000
Join Date: Apr 2012
Posts: 1,003
Received Thanks: 208
|
Qt dll
Hallo ePVP Coder 
Bin gerade dabei eine Qt dll zu programmieren, aber ich kann diese leider nicht injecten. CheatEngine sagt mir, dass der dll loader nicht geladen werden konnte und andere Injektoren gehen auch nicht.
Hier ist der Code (main.cpp):
Code:
#define NOMINMAX
#include <windows.h>
#include <QApplication>
#include <QtGui>
#include "window.h"
int main(int argc, char *argv[])
{
argc =0;
QApplication MyApp(argc, NULL);
window *wnd = new window;
wnd->show();
return MyApp.exec();
}
BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD fdwReason, LPVOID lpReserved)
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
{
HANDLE hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)main, (LPVOID)hInstance, 0, NULL);
}
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
In der window.cpp und den anderen Dateien wurde nichts verändert.
Vielen Dank
qkuh
|
|
|
07/03/2013, 00:45
|
#2
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
|
Zuerst: Dein Thread-Prototyp ist absolut gegen jede vernünftige Regel. :<
Korrekt müsste er so sein:
Code:
DWORD WINAPI ThreadProc(
_In_ LPVOID lpParameter
);
Du rufst im Prinzip den Thread auf mit einem void-Zeiger, wo ein int erwartet wird.
int main dürfte hier auch problematisch werden, du hast im Prinzip 2 Einstiegspunkte definiert (einer für Anwendungen, einer für Dlls), keine Ahnung, wie CE das handled, aber daran könnte es liegen.
Bau deine Threadfunktion mal so um:
Code:
DWORD WINAPI main(LPVOID param)
{
QApplication MyApp(0, NULL);
window *wnd = new window;
wnd->show();
return MyApp.exec();
}
als Parameter kannste einfach nullptr übergeben, du brauchst dann auch keine Casts mehr.
|
|
|
07/03/2013, 00:47
|
#3
|
elite*gold: 0
Join Date: Jan 2009
Posts: 1,160
Received Thanks: 232
|
Alter!? Du hast 2 potenzielle Entry-Points, lol.
Du kannst 1. nicht einfach eine main und eine DllMain haben, da es dann afaik undefiniertes Verhalten hervorruft. Wieso willst du Qt injecten? Injecte über deinen Hack doch einfach eine Dll, oder geht es dir um die GUI, die du Ingame haben willst?
€: Zu langsam
|
|
|
07/03/2013, 01:16
|
#4
|
elite*gold: 1000
Join Date: Apr 2012
Posts: 1,003
Received Thanks: 208
|
Vielen Dank ! Ich werde es morgen ausprobieren und dann mal berichten. Das mit den 2 Einstiegspunkten scheint kein Problem zu sein, da auch die Umbenennung der main Funktion nichts an dem Problem ändert. Hab eben mal mit Olly geschaut. Die dll wird anscheinend injected, jedoch wird das Modul sofort wieder entladen. Sorry für Rechtschreibfehler. Bin am Handy.
Und ja genau, ich möchte die dll injecten und die Funktionen über das Fenster ansteuern.
|
|
|
07/03/2013, 02:16
|
#5
|
elite*gold: 55
Join Date: Mar 2006
Posts: 4,582
Received Thanks: 1,539
|
Code:
unsigned long __stdcall MainThread( void* )
{
QApplication MyApp( 0 , 0 );
window *wnd = new window();
wnd->show();
return TRUE;
}
int __stdcall DllMain(HINSTANCE , unsigned long Reason, void* )
{
switch (Reason)
{
case DLL_PROCESS_ATTACH:
CreateThread(0 , 0, &MainThread, 0 , 0, 0 );
break;
}
return TRUE;
}
glaube aber nicht dass du so einfach die GUI call'n kannst.
Returnen bringt auch nicht's so wie du es dort oben vorhattest.
|
|
|
07/03/2013, 13:51
|
#6
|
elite*gold: 1000
Join Date: Apr 2012
Posts: 1,003
Received Thanks: 208
|
So ich habe jetzt den Code von snow und von bloodx ausgetestet, aber leider funktioniert keiner von denen. CheatEngine meldet mir "Failed injecting the DLL".
Hat jemand eine Ahnung, was ich noch tun könnte?
|
|
|
07/03/2013, 18:06
|
#7
|
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
|
Wo genau der Crash passiert, wissen wir immernoch nicht. Erstell mal ein C++ Projekt und lade daraus die DLL manuell. Von da aus kannst du leichter auf GetLastError etc. zugreifen.
Btw:
|
|
|
07/03/2013, 19:36
|
#8
|
elite*gold: 55
Join Date: Mar 2006
Posts: 4,582
Received Thanks: 1,539
|
Quote:
Originally Posted by Schlüsselbein
Wo genau der Crash passiert, wissen wir immernoch nicht. Erstell mal ein C++ Projekt und lade daraus die DLL manuell. Von da aus kannst du leichter auf GetLastError etc. zugreifen.
Btw: 
|
bah! Danke für den Link :/ arbeite immer mit CreateThread ._.'
mhm und was ist eig mit std::thread ?
|
|
|
07/03/2013, 19:55
|
#9
|
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
|
Das solltest du immer verwenden, wenn du kannst. std::thread abstrahiert die direkten lowlevel Aufrufe. Das bringt Sicherheit, Plattformunabhängigkeit etc.
|
|
|
07/03/2013, 20:06
|
#10
|
elite*gold: 55
Join Date: Mar 2006
Posts: 4,582
Received Thanks: 1,539
|
Alles klar dann werde ich auf std::thread ab jetzt zurück greifen war mir nicht sicher ob es wirklich viel bringt.
|
|
|
07/03/2013, 20:08
|
#11
|
elite*gold: 724
Join Date: Mar 2011
Posts: 10,479
Received Thanks: 3,318
|
Bei std::thread sollte man übrigens .detach() verwenden, damit der Thread von der Funktion(?) unabhängig agieren kann, da sonst nach dem return TRUE der Thread auch vorbei ist.
Und der Prototyp ist da einfacher, das ist auch cool. Bei S4 aber z.B. crasht das das Spiel. :/
EDIT: Der Post bezieht sich nur auf DLLs, im eigenen Programm muss man das so machen, wie es halt gemacht werden sollte.
|
|
|
07/03/2013, 23:36
|
#12
|
elite*gold: 1000
Join Date: Apr 2012
Posts: 1,003
Received Thanks: 208
|
Hatte das Projekt als Qt Library erstellt. Ich denke, dass das ein Fehler war. Hab vorhin versucht, ein leeres c++ projekt zu erstellen und alles ans laufen zu bringen, aber ich habe es nicht hinbekommen. Danach habe ich mich ein bisschen in Qt eingelesen und auch wahrscheinlich meine Fehlerquelle ( moc files) gefunden. Werde mich morgen eventuell nochmal melden
|
|
|
07/04/2013, 00:32
|
#13
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,908
Received Thanks: 25,409
|
Um es mal in den Raum zu werfen: Was regt ihr euch alle über DllMain und main auf? Eigentlich sollte die IDE je nach Projektart eine bestimmte Funktion als Entrypoint sehen, ich sehe da also keine Konfliktgefahr.
Das GUI innerhalb einer DLL zu benutzen, wird schon irgendwie gehen. Mit der MFC geht das auch. Ist halt bei diesen Wrappern, die den ganzen Win32 Code verstecken, etwas aufwändiger. Erst recht, weil der Projekttyp DLL ja auch nicht dafür gedacht ist, ein GUI zu zeigen. Entsprechend muss man natürlich auch die ganzen Forms bei VS selbst anlegen. Ich denke bei QT wirds da nicht anders sein.
Quote:
Originally Posted by Schlüsselbein
Das solltest du immer verwenden, wenn du kannst. std::thread abstrahiert die direkten lowlevel Aufrufe. Das bringt Sicherheit, Plattformunabhängigkeit etc.
|
Plattformunabhängigkeit bei einer Dll-Injection? Srsly? ;f
|
|
|
07/04/2013, 00:59
|
#14
|
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
|
Noch dazu GLAUBE ich sollte man die QApplication so erstellen:
Code:
argc = 1;
char* bla[1] = {"irgendeinname"};
QApplication MyApp(argc, bla);
window *wnd = new window;
wnd->show();
return MyApp.exec();
Ob das an dem Injection-Fehler was ändert weiß ich nicht, aber die QApplication möchte das denke ich so.
Zitat Referenz:
Quote:
|
Warning: The data referred to by argc and argv must stay valid for the entire lifetime of the QApplication object. In addition, argc must be greater than zero and argv must contain at least one valid character string.
|
Padmak
|
|
|
07/04/2013, 09:04
|
#15
|
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
|
@Smith: ich hab die Frage wegen std::thread allgemein verstanden.
|
|
|
All times are GMT +1. The time now is 11:57.
|
|