inj dll что это

Внедрение своего кода в адресное пространство процессов

Intro

Внедрение своего кода( динамически ) в чужие процессы — штука достаточно интересная. Это может служить как во благо, так и во зло. Хотя, понятие «зло», местами, весьма абстрактно в информационном мире, я не могу провести точную границу между тем, что «плохо», а что «хорошо», тем более, если это касается внедрения кода…

В данной статье мы займемся созданием своего DLL инжектора. Что это такое, думаю, знают все. Такой способ внедрения стороннего кода достаточно популярен и удобен.

Писать DLL Injector мы будем на C++ в среде Microsoft Visual Studio 2010. Для создания динамически подключаемой библиотеки можно использовать любой инструмент, который вам по душе. Я же для создания библиотеки выбрал CodeGear RAD Studio 2009, язык Delphi( Object Pascal ).

Схема работы данного метода проста:

1) поиск и получение дескриптора нужного процесса
2) выделение памяти в процессе и последующая запись пути в DLL`ке по адресу, где произошло выделение памяти
3) создание нового потока в виртуальном пространстве процесса, дескриптор которого был получен.

Начнем с создания DLL.

Как я уже говорил, для этой цели будет использоваться язык Delphi:

Теперь добавим в DLL некоторые ресурсы, а именно — форму и кнопки для управления:

Сама DLL состоит лишь из нескольких строчек кода, которые будут отображать созданную форму. Также можно удалить все комментарии для более удобного визуального восприятия кода:

Теперь программируем интерфейс формы DLL. На форме есть две кнопки. Первая будет «убивать» родительский процесс( т.е процесс, в виртуальном пространстве которого был создан поток, в котором, в свою очередь, выполняется код DLL ). Вторая — рисовать 10 квадратов размером 25x25px в контексте всех окон приложения, принадлежащих процессу:

Тут все достаточно просто.
Итак, динамическая библиотека написана. Теперь компилируем ее и на выходе получаем скомпилированный файл с расширением «.dll», который можно переименовать для удобства. Я переименую библиотеку в «inj.dll».

Создание DLL завершено.
Осталось лишь скопировать нашу DLL`ку в системную директорию Windows, чтобы любое приложение могло отыскать её лишь по одному имени.

Переходим к разработке инжектора. Идем в Visual Studio и создаем Пустой проект( File->New->Project->Visual C++->General->Empty Project). Вся разработка будет производиться на «чистом» WinApi.

Первым делом создадим простейший визуальный интерфейс: форма, кнопка и текстовое поле. Выглядеть это будет примерно так:

Как видно, это приложение, обладающее минимальным дизайном и простейшим интерфейсом. В нем присутствуют два текстовых поля, предназначенных для ввода имени процесса( или его определенной части ), в который требуется произвести инжектирование DLL и для ввода имени самой DLL. Кнопка, соответственно, запускает процесс инжекта.

Для инжекта DLL в адресное пространство процессов понадобятся следующие WinApi функции:

Итак, обдумаем, как же, собственно организовать «умную» архитектуру приложения, которая была бы понятной и простой.
Я предлагаю начать с обработки щелка по кнопке 🙂

Ок, далее, переходим к реализации функции

которая служит для поиска процесса по его имени:

И, наконец, завершающая процесс инжектирования функция

Полный код инжектора можно посмотреть здесь.

Тестируем работоспособность инжектора:

Сначала инжектимся «сами в себя». При клике на кнопку «Draw» происходит рисование 10 квадратов. При клике на «Crash it!» происходит немедленное завершение «родительского» процесса. Теперь попробуем инжектиться во что-нибудь посерьезнее, например, в браузер Mozilla Firefox. Для этого необходимо поменять лишь имя процесса в первом текстовом поле и нажать на кнопку:

Как видно, инжект успешно удался. Квадраты рисуются во всех окнах, принадлежащих родительскому процессу браузера. При нажатии на кнопку «Crash it!» Mozilla FireFox немедленно закрывается.

Outro

