Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2013, 12:54   #1
Mr_ViK
Форумчанин
 
Регистрация: 12.08.2011
Сообщений: 124
По умолчанию [TUT] Inject Dll class for Delphi

В течении двух дней я искал такой класс в просторах интернета и не нашел ничего лучше чем класс на с++.
Чтобы впреть люди не сидели часами в гугле в посках такого класса, я написал свой (основываясь на классе для с++)

Использование:
Код:
uses:injectDll
var
  a:injector;
begin
  a:=injector.Create();

  a.setWait(true{/false}); // выполнять ли ожидание завершения потока и отчистку памяти от кода загрузчика

  if not (a.inject(ProcessID,'имя длл')) then //внедрение ДЛЛ
     ShowMessage(a.getErr()); //получение ошибки

  if not (a.inject(ProcessID,'имя длл')) then //выгрузка ДЛЛ
     ShowMessage(a.getErr()); //получение ошибки

  a.Destroy();
end;
(pas файл во вложениях)

ЗЫ: для загрузки dll можно использовать пути типа ../../test.dll , test.dll , C:/test.dll класс выполняет преобразование пути до полного.
ЗЫЫ: для выгрузки dll, ее имя должно быть типа имя_длл.dll, никаких путей

ЗЫЫЫ: если тему написал не туда(или она не нужна) можете переместить(удалить)

ЗЫЫЫЫ: Автор класса - я, автор asm кода - kaimi
Вложения
Тип файла: zip injectDll.zip (2.3 Кб, 53 просмотров)

Последний раз редактировалось Mr_ViK; 09.08.2013 в 13:06.
Mr_ViK вне форума Ответить с цитированием
Старый 09.08.2013, 14:21   #2
vovken1997
Дружелюбный
Форумчанин
 
Аватар для vovken1997
 
Регистрация: 23.02.2012
Сообщений: 692
По умолчанию

Ну, ты как минимум плохо искал. Вот работающая функция для инжекта:
Код:
function InjectDLL(dwPID: DWORD; DLLPath: PWideChar): integer;
var
 dwThreadID: Cardinal;
 hProc, hThread, hKernel: THandle;
 BytesToWrite, BytesWritten: SIZE_T;
 pRemoteBuffer, pLoadLibrary: Pointer;
begin
 hProc := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_VM_READ, False, dwPID);
 if hProc = 0 then exit(0);
 try
   BytesToWrite := SizeOf(WideChar)*(Length(DLLPath) + 1);
   pRemoteBuffer := VirtualAllocEx(hProc, nil, BytesToWrite, MEM_COMMIT, PAGE_READWRITE);
   if pRemoteBuffer = nil then exit(0);
   try
     if not WriteProcessMemory(hProc, pRemoteBuffer, DLLPath, BytesToWrite, BytesWritten) then exit(0);
     hKernel := GetModuleHandle('kernel32.dll');
     pLoadLibrary := GetProcAddress(hKernel, 'LoadLibraryW');
     hThread := CreateRemoteThread(hProc, nil, 0, pLoadLibrary, pRemoteBuffer, 0, dwThreadID);
     try
       WaitForSingleObject(hThread, INFINITE);
     finally
       CloseHandle(hThread);
     end;
   finally
     VirtualFreeEx(hProc, pRemoteBuffer, 0, MEM_RELEASE);
   end;
 finally
   CloseHandle(hProc);
 end;
 exit(1);
end;
Первый параметр - PID процесса, Второй - путь к DLL.
Этот код работает на Delphi XE3!

Если будет нужен готовый инжектор, пиши???
-==ЛЮБОЕ ЗНАНИЕ ДОСТИГАЕТСЯ ТОЛЬКО СОБСТВЕННЫМИ УСИЛИЯМИ!!!==-

Последний раз редактировалось vovken1997; 09.08.2013 в 14:25.
vovken1997 вне форума Ответить с цитированием
Старый 09.08.2013, 14:49   #3
Mr_ViK
Форумчанин
 
Регистрация: 12.08.2011
Сообщений: 124
По умолчанию

Нус, может и плохо искал) Дело в том что функцию загрузки не сложно найти, а вот как выгрузить ее весь инет перелазил)
Mr_ViK вне форума Ответить с цитированием
Старый 09.08.2013, 14:53   #4
vovken1997
Дружелюбный
Форумчанин
 
Аватар для vovken1997
 
Регистрация: 23.02.2012
Сообщений: 692
По умолчанию

А зачем выгружать???
-==ЛЮБОЕ ЗНАНИЕ ДОСТИГАЕТСЯ ТОЛЬКО СОБСТВЕННЫМИ УСИЛИЯМИ!!!==-
vovken1997 вне форума Ответить с цитированием
Старый 09.08.2013, 16:02   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Mr_ViK,
Цитата:
а вот как выгрузить ее весь инет перелазил)
а на официальный источник даже не заходили.
Освободить DLL саму себя и привязанный к ней поток
Человек_Борща вне форума Ответить с цитированием
Старый 09.08.2013, 16:04   #6
vovken1997
Дружелюбный
Форумчанин
 
Аватар для vovken1997
 
Регистрация: 23.02.2012
Сообщений: 692
По умолчанию

Ну да. Всего строчка, правдо я никогда не освобождаю
-==ЛЮБОЕ ЗНАНИЕ ДОСТИГАЕТСЯ ТОЛЬКО СОБСТВЕННЫМИ УСИЛИЯМИ!!!==-
vovken1997 вне форума Ответить с цитированием
Старый 09.08.2013, 16:15   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от vovken1997 Посмотреть сообщение
Ну да. Всего строчка, правдо я никогда не освобождаю
выгружать нужно если длл больше не нужна, но приложение еще живет.

кстати и при инжекте длл(точнее при написании оной длл), если не нужно не забываем отключать уведомления о потоках.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват функции (Inject) Alexey_68 Общие вопросы C/C++ 1 27.05.2013 10:34
Ошибка в libcef.dll только с Delphi 7, в Delphi XE3 - нет noname_06 Общие вопросы Delphi 6 08.05.2013 06:49
Class Delphi Dimabara Компоненты Delphi 0 23.03.2013 16:19
dll inject Nebro Общие вопросы Delphi 9 24.08.2011 03:21
Установка пути к своим Class Library (.dll) Руслантус Общие вопросы .NET 9 01.03.2011 14:13