|
You last visited: Today at 14:34
Advertisement
[c++] Dll Fehler
Discussion on [c++] Dll Fehler within the C/C++ forum part of the Coders Den category.
09/18/2011, 12:17
|
#1
|
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
|
[c++] Dll Fehler
Ich habe zum testen eine dll für das Windows Spiel Solitair erstellt. Leider meldet der Injector immer, dass ein Fehler aufgetreten ist:
PHP Code:
#include <windows.h> #include <iostream>
#define PROCESS "Solitaire.exe" #define BASE_OFFSET 0x00098290 #define OFFSET_1 0x74 #define OFFSET_2 0x50 #define OFFSET_3 0x74 #define OFFSET_4 0x90
using namespace std;
DWORD WINAPI writeMemory(LPVOID lpParam) { UINT* Adress = reinterpret_cast<UINT*>(GetModuleHandle(PROCESS) + BASE_OFFSET); Adress = reinterpret_cast<UINT*>(*Adress + OFFSET_1); Adress = reinterpret_cast<UINT*>(*Adress + OFFSET_2); Adress = reinterpret_cast<UINT*>(*Adress + OFFSET_3); Adress = reinterpret_cast<UINT*>(*Adress + OFFSET_4); *Adress = 100;
return 0; }
BOOL WINAPI DllMain (HINSTANCE hModule, DWORD dwAttached, LPVOID lpvReserved) { if (dwAttached == DLL_PROCESS_ATTACH) { MessageBox(0, "Die dll wurde erfolgreich injiziert", "Erfolg", 1); CreateThread(NULL ,0, &writeMemory, NULL, 0, NULL); WaitForSingleObject(HANDLE(writeMemory), NULL); } else if (dwAttached == DLL_PROCESS_DETACH) { MessageBox(0, "Die dll wurde erfolgreich wieder freigegeben", "Erfolg", 1); return 0; } }
Ausgegeben wird sowohl, dass die dll injiziert wurde, als auch, dass sie wieder freigegeben wurde. Danach wirft der Injector einen Fehler und das Spiel stürzt (höchstwahrschenlich aufgrund eines Speicherfehlers) ab, obwohl der Pointer und die Offsets dazu mit ziemlicher Sicherheit richtig sind.
|
|
|
09/18/2011, 12:45
|
#2
|
elite*gold: 0
Join Date: Jul 2010
Posts: 388
Received Thanks: 196
|
|
|
|
09/18/2011, 13:06
|
#3
|
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
|
Sofort testen
€: hmm, ich verstehe den letzten Paramter nicht ganz... Und wie mache ich das direkt für alle Adressen. Oder muss man jede Adresse einzeln deprotecten?
|
|
|
09/18/2011, 19:44
|
#4
|
elite*gold: 1
Join Date: Jul 2005
Posts: 553
Received Thanks: 454
|
WaitForSingleObject gibt 0 zurückgeben, was dann auch der Rückgabewert von DllMain wäre. Du musst bei DLL_PROCESS_ATTACH aber TRUE zurückgeben, da du sonst angibst, dass die Dll aufgrund eines Initialisierungsfehlers wieder entladen werden soll.
Bei DLL_PROCESS_DETACH ist der Rückgabewert egal, also kann das "return 0" da weg.
Btw. wieso blockierst du mit WaitForSingleObject überhaupt den Thread?
VirtualProtect benötigst du, falls du Memory Regionen beschreiben möchtest, die nicht auf writeable stehen, wie z.B. die Code-Sektion von Solitaire.exe im Speicher. Der letzte Parameter ist die Adresse eines DWORDs, welches die alten Attribute der Region erhält.
VirtualProtect sucht sich automatisch die Region, in der sich deine Adresse befindet.
Sauberer wäre es aber, wenn du vorher VirtualQuery aufrufst und dann BaseAddress und RegionSize übergibst.
Wenn alle Adressen, die du beschreiben möchtest, in der gleichen Region liegen, musst du VirtualProtect auch nur einmal aufrufen.
|
|
|
09/18/2011, 20:20
|
#5
|
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
|
Quote:
|
WaitForSingleObject gibt 0 zurückgeben, was dann auch der Rückgabewert von DllMain wäre. Du musst bei DLL_PROCESS_ATTACH aber TRUE zurückgeben, da du sonst angibst, dass die Dll aufgrund eines Initialisierungsfehlers wieder entladen werden soll.
|
Danke. Jetzt kommt schonmal kein Fehler mehr vom Injector.
Quote:
|
VirtualProtect benötigst du, falls du Memory Regionen beschreiben möchtest
|
zum lesen nicht?
Quote:
|
Der letzte Parameter ist die Adresse eines DWORDs, welches die alten Attribute der Region erhält.
|
also für mich vollkommen uninteressant... (?)
Quote:
|
Sauberer wäre es aber, wenn du vorher VirtualQuery aufrufst und dann BaseAddress und RegionSize übergibst.
|
Hab ich versucht. Muss ich an VirtualQuery denn das Handle des Prozesses oder nur die Adresse die ich beschreiben will übergeben? Jetzt sieht es so aus. Allerdings stürzt Solitaire weiterhin ab.
PHP Code:
DWORD WINAPI writeMemory(LPVOID lpParam) { MEMORY_BASIC_INFORMATION info; DWORD oldProtection; HANDLE handle = GetModuleHandle(PROCESS);
UINT* Adress = reinterpret_cast<UINT*>(*(UINT*)handle + BASE_OFFSET); Adress = reinterpret_cast<UINT*>(*Adress + OFFSET_1); Adress = reinterpret_cast<UINT*>(*Adress + OFFSET_2); Adress = reinterpret_cast<UINT*>(*Adress + OFFSET_3); Adress = reinterpret_cast<UINT*>(*Adress + OFFSET_4);
VirtualQuery(Adress, &info, sizeof(UINT)); VirtualProtect(info.BaseAddress, info.RegionSize, PAGE_READWRITE, &oldProtection); *Adress = 100;
return 0; }
Vielen Dank schonmal für die Hilfe bis jetzt!
|
|
|
09/18/2011, 20:38
|
#6
|
elite*gold: 1
Join Date: Jul 2005
Posts: 553
Received Thanks: 454
|
Falls du in Regionen etwas auslesen möchtest, die nicht das readable-Flag besitzen, würdest du auch nichts lesen können.
Images sind aber standardmäßig readable und Alloziierungen im Heap müssen ja auch readable sein, damit das Spiel Variablen auslesen kann, etc.
"__out PDWORD lpflOldProtect"
Da steht nicht, dass es optional ist. Also auch wenn du nicht vorhast, den Wert wieder zurückzusetzen und die alten Attribute daher nicht benötigst, musst du dennoch eine gültige Adresse übergeben.
VirtualQuery failt bei dir, da der dritte Parameter gleich der Größe von lpBuffer sein muss, also sizeof(MEMORY_BASIC_INFORMATION) oder sizeof(info).
|
|
|
09/18/2011, 22:18
|
#7
|
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
|
Hmm... Geht immer noch nicht. Der Fehler befindet sich scheinbar in der Zeile:
Code:
Adress = reinterpret_cast<UINT*>(*Adress + OFFSET_2);
Und nochmal die Frage
Quote:
|
Muss ich an VirtualQuery denn das Handle des Prozesses oder nur die Adresse die ich beschreiben will übergeben?
|
In der MSDN steht da was von "pages". Ich habe leider keine Ahung, was damit gemeinst ist -.-
|
|
|
09/19/2011, 09:41
|
#8
|
elite*gold: 1
Join Date: Jul 2005
Posts: 553
Received Thanks: 454
|
Die restlichen Parameter sind richtig, du musst also eine Adresse übergeben.
VirtualProtect ruft VirtualProtectEx auf und übergibt zusätzlich als Prozesshandle -1, was für den eigenen Prozess steht.
Wenn du den Fehler in dieser Zeile lokalisiert hast, wird es wohl an der Dereferenzierung liegen, heißt dass Adress keine gültige Adresse ist..
Bist du denn sicher, dass die Adressen, etc. richtig sind?
Hast du es mal debuggt, um dir anzusehen, was bei den einzelnen Befehlen passiert?
Du könntest z.B. StrongOD laden, Solitaire mit OllyDbg starten, deine Dll via Rechtsklick->StrongOD->InjectDLL injizieren, über Rechtsklick->View oder Alt+E in das entsprechende Modul wechseln, einen Breakpoint auf den Thread setzen, F9 drücken und dann halt jeden Befehl durchgehen.
|
|
|
09/19/2011, 17:32
|
#9
|
elite*gold: 9
Join Date: Dec 2009
Posts: 1,071
Received Thanks: 819
|
Quote:
|
Du könntest z.B. StrongOD laden, Solitaire mit OllyDbg starten, deine Dll via Rechtsklick->StrongOD->InjectDLL injizieren, über Rechtsklick->View oder Alt+E in das entsprechende Modul wechseln, einen Breakpoint auf den Thread setzen, F9 drücken und dann halt jeden Befehl durchgehen.
|
Werde ich wohl tun müssen... Vielen Dank bis jetzt!
|
|
|
 |