Для чего нам это вообще нужно? Ведь наша основная цель — это взлом( игр, софта ). Так вот в дальнейшем мы, наверняка, будем использовать этот инжектор для внедрения своего кода в чужое адресное пространство. Благодаря этому можно сэкономить немало времени, сил и нервов 🙂

Источник

Как исправить ошибки «Не найден Inj_repl.dll» [РЕШЕНО]

Как правило, проблемы с inj_repl.dll возникают в результате повреждения, а также случайного или намеренного удаления файла DLL из места расположения других файлов M Mercury Interactive WinRunner. Возникновение подобных проблем является раздражающим фактором, однако их легко устранить, заменив файл DLL, из-за которого возникает проблема. Мы также рекомендуем выполнить сканирование реестра, чтобы очистить все недействительные ссылки на inj_repl.dll, которые могут являться причиной ошибки.

Читайте также:  что делать если карман не открывается

Формат Dynamic Link Library с расширением файла DLL классифицируют в качестве Системные файлы. Inj_repl.dll для %%os%% и почти для всех версий операционной системы Windows можно скачать ниже. К сожалению, в настоящее время в нашей базе могут отсутствовать некоторые версии файлов inj_repl.dll, но их можно запросить, нажав на кнопку Request (Запрос). Если ниже отсутствует необходимая версия файла, мы рекомендуем вам связаться непосредственно с Mercury Interactive (Israel) Ltd..

Если вы успешно заменили соответствующий файл в соответствующем месте, у вас больше не должно возникать проблем, связанных с inj_repl.dll. Однако мы рекомендуем выполнить быструю проверку, чтобы окончательно в этом убедиться. Попробуйте повторно запустить M Mercury Interactive WinRunner, чтобы проверить, появляется ли сообщение об ошибке.

Inj_repl.dll Описание файла
File: DLL
Тип приложения: Data,Systems
Новейшие программы: M Mercury Interactive WinRunner
Версия программного обеспечения: 7.5
Компания: Mercury Interactive (Israel) Ltd.
Имя файла: inj_repl.dll Запрос
Байт: 32833
SHA-1: a6eefc3d7bf6500856c795957dcef55b7df33027
MD5: 1446e7f470841da2e958d2dcb427e7c0
CRC32: a7302239

Идентификатор статьи: 730405

Inj_repl.dll

Выберите программное обеспечение

Источник

DLL Injection

DLL инъекция дает возможность выполнять свой код в адресном пространстве уже запущенного процесса. Многие используют инфицирования для написания читов для игр, выполнения вредоносных действий для системы и т.п. Но данный прием не обязательно применять для реализации коварных планов, а например, для обновления своего приложения.

Алгоритм работы очень просто, нам нужно создать поток в процессе и внедрить в него выполнения нашего кода. Для примера, мы инфицируем explorer.exe и выведем сообщение об этом.

Опишем структуру, через которую мы получим необходимые нам данные:

typedef FARPROC (WINAPI *LPMessageBox)(HWND, LPCWSTR, LPCWSTR, UINT);

typedef struct _InjectData <
char title[50];
char msg[50];
LPMessageBox MessageB;
> InjectData, *PInjectData;

static DWORD WINAPI InjectionMain(LPVOID lpParams) <

PInjectData info = (PInjectData)lpParams;

info->MessageB(NULL, (LPCWSTR)info->msg, (LPCWSTR)info->title, MB_OK);
return 0;
>

В нашем примере она довольно таки проста. В нем мы не выполняем подгрузку DLL, хотя для большинства задач вам это может быть необходимо, для этого необходимо передать указатели на ф-ции LoadLibrary и GetProcAddress, также как мы это делам для MessageBoxA, и при помощи их подгружать необходимые вам DLL.

Теперь нам нужно получить доступ к explorer.exe, записать наш код, данные в адресном пространстве процесса и создать поток в процессе для выполнения нашего кода.

Опишем ф-цию которая возвращает идентификатор процесса:

DWORD getProcessID() <
DWORD processID = 0;
HANDLE snapHandle;
PROCESSENTRY32 processEntry = <0>;

if ( (snapHandle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)) == INVALID_HANDLE_VALUE ) <
return 0;
>

