C++ Вопрос Нужен максимально простой инжектор на c++

Everage C++ Enjoyer
Пользователь
Статус
Оффлайн
Регистрация
5 Янв 2018
Сообщения
162
Реакции[?]
50
Поинты[?]
3K
Ищу исходник самого простого инжектора на cpp, хочу посмотреть как он работает.
Желательно чтобы в консоль нужно было ввести имя процесса и имя и путь длл.
Больше ничего не требуется :roflanBuldiga:
 
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
Ищу исходник самого простого инжектора
Суть в том, чтобы создать в удаленном процессе поток, который вызовет загрузку твоей библиотеки, так что получится процесс сам ее подгрузит.
1) Первым делом надо найти LoadLibrary функцию (A/W не важно) в kernel32.dll, найти ее можно прямо в своем процессе, т.к. винда проецирует системные либы по одинаковым адресам во всех процессах, происходит это т.к. системные либы грузятся в процесс первыми и никто не может заставить их релоцироваться, а ASLR изменяет их адреса только при перезапуске системы, поэтому void* pLoadLibraryA = GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA") достаточно.
2) Затем нужно получить доступ к удаленному процессу, для этого есть функция OpenProcess() которая открывает с определенным правами по указанному идентификатору процесса. Тебе нужны права для работы с виртуальной памятью PROCESS_VM_READ,PROCESS_VM_WRITE,PROCESS_VM_OPERATION и право создавать потоки PROCESS_CREATE_THREAD. Идентификатор процесс нужно искать отдельно например по имени, после этого она выдаст хэндл с помощью которого можно работать с процессом.
3) Далее надо записать в процесс строку с именем/путем твоей библиотеки т.к. у каждого процесса свое адресное пространство и целевой процесс ничего не знает о твоей строке, для этого выделить виртуальную память VirtualAllocEx() и записать туда строку через WriteProcessMemory() включая терминирующий символ.
4) Наконец создать удаленный поток через CreateRemoteThread(), в качестве функции использовать адрес LoadLibrary, а для параметра выделенную строку. Т.к. соглашение вызовов WINAPI совпадает это сработает верно.
5) Можно закрыть хэндл процесса, очистить выделенную память вряд ли выйдет т.к. нельзя точно знать когда отработает поток, но это небольшая утечка.
Это самая самая простая версия, которая будет работать только при одинаковой разрядности инжектора и самого процесса, так же точно неизвестно удалась ли загрузка, в более продвинутом варианте нужно писать шеллкод (можно склеить с именем функции) и делать все необходимые действия.
 
Последнее редактирование:
Rias Gremory
Начинающий
Статус
Оффлайн
Регистрация
3 Май 2019
Сообщения
96
Реакции[?]
27
Поинты[?]
0
Суть в том, чтобы создать в удаленном процессе поток, который вызовет загрузку твоей библиотеки, так что получится процесс сам ее подгрузит.
1) Первым делом надо найти LoadLibrary функцию (A/W не важно) в kernel32.dll, найти ее можно прямо в своем процессе, т.к. винда проецирует системные либы по одинаковым адресам во всех процессах, происходит это т.к. системные либы грузятся в процесс первыми и никто не может заставить их релоцироваться, а ASLR изменяет их адреса только при перезапуске системы, поэтому void* pLoadLibraryA = GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA") достаточно.
2) Затем нужно получить доступ к удаленному процессу, для этого есть функция OpenProcess() которая открывает с определенным правами по указанному идентификатору процесса. Тебе нужны права для работы с виртуальной памятью PROCESS_VM_READ,PROCESS_VM_WRITE,PROCESS_VM_OPERATION и право создавать потоки PROCESS_CREATE_THREAD. Идентификатор процесс нужно искать отдельно например по имени, после этого она выдаст хэндл с помощью которого можно работать с процессом.
3) Далее надо записать в процесс строку с именем/путем твоей библиотеки т.к. у каждого процесса свое адресное пространство и целевой процесс ничего не знает о твоей строке, для этого выделить виртуальную память VirtualAllocEx() и записать туда строку через WriteProcessMemory() включая терминирующий символ.
4) Наконец создать удаленный поток через CreateRemoteThread(), в качестве функции использовать адрес LoadLibrary, а для параметра выделенную строку. Т.к. соглашение вызовов WINAPI совпадает это сработает верно.
5) Можно закрыть хэндл процесса, очистить выделенную память вряд ли выйдет т.к. нельзя точно знать когда отработает поток, но это небольшая утечка.
Это самая самая простая версия, которая будет работать только при одинаковой разрядности инжектора и самого процесса, так же точно неизвестно удалась ли загрузка, в более продвинутом варианте нужно писать шеллкод (можно склеить с именем функции) и делать все необходимые действия.
А он лишь просто попросил сурсы для изучения...
 
Похожие темы
Сверху Снизу