|
You last visited: Today at 14:10
Advertisement
C++ DLL ---> Crash
Discussion on C++ DLL ---> Crash within the C/C++ forum part of the Coders Den category.
11/18/2013, 03:29
|
#1
|
elite*gold: 0
Join Date: Aug 2011
Posts: 1,190
Received Thanks: 549
|
C++ DLL ---> Crash
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
|
#2
|
elite*gold: 0
Join Date: Aug 2011
Posts: 1,190
Received Thanks: 549
|
Weis den niemand woran es liegt?
|
|
|
11/19/2013, 19:43
|
#3
|
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
|
was machste denn in "Function"?
|
|
|
11/19/2013, 20:28
|
#4
|
elite*gold: 0
Join Date: Aug 2011
Posts: 1,190
Received Thanks: 549
|
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
|
#5
|
elite*gold: 0
Join Date: Aug 2011
Posts: 1,190
Received Thanks: 549
|
Falls es hilft, das Game ist NosTale
|
|
|
11/21/2013, 14:58
|
#6
|
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
|
wenn du den createthread weglässt - crashts dann auch?
|
|
|
11/21/2013, 15:17
|
#7
|
elite*gold: 0
Join Date: Aug 2011
Posts: 1,190
Received Thanks: 549
|
Jop, hatte ich anfangs so und dachte mit CreateThread würde es funktionieren, war leider nicht der Fall.
|
|
|
11/21/2013, 15:49
|
#8
|
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
|
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
|
#9
|
elite*gold: 0
Join Date: Aug 2011
Posts: 1,190
Received Thanks: 549
|
Leer Funktioniert sie
|
|
|
11/21/2013, 16:26
|
#10
|
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
|
dann lass halt die messagebox im detach weg wenn die zum crash führt?
|
|
|
11/21/2013, 16:29
|
#11
|
elite*gold: 0
Join Date: Aug 2011
Posts: 1,190
Received Thanks: 549
|
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
|
#12
|
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
|
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  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
|
#13
|
elite*gold: 0
Join Date: Aug 2011
Posts: 1,190
Received Thanks: 549
|
Quote:
Originally Posted by Padmak
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  weg
|
|
|
All times are GMT +1. The time now is 14:11.
|
|