processEntry.dwSize = sizeof (PROCESSENTRY32);
Process32First(snapHandle, &processEntry);
do <
if ( wcscmp(processEntry.szExeFile, PROCESSNAME) == 0 ) <
return processEntry.th32ProcessID;
>
> while (Process32Next(snapHandle,&processEntry));

Теперь у нас есть все для того, что бы получить доступ к процессу:

DWORD processID = getProcessID();
HANDLE hCurrentProc = GetCurrentProcess();

if (processID == 0) <
MessageBox(NULL, _T( «Process not found!» ), _T( «Error» ), MB_OK | MB_ICONERROR);
return 0;
>

HINSTANCE userHinstance = LoadLibrary(_T( «user32.dll» ));
injectData.MessageB = (LPMessageBox) GetProcAddress(userHinstance, «MessageBoxA» );

VirtualAllocEx — предоставляет физическую память в виртуальном адресном пространстве процесса, а WriteProcessMemory записывает наши данные в память процесса.

Теперь создадим поток в процессе, который воплотит наш коварный план в жизнь:

DWORD ThreadID;
HANDLE hThread = CreateRemoteThread(processHandel, NULL, 0, (LPTHREAD_START_ROUTINE)lpProc, lpParams, 0, &ThreadID);
if (hThread == NULL) <
sprintf_s(buffer, «Error creating thread» );
addLogMessage(buffer, 1001);
>

Источник

Файл формата DLL: чем открыть, описание, особенности

Современные программы состоят из нескольких модулей, которые включают в себя массивы данных, классы.

Современные программы состоят из нескольких модулей, которые включают в себя массивы данных, классы, сервисы, требуемые библиотеки. Такой подход разрешает при переписывании ПО не редактировать полностью код, а изменять только необходимые функции, которые заключены в составных частях. Так как открыть DLL файл стандартными средствами Windows невозможно, приходится использовать другие методы.

Файлы с расширением DLL – что это и для чего нужны

Файлы DLL – это динамически подключаемые библиотеки. Установленная в операционную систему программа может не иметь в своем составе всех нужных для работы данных, а использовать те, которые уже присутствуют в ОС. За счет этого также достигается экономия памяти – работающие программы используют одни и те же DLL.

Если же программа (или библиотека) будет повреждена, то это не скажется на работоспособности остального ПО.

Когда и как появились

Библиотеки DLL появились одновременно с ОС Windows. Разработчики предполагали, что это облегчит программирование приложений и поможет упорядочить использование общих ресурсов в течение сеанса работы.

Но со временем выяснилось, что в ряде случаев возникает тупиковая ситуация, которая получила название «DLL hell». Такое случалось, когда два или более приложений требуют доступа к разным (и не совместимым друг с другом) библиотекам. В результате Windows начинала работать нестабильно.

Только в последних версиях ОС удалось создать механизм, предотвращающий возникновения сбоев – технологию Side-by-side assembly, который испытали в XP, но окончательно он стал применяться в Windows Vista.

Программный код ОС Windows – проприетарный. Это значит, что разработчики не предусмотрели штатных средств, применяя которые, пользователь сможет менять системный код. Для открытия DLL придется использовать специальные программные пакеты. А подключать имеющиеся DLL к разрабатываемой программе можно с применением ПО Microsoft.

В Windows 10

Пользователи, работающие в десятой версии Windows, не всегда знают, чем открыть DLL. Для подключения библиотеки к проекту понадобится либо Visual Studio, либо VisualFoxPro. Эти программные комплексы доступны для скачивания на официальном портале компании Microsoft. Для редактирования допускается использовать ResourceHacker – утилиту для ознакомления и редактирования различных типов файлов.

Чтобы открыть динамически подключаемую библиотеку, следует нажать в главном меню:

Из чего состоит рабочая область программы ResHacker:

В Windows 7

Проблема – чем открыть DLL для редактирования в операционной системе Windows 7 решается так же как и для 10 версии. Еще применяется утилита Resource Tuner – редактор ресурсов. Она дает возможность менять код в DLL на свое усмотрение и сохранять библиотеки.

В онлайн-сервисах

