Warten bis Modul komplett entpackt wurde

11/19/2013 20:57 lolkop#1
Hey Leute,

ich habe mich mal entschieden einen kleinen Hack für die US-Version von RaiderZ zu schreiben.

Da der Client mit ASProtect gepackt ist und Gameguard benutzt, würde ich gerne eine dll injecten bevor Gameguard sich ans Spiel hängt... Gesagt, getan mit einem sehr einfachen Dll-Aufbau:
Code:
#include "windows.h"
#include <iostream>

// variables
HMODULE myModule;
void *zoomOutMax = (void*)(0xDB9414);
// threads
DWORD WINAPI HackThread(LPVOID unused)
{
	// wait for zoomOutMax to get set to default
	while(*(float*)(zoomOutMax)!=540.0);
	// increase zoomOutMax
	*(float*)(zoomOutMax) = FLT_MAX;
	// exit thread and unload dll
	FreeLibraryAndExitThread(myModule, 0);
}
// main
bool WINAPI DllMain(HMODULE hModule, DWORD ulReason, LPVOID lpReserved)
{
	myModule = hModule;
	if(ulReason==DLL_PROCESS_ATTACH) CreateThread(0, 0, &HackThread, 0, 0, 0);
	return true;
}
Da der Client sich während der Laufzeit selbst entpackt, warte ich einfach bis der default Wert an einer bestimmten Stelle gespeichert ist, um ihn dann zu ändern....

Nun würde ich gerne eine Patternsuche für die genutzte Adresse einfügen, um das ganze nicht ständig manuell updaten zu müssen.
Bevor das ganze gestartet werden kann, muss der Client sich aber vollständig entpackt haben.

Zur eigentlichen Frage: Wie kann ich am besten/einfachsten generell überprüfen, ob der benutzte Packer das Hauptmodul komplett entpackt hat?
11/19/2013 21:02 MrSm!th#2
In S4 habe ich einfach GetCommandLine gehookt und dann die entsprechenden Veränderungen vorgenommen.
Wenn die Funktion auch schon vorher vom Packer-Stub aufgerufen wird, baut man halt ein Flag bzw einen Counter ein.
Ist natürlich kein Universalmittel, aber es gibt so einige Funktionen, von denen man erwarten kann, dass sie zeitnah nach Eintritt in die WinMain aufgerufen werden.
11/19/2013 21:08 snow#3
Oder man schaut, ob die Returnadresse innerhalb des Moduls liegt, dann braucht man keinen Counter. :o
Aber GetCommandLine sollte der richtige Ansatz sein, ja.
11/19/2013 21:13 lolkop#4
GetCommandLine wird vom Packer nicht verwendet, kann also ohne weiteren Check genutzt werden.

Ich hatte zwar eher nach einer allgemeinen Lösung gesucht, hab aber nun wenigstens eine Lösung für mein spezielles Problem^^
11/19/2013 21:28 Omdi#5
GetStartupInfoA wäre auch noch eine alternative :D
11/20/2013 12:34 MrSm!th#6
Quote:
Originally Posted by snow911 View Post
Oder man schaut, ob die Returnadresse innerhalb des Moduls liegt, dann braucht man keinen Counter. :o
Aber GetCommandLine sollte der richtige Ansatz sein, ja.
Wer sagt, dass der Packer-Stub nicht im Modul liegt?