Код (Text): CreateProcess(NULL, "svchost.exe", NULL, NULL, 0, CREATE_SUSPENDED, NULL, NULL, &si, &pi); c.instr_push_loadlibrary_arg = 0x68; //машинный код инструкции push c.loadlibrary_arg = (DWORD)((BYTE*)p_code + offsetof(CodeInject, libraryname)); c.instr_call_loadlibrary = 0x15ff; //машинный код инструкции call c.adr_from_call_loadlibrary = (DWORD)(p_code + offsetof(CodeInject, addr_loadlibrary)); c.instr_push_exitthread_arg = 0x68; c.exitthread_arg = 0; c.instr_call_exitthread = 0x15ff; c.adr_from_call_exitthread = (DWORD)(p_code + offsetof(CodeInject, addr_exitthread)); c.addr_loadlibrary = (DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA"); c.addr_exitthread = (DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"),"ExitThread"); strcpy((char*)c.libraryname, "c:\\windows\\system32\\liba.dll" ); ctx.ContextFlags = CONTEXT_FULL; GetThreadContext(pi.hThread, &ctx); code_address = VirtualAllocEx(pi.hProcess, NULL, sizeof(c), MEM_COMMIT, PAGE_EXECUTE_READWRITE); WriteProcessMemory(pi.hProcess, code_address, &cmds, sizeof(c), NULL); ctx.Eip = (unsigned long)code_address; SetThreadContext(pi.hThread, &ctx); ResumeThread(pi.hThread); после этого процес тупо завершается.
berni Слишком много ошибок. До работоспособного кода ещё очень далеко. Ошибки начиная с того, что для c.loadlibrary_arg высчитывается бред (но падение произойдёт уже буквально на следующем после этого push'а call'е, т.к. для c.adr_from_call_loadlibrary тоже бред высчитывается), как минимум потому, что адрес кода в целевом процессе на момент расчёта ещё не известен, и заканчивая тем, что процесс ещё даже не закончил инициализацию. Так что LoadLibrary всё равно не прокатила бы. Ну и в конце концов, насколько можно судить по коду, предполагалось (именно предполагалось, т.к. реально внедряется ерунда всякая), что будет вызвана ExitThread в единственном потоке процесса. Так чего вообще можно было ожидать?
структура инжекта рабочая. после того как вызвана библиотека, сработает длл_процесс_аттач, оттуда вызовутся другие треды, поэтому этот тред можно спокойно убить.
SPA с другими да, к примеру сплайся createprocess получаю pid после создания процесса и потом делаю инжект, все хорошо. но вот при creeateprocess с CREATE_SUSPENDED нифига не пашет точнее судя про processexplorer руссиновича, длл инжектится в процесс, но он все равно завершается.
SPA Сам об этом подумал, когда отправил пост, но новый пост, только чтобы исправить, создавать не хотелось. berni Ну и что? Одной из сотни ошибок меньше. Как я уже сказал, параметр для LoadLibrary рассчитан неверно. Аргумент для косвенного вызова (FF 15) рассчитан соответственно также неверно. А был бы верно рассчитан, LoadLibrary всё равно бы не сработала, т.к. svchost ещё не закончил инициализацию. Ему нужно дать отработать самому хотя бы до точки входа.
berni хм, у меня есть мнение что твой тред не успевает создаться, поставь Sleep(10000); перед завершением потока, и проверь. Возможно конечно я ошибаюсь, но по виду именно в этом проблема.
l_inc почему не верно? после иннициализации это выглядит так Код (Text): push adr_library_name call dword ptr [loadlibrary_adr] push exit_thread_arg call dword ptr [exit_thread_adr] а что инициализация? если мы переключаем процесс на наш код, который загрузит длл, а та уже все остальные dllки? SPA пробовал, не помогло
berni После инициализации это не выглядит так. Потому что на этапе заполнения этих полей ни адрес loadlibrary_adr в целевом процессе не известен, ни адрес adr_library_name, ни exit_thread_adr. Рассчитать эти адреса появляется возможность только после вызова VirtualAllocEx. Да... кстати, правильно SPA говорит. Задержка всё равно понадобится.
Хотя нет... гоню... не понадобится. Перепутал с сишным return из основного потока. Там же по return ExitProcess вызывается, а не ExitThread.