C++ DLL ---> Crash

11/18/2013 03:29 Doktor.#1
Hey,

hab mir vorhin mal eine DLL gecodet, die DLL fungiert als Client von einem Server, die DLL wird dabei in ein Game injectet.

Der Code der main
Code:
BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		CreateThread(0, 0, &Function, 0, 0, 0);
		break;
	case DLL_THREAD_ATTACH:
		break;
	case DLL_THREAD_DETACH:
		break;
	case DLL_PROCESS_DETACH:
		 MessageBoxA(0, "DLL_PROCESS_DETACH", "",0);
		break;
	}
	return TRUE;
}
Anfangs funktioniert alles, aber sobald ich in Game z.B. die Auflösung änder oder auf Fullscreen wechsel, hängt sich das Game auf...

Bzw. wird:
Code:
case DLL_PROCESS_DETACH:
		 MessageBoxA(0, "DLL_PROCESS_DETACH", "",0);
		break;
aufgerufen, solange das Programm versucht die Auflösung zu wechseln und wenn ich auch lange genug warte, funktioniert das Game und die DLL auch wieder.

Weis jemand zufällig, wie ich verhindern kann, dass das Game sich aufhängt?


Mfg. ~Wystan
11/19/2013 14:55 Doktor.#2
Weis den niemand woran es liegt?
11/19/2013 19:43 Dr. Coxxy#3
was machste denn in "Function"?
11/19/2013 20:28 Doktor.#4
Anfangs wartet die Funktion aufn Server, wenn die connected sind wartet er auf eine Nachricht, das andere dürfte eig. nicht das Problem sein, da es schon crasht wenn er aufn Server wartet.
11/21/2013 13:23 Doktor.#5
Falls es hilft, das Game ist NosTale
11/21/2013 14:58 Dr. Coxxy#6
wenn du den createthread weglässt - crashts dann auch?
11/21/2013 15:17 Doktor.#7
Jop, hatte ich anfangs so und dachte mit CreateThread würde es funktionieren, war leider nicht der Fall.
11/21/2013 15:49 Dr. Coxxy#8
lass mal die messagebox im detach weg und ruf kein createthread auf, also quasi ne leere dll injecten die einfach nix macht.
11/21/2013 16:23 Doktor.#9
Leer Funktioniert sie
11/21/2013 16:26 Dr. Coxxy#10
dann lass halt die messagebox im detach weg wenn die zum crash führt?
11/21/2013 16:29 Doktor.#11
Asoo, dachte du meinst ich solle alles weg machen, also komplett leer ohne irgendeine Funktion^^.
Stürzt natürlich auch ab, wenn ich die MessageBox entferne

Hier mal der Code:
Code:
///*
class CConsole {
	FILE m_OldStdin, m_OldStdout;
	bool m_OwnConsole;
public:
	CConsole();
	~CConsole();
};

static BOOL WINAPI MyConsoleCtrlHandler(DWORD dwCtrlEvent) { return dwCtrlEvent == CTRL_C_EVENT; }
//*/

class NTString
{
public:
	DWORD length;
	char command[256];

	NTString(char *string)
	{
		length = strlen(string);
		memcpy(command, string, length);
		command[length] = 0;
	}
};

//-------- Variablen Deklarieren ---------
std::string packet;
int first = 0;
long conn;
bool checkState[2];

SOCKET s;
SOCKADDR_IN addr;

HWND winNos;
HWND winNTKit;
CConsole *console;

DWORD pID;
//---------Functionen Deklarieren---------
char buffer[256];

int startWinsocket(void);
int main();

void searchNTKitServer();
void RecievePackets();
void setValues();
void SEND_TO_SERVER(char *packet);
void NosTale_Send(char *buffer);

//----------Console Deklarieren----------

CConsole::CConsole() : m_OwnConsole(false) {
	if (!AllocConsole()) return;

	SetConsoleCtrlHandler(MyConsoleCtrlHandler, TRUE);
	RemoveMenu(GetSystemMenu(GetConsoleWindow(), FALSE), SC_CLOSE, MF_BYCOMMAND);
	const int in = _open_osfhandle(INT_PTR(GetStdHandle(STD_INPUT_HANDLE)), _O_TEXT);
	const int out = _open_osfhandle(INT_PTR(GetStdHandle(STD_OUTPUT_HANDLE)), _O_TEXT);
	m_OldStdin = *stdin;
	m_OldStdout = *stdout;

	*stdin = *_fdopen(in, "r");
	*stdout = *_fdopen(out, "w");

	m_OwnConsole = true;
}