Similar Threads
|
[Root]Setting.lua fehler aber Fehler nicht zu beheben??
08/09/2011 - Metin2 Private Server - 5 Replies
Richte für jemanden den root ein, aber bei dem fehler bin ich jetzt selber an meine grenzen gekommen.
Folgender Fehler kommt beim starten:
http://www.fotos-hochladen.net/uploads/unbenan11n tij3uvlnr5d.png
Die syserr daneben gehört dazu, die Setting.lua habe ich schon durch getauscht, kommt aber immer noch der Fehler :confused:
Datenbank auch schon getauscht, aber was ist dieses:
|
Infinite Aion: Fehler (1024) Fehler beim initialisieren des Spiels
06/09/2011 - Aion Private Server - 5 Replies
Hi Leute,
ich hab ein Probem mit AION:
jedesmal wenn ich starte, egal ob mit dem NCSoft Launcher oder mit dem Infinite Aion Launcher kommt die Meldung Fehler beim initialisieren des Spiels...
Hab schon alle möglichen Sprachkombinationen durchprobiert, da es überall heißt man soll Region und Sprache beim NCSoft Launcher ändern und dann gehts...
Alles probiert, und siehe da: geändert hat sich nichts... Immer noch der Fehler 1024...
wäre nett, wenn mir da jemand helfen könnte und auch...
|
Fehler beim Skype deinstallieren [Fehler 1603]
06/08/2011 - Technical Support - 4 Replies
Überschrift sagt alles.
Ich hoffe jmd kann mir helfen,ich kann auch einen Sceenshot machen.
|
Server fehler!! (core fehler) bitte hilfee!!
02/16/2011 - Metin2 Private Server - 6 Replies
Hallo liebes ePvP.
Ich habe gerade versucht die neuen reittiere einzufügen und da reboote ich den server und bekomme einen core fehler :( hier der genaue fehler:
mv: rename cores/core .2 to cores/core .1: No such file or directory
mv: rename cores/core .3 to cores/core .2: No such file or directory
mv: rename cores/core .4 to cores/core .3: No such file or directory
mv: rename cores/core .5 to cores/core .3: No such file or directory
mv: rename cores/core .6 to cores/core .5: No such file...
|
Fehler : java.net.socet.exception:connection reset fehler bitte um hilfe
12/21/2010 - Minecraft - 9 Replies
Hab denn java.net.socet.exception:connection reset fehler immer und immer wieder
:(
könnt ihr mir dabei vill helfen? :)
LG DieVerrückteMango =)
|
All times are GMT +1. The time now is 14:34.
|
|