DLL导致程序仅在分配内存时崩溃

时间:2013-04-16 07:44:31

标签: c++ memory-management dll malloc code-injection

我正在编写一个小DLL,一旦注入我的目标进程,就会找到hwnd并将窗口的文本写入文件。我有这样的设置:

hWnd = FindWindow(L"tSkMainForm",NULL);
chat = FindWindowEx(hWnd, NULL, L"TConversationForm", NULL);
ofstream myfile("X:\\Handles.txt", ios::out | ios::app);
if (myfile.is_open())
{
    int len;
    len = SendMessage(chat, WM_GETTEXTLENGTH, 0, 0) + 1; // + 1 is for the null term.
    char* buffer = new char[len];
    SendMessageW(chat, WM_GETTEXT, (WPARAM)len, (LPARAM)buffer);
    myfile.write(buffer,len); /* << buffer <<endl; */
    myfile.close();
    delete[] buffer;
}

它适用于看似随机的时间,然后应用程序(Skype)崩溃。它只在我分配内存时崩溃。我尝试过使用malloc

char* buffer = (char*)malloc(len); //I even tried removing "(char*) before malloc
//Do the rest of the stuff here
free((void*) buffer);

但那也崩溃了。

我的DLL调用CreateThread,通过AppendMenu添加一个额外的菜单项,并完美地处理它的消息。似乎分配内存不想工作,但只是在随机时间。我不确定,但我认为Skype覆盖了我的记忆,或者我覆盖了Skype的记忆(我怎么能确保两者不会互相覆盖?)

另外,我知道Skype存在一个API,但我想这样做。如果我想写一个认真的程序,我会使用Skype API。 感谢。

1 个答案:

答案 0 :(得分:0)

当然它崩溃了。 “在另一个进程中注入一个DLL”是你不应该首先做的事情,而当然并非如果你无法解决这个问题。

你的问题是你的DLL假设它正在运行的环境。特别是,你假设有一个C ++堆(或一个C堆,用于malloc),并且它具有正确的状态你的计划。事实并非如此。普通的C ++规则不适用于注入的DLL;你的DLL必须能够站在自己的腿上。