Дата: Понедельник, 13.08.2012, 23:27 | Сообщение # 1
Постоянный
Зарегистрирован: 13.12.2011
Группа: Пользователи
Сообщений: 100
Статус: Offline
Как исполнить чужое приложение в контексте своего без порождения дочерних процессов? Возможно ли это в принципе? Что-то как-то странно поставили мне задачу... Совсем ужас какой-то... Может у кого хоть теоретические идеи есть? Можно ли совсем не использовать CreateProcess?? Поделитесь...
Сообщение отредактировал Android - Понедельник, 13.08.2012, 23:28
1.) Получаешь Peb процесса. Из Peb'а узнаешь ImageBaseAddress: NtQueryInformationProcess. 2.) Читаем с помощью NtReadVirtualMemory из памяти процесса ImageNtHeaders и ImageDosHeader по адресу ImageBaseAddress. 3.) Узнаём AddressOfEntryPoint из ImageNtHeaders . 4.) Получаем размер образа процесса. 5.) Читаем его себе в буфер. 6.) Правим релоки. 7.) Выставляем нужные аттрибуты секциям, если требуется: NtProtectVirtualMemory. 8.) Создаём замороженный поток: RtlCreateUserThread с начальным адресом AddressOfEntryPoint. 9.) Пишем в него образ из буфера: NtWriteVirtualMemory. 10.) Устанавливаем нужный контекст для потока, если нужно: NtSetContextThread 11.) Размораживаем поток: NtResumeThread. 12.)
Сообщение отредактировал Волк-1024 - Вторник, 14.08.2012, 13:53
тут выкладывали модули от MS-REM'а (и я в том числе (даже я раньше)), так там есть функция, позволяющая целиком экзешку запустить из адресного пространства чужого процесса. Функция InjectEXE в модуле advapihook (прилагаю во вложении). Но почему-то всякое использование VirtualAllocEx ничего не выделяет. Демо-проекты не работают. Просто память не выделяется и все тут... Помогите разобраться...
function CopyFileToMemory(FileName: PChar; out Data: Pointer; DataSize: Cardinal=0): Cardinal; { Если DataSize будет 0, то выделится память в размер файла. Её нужно освободить с помощью FreeMemory. Размер памяти для освобождения будет на выходе. } label Exit; var OFS: TOFStruct; FileSize: Cardinal; hFile, ReadByte: DWORD; begin Result:=0; hFile:=OpenFile(FileName, OFS, 0); if hFile<>INVALID_HANDLE_VALUE then begin FileSize:=DataSize; if FileSize=0 then begin FileSize:=GetFileSize(hFile, nil); if FileSize>0 then Data:=GetMemory(FileSize) else goto Exit; end; if ReadFile(hFile, Data^, FileSize, ReadByte, nil) then // Читаем из файла DataSize количество байт, и записываем их в Data. Result:=FileSize; Exit: CloseHandle(hFile); end; end;
Выдрал из проекта, который я пишу еще с прошлого года
Сообщение отредактировал Волк-1024 - Вторник, 14.08.2012, 19:47
Пишу так долго не из-за нехватки знаний, а из-за трудной логики кода и моей лени. Пишу кстати по этой "теме" Т.е инжект образа файла в системный процесс.
Сообщение отредактировал Волк-1024 - Вторник, 14.08.2012, 22:00
думаю двигаться в сторону CreateRemoteThread. Вот как в билиотечке приаттаченной написано, но там как-то по ходу неработоспособно. Нагуглил тонны кода, буду разбирать...
ничего стоящего я у себя так и не нашел, но вот может быть хоть это пригодится, написал когда то давно, такой простенький пример, к сожалению не позволяет внедряться в системные процессы и процессы защищенные от изменений вроде антивирусов или тп. так же в данном примере я забыл добавить проверку, запущен ли наш файл из другого процесса или нет, по этому он так и будет запускаться с периодичностью в 1 сек., пока не убьешь или не перезапустишь тот процесс в который инжектился...
PS: Мне больше понравилась идея Волк-1024, если еще над этим поработать, думаю выйдет что то стоящее...
чтобы написать загрузку приложения в память своего же процесса нужно копать не в сторону API функций, а в сторону теории, разберись с PE форматом, разберись с импортами(релоки нужно реализовывать если имадж бейс твоего ехе файла не сходится с имадж байс загружаемого, поэтому этим можно пренебречь), т.е тебе прийдется загрузить все секции в память, сперва по временному адрессу, потом написать код(лично я для этого пишу шелл на асме) который перезапишет все секции твоего загруженного ехе(криптора) секциями нового ехе файла и сделать джамп на ентери поинт, еще важно чтобы имадж сайз криптора был больше или такой же как имадж сайз загружаемого ехе, иначе загрузить не получится
P.S не нужно копать в сторону API!!! выучи асм(это максимум неделя) и разберись со структурой PE(тоже 2-3 дня тебе хватит), ибо без знания теории как это должно работать ничего не получится
c@t, ткни носом, что именно мне понадобится из асма. Общее представление о нем имею (ХеллоВорлд))))).
Quote (C@T)
еще важно чтобы имадж сайз криптора был больше или такой же как имадж сайз загружаемого ехе, иначе загрузить не получится
это не так. Если ImageSize первого процесса (который нужно подменить), меньше чем целевой то нужно использовать функцию ZwUnmapViewOfSection (eлежит в ntdll.dll) а затем VirtualAllocEx для выделения достоточного объема памяти в нужном адресном пространстве.
Android, если же ты хочешь запустить программу в памяти своего процесса, то сам подумай как тебе придется это сделать, ведь когда ты вызовешь к примеру ZwUnmapViewOfSection для секции с кодом то загрузчик просто вылетит по ошибке
P.S я про загрузку в СВОЕ адресное пространство P.P.S метод загрузки в новый процесс палится, как фаерволами так и АВ
А зачем инжектить код в новый процесс, когда можно запихать код, а точнее образ в уже существующий процесс?
---------------------------------------------- Можно еще проще: выделить у себя память c помощью NtAllocateVirtualMemory с адресом выделения, который будет равняться адресом загрузки криптуемого файла, а у самого криптера сделать ImageBase какой-нибудь экзотический. И при этом нам не понадобиться править релоки, хотя это и не трудно. И дальше тупо создать в памяти поток.
Сообщение отредактировал Волк-1024 - Пятница, 17.08.2012, 13:04
Вот скан моего троя, которого я пишу с прошлого года и который использует технологию инжекта (в svchost.exe) Написан на Делфи Доступно только для пользователей И ни одного детекта инжекта, зато видит кто-то в нём дроппа, хотя в нём ничего такого нет.
Сообщение отредактировал Волк-1024 - Пятница, 17.08.2012, 13:57