Доброго времени суток
Решил написать свой первый инжектор с библиотекой, библиотека инжектируется за счет CreateRemoteThread и передачи в качестве входной функции адреса LoadLibraryW и передачи адреса заранее выделенной памяти с аргументом для этой функции:
//Инжектор
LPTHREAD_START_ROUTINE lpThreadSR = (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("kernel32")),"LoadLibraryW");
HWND hwnd = FindWindow(NULL, TEXT("cpp"));
DWORD pID;
GetWindowThreadProcessId(hwnd, &pID);
HANDLE hProcess = OpenProcess(
PROCESS_CREATE_THREAD | // для CreateRemoteTnread
PROCESS_VM_OPERATION | // для VirtualAllocEx/VirtualFreeEx
PROCESS_VM_WRITE, // для WriteProcessMemory
FALSE, pID);
LPCWSTR path = L"C:\\cpp\\dll\\mydll";
DWORD sizeP = (lstrlenW(path)+1)*sizeof(wchar_t);
PVOID addr_VP = VirtualAllocEx(hProcess, NULL, sizeP, MEM_COMMIT, PAGE_READWRITE);
SIZE_T t;
if(WriteProcessMemory(hProcess, addr_VP, (LPCVOID)path, sizeP, &t)){
cout<<t<<endl;
}
HANDLE hRemoteThread = CreateRemoteThread(hProcess, NULL, 0, lpThreadSR, addr_VP, 0, NULL);
WaitForSingleObject(hRemoteThread, INFINITE);
cout<<"Ready!"<<endl;
//lpThreadSR = //(LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("kernel32")),"FreeLibrary");
//hRemoteThread = CreateRemoteThread(hProcess, NULL, 0, lpThreadSR, addr_VP, 0, NULL); //С этим плохо работало - закоментил
VirtualFreeEx(hProcess, addr_VP, sizeP, MEM_RELEASE);
cout<<hRemoteThread;
cin.get();
И сама DLL:
BOOL WINAPI DllMain(HINSTANCE hH, DWORD fdwReason, PVOID){
if(fdwReason==DLL_PROCESS_ATTACH){
HWND hwnd = FindWindow(NULL, TEXT("cpp"));
MessageBoxW(hwnd, L"э", L"э?", MB_OK);
}
return TRUE;
}
В моем случае я открываю в проводнике папку "cpp" и запускаю приложение. Инжект проходит успешно - смотрю через ProcessHacker. В некоторых версиях даже получалось показывать всплывающее окно, правда оно после закрытия либо опять "выбывало" приложение, либо всплывающие окна бесконечно появлялись (после нажатия на "Ок" всплывало новое)