Это понадобится, если речь идет о страницах сайта. В DLL содержатся скрипты, которые отвечают за корректную работу сервера.

Открыть библиотеки можно, используя браузеры:

Как открыть DLL, используя Visual Studio

Программная среда Visual Studio дает возможность создавать, подключать DLL к текущему проекту и редактировать его. Для этого используется синтаксис языка программирования.

Особенности работы с DLL файлами и возможные проблемы

Некоторые DLL не удастся не только изменить, но даже открыть. Это происходит с защищенными библиотеками и проблема не решается без специальных программ для взлома.

Пользователи также сталкиваются с отсутствием библиотек, необходимых для работы некоторых программ. ОС при этом выдает сообщение о том, что «файл не найден». Для устранения неисправности требуется отыскать недостающие DLL с помощью поисковых систем и скачать. Затем – поместить в требуемую папку.

В редких случаях библиотеки DLL придется зарегистрировать в ОС:

В качестве итога

Работой с DLL занимаются программисты, но опытным пользователям также полезно будет знать основы работы с динамически подключаемыми библиотеками. Это может пригодиться для изменения или извлечения данных из файлов прикладных программ.

Источник

DLL-Injecting на Delphi

Лет 5-7 назад, когда файрволы еще были
экзотикой, трояны для работы с сетью могли
использовать обычный TCP/IP. Вспомним,
например, Back Orifice группы Cult of a Dead Cow. Этот
троян получил большое распространение в
конце прошлого века и стал классикой backdoor.
Многие трояны, написанные после, так или
иначе его копировали. Работал Back Orifice так: на
машине жертвы из автозагрузки в реестре
запускался сервер, который открывал
заданный порт и ждал. Хакер на своей машине
запускал программу-клиент, коннектился к
серверу по TCP/IP и спокойно посылал ему
команды. Сервер эти команды выполнял и так
же спокойно отсылал клиенту результаты. А
глупый пользователь как ни в чем не бывало
продолжал лазить по порносайтам =) Как тогда
все было просто, правда?

А что если прикинуться броузером?

Техника DLL-INJECTING через ловушки

Эта техника известна троянмейкерам уже
давно. Она позволяет внедрить свою DLL в
адресное пространство чужого процесса (injecting
— по англ. «внедрение»). Техника
основана на том, что Windows позволяет
программам устанавливать так называемые
ловушки (hooks, «хуки») на сообщения
системы. Обычно ловушки используются
программами в сугубо мирных целях. Например,
переключатель языков Windows устанавливает
ловушку на сообщения от клавиатуры, что бы
знать, какие клавиши нажаты. Но ловушки
могут быть использованы и троянами, что бы
прорваться мимо файрвола в сеть.

Сначала попробуем просто загрузить dll_name с
помощью API LoadLibrary. При успешной загрузке эта
API должна вернуть нам идентификатор (его еще
называют «хэндл») загруженной DLL. Этот
идентификатор мы поместим в переменную h
типа THandle:

Здесь и дальше константа DLL_INJ содержит
заголовок окна messagebox’а:

const DLL_INJ = ‘DLL Injector (HOOKS)’;

Это сделано просто для удобства, что бы
каждый раз не перенабирать заголовок
заново.

Теперь с помощью API GetProcAddress найдем в
загруженной DLL адреса функций HookProc и SetHK. Что
это за функции нам станет ясно дальше. Код:

type TShp = procedure (hk: HHOOK) stdcall;

А вот и кусок кода, который все это делает:

Однако тут все не так просто, как кажется на
первый взгляд. Функция HookProc в dll_name не может
быть какой попало, она должна иметь
определенный вид. Какой? Сейчас увидим.

Создадим в Delphi шаблон DLL. В Delphi 7 это File=>New=>Other=>New=>DLL
Wizard, в других версиях или точно так же, или
похоже. Удалим из шаблона все и впишем туда:

library hook_dll;
uses Windows;
begin
end.

Затем сохранимся под именем hook_dll (скомпилированная
библиотека таким образом будет называться
hook_dll.dll). Теперь вобьем функцию HookProc:

