Добрый день, пытаюсь сделать инжект в notepad.exe Код (Text): typedef int ( WINAPI*tMessageBox)(HWND hWnd,char* lpText,char* lpCaption,UINT uType); struct ADDRS { char * mod; char * func; char * txt; }; #define CHADDR(type,x) ((##type)((DWORD)(x) + (DWORD)(hMem) - (DWORD)(hInst))) DWORD WINAPI Foo(ADDRS* s); int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { ADDRS addrs; char mod[] = "User32.dll"; char func[] = "MessageBoxA"; char txt[] = "HALO THAR"; HINSTANCE hInst = GetModuleHandle(NULL); DWORD hSize = ((IMAGE_NT_HEADERS32*)((DWORD)((IMAGE_DOS_HEADER *)hInst)->e_lfanew+(DWORD)hInst))->OptionalHeader.SizeOfImage; /*,,,*/ HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS,false,pentry32.th32ProcessID); if(hProc==INVALID_HANDLE_VALUE) MessageBox(NULL,L"Couldn't open process",L"Error",MB_OK); LPVOID hMem = VirtualAllocEx(hProc,NULL,hSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE); if(!hMem) MessageBox(NULL,L"Failed to allocate memory",L"FAIL",MB_OK); DWORD dwBytes; WriteProcessMemory(hProc,hMem,hInst,hSize,&dwBytes); if(dwBytes!=hSize) MessageBox(NULL,L"Failed to write to prcoess",L"Error",MB_OK); DWORD pID; addrs.func = CHADDR(char*,func); addrs.mod = CHADDR(char*,mod); addrs.txt = CHADDR(char*,txt); HANDLE hRemoteThread=CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)((DWORD)hMem + (DWORD)Foo - (DWORD)hInst), (LPVOID)((DWORD)hMem-(DWORD)hInst+(DWORD)&addrs), NULL, &pID); //VirtualFreeEx(hProc,hMem,hSize,MEM_RELEASE); return 0; } DWORD WINAPI Foo(ADDRS* x) { HMODULE hMod = LoadLibraryA(x->mod); tMessageBox pMessageBox = (tMessageBox)GetProcAddress(hMod,x->func); return pMessageBox(NULL,x->txt,x->txt,MB_OK); } Пытаюсь инжектить Foo. notepad.exe падает с access violation. Что я делаю не так? В процесс нормально пишется. В рассчетах адреса вроде бы не ошибся. в инжектируемой функции где-то ошибка значит. Может она это, не базонезависисмая? Заранее спасибо.
jaja Это просто ужос, а не инжект. Вам стоит ооочень подробно прочитать статьи. Внедрять весь свой образ - это... не знаю такого нехорошего слова, которое могло бы охарактеризовать Ваши действия. И откуда у Вас вообще может быть базонезависимость, если компилятор для вызова API (LoadLibraryA, GetProcAddress) посчитал одни смещения, а Вы пихаете их по совсем другим: у Вас же вся таблица импорта смещена.
А есть книга какая-нибудь по этой теме? В рихтере про инжект длл только. Или статья хотя-бы, где бы описывались основные шаги. А то в асме пока что не силен.
jaja http://www.wasm.ru/series.php?sid=14 http://www.wasm.ru/series.php?sid=8 http://www.wasm.ru/article.php?article=1021007 http://www.wasm.ru/article.php?article=fwb http://www.wasm.ru/article.php?article=window_inject Хватит выше крыши. А начать лучше с первых двух ссылок.
Нифига не понятно http://www.wasm.ru/article.php?article=fwb Пример с Инжектим чистый код. InjectCode: call $+5 pop esi sub esi, $-InjectCode-1 Почему мы прыгаем на 5 байт вперед? И откуда эта магическая единица в последней строке?
jaja Размер инструкции call (относительный прямой вызов) - 5 байт. Поэтому call $+5 передаст управление на pop esi. А как Вы думаете, что окажется в стэке после call $+5? А $-InjectCode-1 - это расстояние от метки InjectCode до адреса pop esi, т.е. как раз 5 байт (длина call'а). А вообще я же сказал: читайте, начиная с первых ссылок. Если бы прочитали про дельта-смещение из первой главы "От зеленого к красному", было бы понятно.