S
/EDIT2
Im Releasemodus funktioniert alles und die Funktionsgröße ist nur 16 anstatt 56....wieso stürzt der im Debugmodus denn nun nicht ab?
/EDIT
Hab das ganze ma intern behandelt...ist vielleicht einfacher hier den Fehler zu finden, neuer Source:
typedef int (WINAPI *pMsgBox_t) (HWND, LPCSTR, LPCSTR, UINT);
typedef struct _remote_info {
pMsgBox_t pMessageBox;
} REMOTE_INFO;
static DWORD RemoteFunc(REMOTE_INFO* pInfo)
{
pInfo->pMessageBox(0,0,0,0);
return 0;
}
static void Dummy()
{
return;
}
void DllInject()
{
REMOTE_INFO Info;
ZeroMemory(&Info, sizeof(REMOTE_INFO));
HMODULE hUser = LoadLibrary("User32");
if(!hUser)
return;
Info.pMessageBox = (pMsgBox_t)GetProcAddress(hUser, "MessageBoxA");
if(!Info.pMessageBox)
return;
DWORD dFuncSize = (DWORD)Dummy - (DWORD)RemoteFunc;
DWORD dBytesToAlloc = dFuncSize + sizeof(REMOTE_INFO) + 20;
//INTERNE BEHANDLUNG:
BYTE *b = new BYTE[dBytesToAlloc];
memcpy(b, &Info, sizeof(REMOTE_INFO));
memcpy(b + sizeof(REMOTE_INFO) + 20, (LPVOID)(DWORD)RemoteFunc, dFuncSize);
HANDLE hThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)(b + 20 + sizeof(REMOTE_INFO)), (PBYTE)b, 0, 0);
if(!hThread)
return;
WaitForSingleObject(hThread, INFINITE);
delete b;
}
Gleiche Symptome wie unten...Messagebox wird erstellt und danach ist vorbei => Accessviolation :(.
Wenn ich jedoch den Thread direkt auf RemoteFunc schicke funktioniert alles...oh man was ist das?
Gruß,
Kevin
Hallo!
Ich schreibe einen kleinen DllInjecter :). Dazu wollte ich zum Test erst einmal den fremden Prozess eine MessageBox aufrufen lassen. Alles schön und gut, tut er sogar...nur nach der MessageBox stürzt er ab! Nicht nur das...nach jeder Funktion die ich dort aufrufe (und auch erfolgreich aufgerufen wird), stürzt JEDES andere Programm mit einer Accessviolation ab! Wie kann ich das verhindern?
Hier mal der wichtigste Source:
typedef int (WINAPI *pMsgBox_t) (HWND, LPCSTR, LPCSTR, UINT);
typedef struct _remote_info {
pMsgBox_t pMessageBox;
} REMOTE_INFO;
static DWORD RemoteFunc(REMOTE_INFO* pInfo)
{
pInfo->pMessageBox(0,0,0,0);
return 0;
}
static void Dummy()
{
return;
}
void InjectDll()
{
REMOTE_INFO Info;
void* pSpace = NULL;
ZeroMemory(&Info, sizeof(REMOTE_INFO));
HMODULE hUser = LoadLibrary("User32");
if(!hUser)
return;
Info.pMessageBox = (pMsgBox_t)GetProcAddress(hUser, "MessageBoxA");
FreeLibrary(hUser);
if(!Info.pMessageBox)
return;
if(!Info.pLoadLibrary)
return;
DWORD dFuncSize = (DWORD)Dummy - (DWORD)RemoteFunc;
DWORD dBytesToAlloc = dFuncSize + sizeof(REMOTE_INFO) + 20;
int iIndex = lbProcessList.GetSelectedItem();
if(iIndex == -1)
return;
DWORD pid = lbProcessList.GetItemData(iIndex);
//wie ich an die pid komme ist egal, aber es funktioniert so ;)
HANDLE hProcess = OpenProcess(PROCESS_CREATE_THREAD |
PROCESS_VM_OPERATION |
PROCESS_VM_WRITE | PROCESS_VM_READ, 0, pid);
if(!hProcess)
return;
DWORD dwBytesWritten = NULL;
DWORD dwIgnored = NULL;
pSpace = VirtualAllocEx(hProcess, 0, dBytesToAlloc, MEM_COMMIT, PAGE_READWRITE);
if(!WriteProcessMemory(hProcess, (PBYTE)pSpace, &Info, sizeof(REMOTE_INFO), &dwBytesWritten))
return;
if(!WriteProcessMemory(hProcess, (PBYTE)pSpace + 20 + sizeof(REMOTE_INFO), (LPVOID)(DWORD)RemoteFunc, dFuncSize, &dwBytesWritten))
return;
HANDLE hThread = CreateRemoteThread(hProcess, 0, 0,
(LPTHREAD_START_ROUTINE)((PBYTE)pSpace + 20 + sizeof(REMOTE_INFO)), pSpace, 0, &dwIgnored);
if(!hThread)
return;
WaitForSingleObject(hThread, INFINITE);
VirtualFreeEx(hProcess, pSpace, dBytesToAlloc, MEM_RELEASE);
CloseHandle(hThread);
CloseHandle(hProcess);
}
Wäre echt nett wenn jemand weiß woran das liegt.
Gruß,
Kevin