1

Ich habe eine .dll-Datei, die in den Prozess eines Spiels injiziert wird. Es versucht, eine kleine Zeichenfolge aus einem bestimmten Speicherbereich zu lesen, aber wenn diese Zeichenfolge als std :: string aufgerufen wird, stürzt das Spiel ab. Ich habe gerade erst angefangen, an der Oberfläche zu kratzen, wie Programmspeicher funktioniert, also bin ich verloren.Segfault, wenn versucht wird, String vom Zeiger in einer injizierten .dll zu lesen

In diesem Spiel gibt es Instanzen von Objekten, die bestimmte Eigenschaften haben. Diese Eigenschaften haben immer den gleichen Offset. Die Eigenschaft, die ich zu lesen versuche, ist die Name-Eigenschaft, die für jede mögliche Instanz einen Offset von 0x28 hat. Dies ist die Funktion, die ich bin mit dem Namen von der Instanz zu erhalten:

std::string* GetName(int Instance) { 
    return (std::string*)(*(int*)(Instance + 0x28)); 
} 

Ich habe einen Debugger/Disassembler verwendet, um zu überprüfen, dass die Instanz gültig ist und dass der resultierende Zeiger hat den Wert, den ich brauche. Sobald ich jedoch versuche, etwas damit zu machen, stürzt das Spiel ab. Zum Beispiel diese:

std::string objName = *GetName(obj); 

Oder diese:

std::cout << *GetName(obj); 

Oder auch diese (wenn ich verzweifelt genug bekam):

std::string* objName = (std::string*) obj + 0x28; 
std::cout << *objName; 

Ich habe versucht, meine IDE-Debugger, um das Spiel angebracht wird, und die nützlichste Information, die ich bekam, war "segmentation fault", als der Absturz passierte. Sogar meine viel sachkundigeren Freunde, die mir dabei geholfen haben, sind ratlos darüber, was falsch sein könnte.

Wenn es hier nicht genug Informationen gibt, um herauszufinden, was das Problem ist, könnte ich wenigstens einen Schub in die richtige Richtung bekommen? Was könnte das verursachen?

+2

Es ist wahrscheinlich eine C-Zeichenfolge (0 beendet), aka 'char *'. Anstatt den Speicher zu einem 'std :: string *' zu zwingen, erzwingen Sie ihn zu einem 'char *' und konstruieren Sie dann eine neue 'std :: string'-Instanz daraus. Wenn Sie auch lesen und schreiben wollen, müssen Sie damit als 'char *' (C-String) arbeiten. Angesichts Ihres derzeitigen Verständnisses von Speicher- und C++ - Typen könnte es ein bisschen zu schwierig sein, mit dem Speicher auf diese Weise herumzuspielen. – MicroVirus

+0

@MicroVirus Danke für die Hilfe. Wenn du sagst: "Konstruiere eine neue std :: string-Instanz daraus", was genau meinst du? Beziehen Sie sich auf etwas Spezifisches? – NotAshley

+0

@MicroVirus Ich habe es herausgefunden und es funktioniert jetzt! Ich kann Zeug ausgeben, aber es ist nur Kauderwelsch. Das ist immer noch besser als nichts und ich denke, es muss nur bedeuten, dass ich mich nach dem Namen umsehen muss. Danke für die Hilfe. – NotAshley

Antwort

0

Wie von MacroVirus in einem Kommentar angegeben, bestand die Lösung darin, den Wert in einem char * zu speichern und dann in eine neue std :: string-Instanz umzuwandeln. Es funktioniert jetzt einwandfrei. Hier ist die überarbeitete Funktion:

char* GetName(int Instance) { 
    return (char*)(*(int*)(Instance + 0x28)); 
} 

Vielen Dank für die Hilfe! Das hat mich verrückt gemacht.