Но мы отвлеклись, давайте вернемся к
функции HookProc. Передача сообщения
осуществляется с помощью API CallNextHookEx. Причем
специфика ловушек состоит в том, что HookProc
должна вернуть значение, которое получится
в результате работы CallNextHookEx.

Посмотрим на параметры CallNextHookEx. С nCode, wParam,
lParam все ясно. А вот что такое _hook? Ответ на
этот вопрос зависит от версии Windows. В 9x/ME это
обязательно должен быть идентификатор
ловушки, который мы получили с помощью
SetWindowsHookEx. В 2000/XP _hook может быть просто 0.
Получается, что если мы работаем под 9x/ME, мы
должны как-то передать идентификатор
ловушки в библиотеку. Помните, в самом
начале, сразу после загрузки DLL с помощью
LoadLibrary мы находили в ней адрес функции SetHK? В
hook_dll.dll эта функция выглядит так:

var
// _hook обьявляется
глобальной переменной в hook_dll
// типа HHOOK со значением по
умолчанию 0
_hook: HHOOK = 0;

// собственно, сама
процедура
procedure SetHK(hk: HHOOK) stdcall;
begin
_hook:=hk;
end;

SetHK передает идентификатор ловушки в нашу DLL,
поэтому ее необходимо вызвать в процедуре
установки хука сразу после SetWindowsHookEx. Что мы
и сделаем =)

sh(hk);

Правда, если вы собираетесь работать только
под Windows 2000/XP, функция SetHK не обязательна. Как
уже было сказано, _hook в этом случае может
быть равно 0 (мы, кстати, так и прописали по
умолчанию). Поэтому SetHK можно вообще убрать
из hook_dll, а в процедуре внедрения DLL не искать
адрес и не вызывать ее.

Надо сказать, что здесь есть еще одна
тонкость, которую мы сегодня обсуждать не
будем. Она совсем не чувствуется на Windows 9x/ME/2000/XP.
Но если вы попытаетесь ставить ловушки в
Windows NT и писать все это на Delphi, вам придеться
здорово попотеть, что бы передать
идентификатор ловушки в DLL. Это связано с
тем, что компилятор Delphi очень криво
поддерживает так называемые shared-секции. Но
не надо о грустном =), тем более кто сейчас
помнит NT?

Теперь о процедуре WorkWithNet. Выглядит она так:

Ловушка работает, пока запущена EXE-программа,
которая ее установила. После завершения
этой EXE система снимает ловушку
автоматически. Если ловушку нужно снять до
завершения установившей ее программы,
воспользуйтесь API UnhookWindowsHookEx. В качестве
единственного параметра ей надо передать
идентификатор ловушки:

Вот, собственно, и вся техника DLL-injecting с
помощью ловушек =)

Стоит, сказать о некоторых проблемах,
которые возникают при использовании DLL
injecting через ловушки.

Во вторых, без прав администратора в 2000/XP
троянская DLL не сможет внедриться в
системные процессы (типа winlogon.exe), даже если
те имеют окна. Но это тоже не большая
проблема. Браузер в большинстве случаев
запускается как обычный процесс и для
доступа к нему никаких особых прав не нужно.
Например, код к этой статье нормально
работает с Internet Explorer 6.0 под «Гостем» в
Windows XP SP2.

Запусти браузер сам!

Отвечаю: спокойно, все предусмотрено!
Допустим, мы хотим запустить Internet Explorer.
Вызовем ShellExecute так:

ShellExecute(0, ‘open’, ‘iexplore.exe’, nil, nil, SW_HIDE);

Поэтому когда мы сами откроем Internet Explorer по
умолчанию, пользователь (или, как говорит
дотошный читатель, «ламер») ничего не
заметит. Увидеть и закрыть запущенный таким
образом браузер можно только в менеджере
задач, по Ctr+Alt+Del. Кстати, в Windows 2000/XP для этого
понадобится зайти на вкладку «Процессы»,
потому что на вкладке «Приложения»
iexplore.exe не видно =)

Увы, моя статья не резиновая, потому нам
придется поговорить о таких тонкостях в
следующий раз. А на сегодня я прощаюсь с
вами. Bye =)

Источник

Сказочный портал