[ASM] Richtig komisches Problem

11/18/2014 22:09 EasyFarm#1
Hey. Ich habe in C++ ein Projekt für ein MMORPG gemacht. Es ist eine DLL, die im Spiel einiges ausliest wie Leben etc. aber auch andere Sachen automatisiert mittels ASM. So weit so gut. Das MMORPG läd DLL Dateien automatisch mit, wenn man die DLL im Ordner des Spieles hat, und sie in .mix statt .dll umbenennt. Alles funktioniert.
Nun mein Problem: Starte ich die DLL via Injector (Hab viele probiert), crasht das Spiel wenn man ingame ist (Ingame werden erst Timer etc. zum Auslesen aktiviert). Nun gut, also hab ich überall Messageboxen gemacht und geguckt worans liegt. Es liegt am Auslesen des Lebens, was als MIX Datei funktioniert. Mache ich ein __try davor, crasht das Spiel nicht, aber die Funktion gibt mir 0 aus. Also garnichts. Merke: Als Mix geht genau diese Funktion auch :D
Das komische: Alles andere, auch andere ASM Funktionen funktionieren. Auch wenn die die Funktion per Button aufrufe, nichts.
Hier ist die Funktion:

Code:
void GetHealth() {
        DWORD value;
	DWORD typ = 0x05;
	__asm {
   	MOV ECX, [Statuspointer]
	MOV EAX, [ECX + 05]
	MOV EDX, [EAX + 11]
	ADD ECX, 5
	PUSH typ
	CALL EDX
	MOV value, EAX
	}
}
Was ist damit los? Warum geht alles nur nicht diese Funktion wenn ich es injecte? Als Mix funktioniert das ja alles, auch das Auslesen des Lebens.
Es ist echt schwierig dieses Problem zu beschreiben..
Vielleicht kennt sich ja jemand aus. Vielleicht mache ich ja einen Fehler.

Danke sehr :)
Mfg. Easy
11/18/2014 22:43 Dr. Coxxy#2
debugger anwerfen und nachgucken.
vermutlich ist einer davon:
Code:
   	MOV ECX, [Statuspointer]
	MOV EAX, [ECX + 05]
	MOV EDX, [EAX + 11]
ungültig oder == 0.
von wo rufste denn auf, aus der dllmain?
evtl. da was nicht initialisiert/gültig weils als mix vom spielthread aufgerufen wird, beim injector aus dem remote thread.

kann es sein, dass die gethealth funktion i-wie ziemlich sinnfrei ist, speichert den wert in ner lokalen variable, gibt nix zurück oder aus O.o

und wieso benutzst du ü-haupt assembler, das meiste geht auch direkt mit c/c++ - und das viel sauberer.
11/18/2014 22:45 EasyFarm#3
Hey :)

Doch hab nur den Teil wo die Funktion in einer Variable speichert rausgenommen zur Übersicht. Daran lags auch nicht.

Hier meine main.cpp:

Quote:
#include "linker.h"
#include <windows.h>




BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){

switch(fdwReason)
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hinstDLL);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Main, NULL, 0, NULL);

break;
}
return true;
}
Ich glaube es liegt auch daran, dass ich da was nicht initialisiere, denn auch eine andere Funktion gibt ohne einen Try einen Error (Als DLL), funktioniert aber dennoch.
Wie löse ich das denn am besten?
Könnte natürlich die Mix immer in den Ordner vom Spiel schicken per Launcher, aber injecten ist mir da lieber.

Mfg.
11/19/2014 14:59 bloodx#4
Was für eine Funktion callst du ? __thiscall ?

MOV EDX, [EAX + 11]
ADD ECX, 5

nicht add edx, 5 ?

weil du veränderst ecx machst aber danach nichts mehr damit.

CreateThread wird so nicht benutzt - nimm lieber std::thread oder schau dir an wie man es richtig macht.
12/10/2014 09:34 nukeyou#5
Hast du schon probiert die Register in den stack zu pushen und vor dem beenden mit pop zurückzuschreiben?

Vielleicht standen in ECX oder EDX wichtige Werte.
12/11/2014 06:11 Tyrar#6
1. wäre es durchaus hilfreich zu sagen, dass es sich um Metin2 handelt.
2. wäre es nicht sinnvoller dir einen Wrapper für die Funktion oder Klasse zu schreiben?
12/11/2014 15:03 +Yazzn#7
Versuch das ganze mal in etwa so: [Only registered and activated users can see links. Click Here To Register...]
Verstehe nicht weshalb du das unbedingt mit asm machen willst.
12/17/2014 13:23 buFFy!#8
Inline ASM kannst du in den meisten Fällen vermeiden, solltest du auch unbedingt tun. std::function oder die oldschool typedefs (oder die neuen mit 'using') sind da ziemlich klasse.
Wie oben schon erwähnt wurde hast du hier wahrscheinlich einfach threading issues, dein crash liegt vermutlich einem invaliden TLS zugrunde. NtSetInformationThread kann dir da abhilfe schaffen, oder du hookst einfach nen Spielthread.

Thread-local storage ? Wikipedia
12/18/2014 09:57 Mi4uric3#9
Code:
Statuspointer
Wann & wie liest du den aus?
Ich gehe davon aus, dass du eine Art FindPattern benutzt?