CConsole::~CConsole() {
	if (m_OwnConsole) {
		fclose(stdout);
		fclose(stdin);
		*stdout = m_OldStdout;
		*stdin = m_OldStdin;
		SetConsoleCtrlHandler(MyConsoleCtrlHandler, FALSE);
		FreeConsole();
	}
}


//------Alle Functionen Definieren-------
void SEND_TO_SERVER(char *packet)
{

	DWORD SEND_EAX = ******, SEND_ADDR = *******;

	__asm
	{
		MOV EAX, DWORD PTR DS : [SEND_EAX]
		MOV EAX, DWORD PTR DS : [EAX]
		MOV EAX, DWORD PTR DS : [EAX]
		MOV EDX, packet
			CALL SEND_ADDR
	}
}

void NosTale_Send(char *buffer)
{
	NTString str(buffer);
	SEND_TO_SERVER(str.command);
	return;
}

void searchNTKitServer()
{
	if (first == 1)
	{
		closesocket(s);
		closesocket(conn);
		setValues();
	}
	conn = connect(s, (SOCKADDR*)&addr, sizeof(SOCKADDR));
	while (conn == SOCKET_ERROR)
	{
		conn = connect(s, (SOCKADDR*)&addr, sizeof(SOCKADDR));
	}
}

DWORD WINAPI AttachSucess(LPVOID unused)
{

	pID = GetProcessId(GetCurrentProcess());
	main();

	return 0x0;
}

void RecievePackets()
{
	recv(s, buffer, 256, 0);//Packete recieven
	if (buffer != "")//Abfrage ob Packet angekommen ist
	{
		NosTale_Send(buffer);//Send Packet zu Nostale
		cout << buffer << endl << endl;//Packet ausgabe
		memset(buffer, '\0', 256);//Leere das recievte Packet
	}
}

void setValues()
{
	if (first == 1)
	{
		s = socket(AF_INET, SOCK_STREAM, 0);
		memset(&addr, 0, sizeof(SOCKADDR_IN));
	}
	addr.sin_family = AF_INET;
	addr.sin_port = htons(5555);
	addr.sin_addr.s_addr = inet_addr("127.0.0.1");
}

//------------------------------------------
int main()
{
	MessageBoxA(0, "Main started", "", MB_ICONERROR);
	if (startWinsocket() == 0)
	{
		s = socket(AF_INET, SOCK_STREAM, 0);
		if (s != INVALID_SOCKET)
		{
			memset(&addr, 0, sizeof(SOCKADDR_IN));

			setValues();
			searchNTKitServer();
			first = 1;

			stringstream ss;
			ss << pID;

			packet = ss.str();

			send(s, packet.data(), sizeof(packet), 0);

			//Console starten
			console = new CConsole();

			//Haupt-Schleife
			while (true)
			{
				RecievePackets();
			}
		}
	}
	return 0;
}

int startWinsocket(void)
{
	WSADATA wsa;
	return WSAStartup(MAKEWORD(2, 0), &wsa);
}

//------------------------------------------
BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		CreateThread(0, 0, &AttachSucess, 0, 0, 0);
		break;
	case DLL_THREAD_ATTACH:
		break;
	case DLL_THREAD_DETACH:
		break;
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}
11/21/2013 21:26 Padmak#12
Eieiei..
Code:
class NTString
{
public:
	DWORD length;
	char command[256];

	NTString(char *string)
	{
		length = strlen(string);
		memcpy(command, string, length);
		command[length] = 0;
	}
};
Was passiert denn, wenn length > 255?

Ruf mal in deiner DllMain [Only registered and activated users can see links. Click Here To Register...] auf, damit reduzierst du die Aufrufe derselben.

Code:
recv(s, buffer, 256, 0);//Packete recieven
if (buffer != "")//Abfrage ob Packet angekommen ist
Bist du dir wirklich SICHER, dass man so auf angekommene Packets überprüft?

Alles in allem ist dein Code ziemlich instabil, der Crash könnte überall sein bzw von allem verursacht werden.

Padmak
11/21/2013 22:53 Doktor.#13
Quote:
Originally Posted by Padmak View Post

Code:
recv(s, buffer, 256, 0);//Packete recieven
if (buffer != "")//Abfrage ob Packet angekommen ist
Bist du dir wirklich SICHER, dass man so auf angekommene Packets überprüft?
Padmak
Ob man dies so überprüft bin ich mir nicht so ganz sicher, bin noch nicht der Erfahrenste in dem Bereich.

Das andere werde ich nachher mal versuchen, danke.


#Edit
Danke, Problem ist jetzt dank [Only registered and activated users can see links. Click Here To Register...] weg