Простой метод внедрения DLL, делаем свой Simple Dll Injection


X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 117
Репутация
8 235
Правда забыл указать первоисточник.
Сорри !

Правильное замечание, обычно так не делаю...

Статья просто сборная из нескольких источников, плюс кое-что добавил от себя, это не просто копипаст !

Но поправил правильно, нужно всегда указывать авторство, с этим согласен !WinkSmile
 

PackagedCat

Пользователь
Форумчанин
Регистрация
08.07.2019
Сообщения
3
Здравствуйте! А есть рабочий вариант на Delphi для 64 битных систем? Что-то у меня никак не получается сделать внедрение DLL на этом языке, при том, что на C++ получилось сделать внедрение DLL библиотеки, написанной на Delphi.
 

virt

Просветленный
Просветленный
Регистрация
24.11.2016
Сообщения
706
Репутация
228
Здравствуйте! А есть рабочий вариант на Delphi для 64 битных систем?
А собираете как, для x64 ?

Там язык не важен, важно реализовать прототипы функций и соглашение о вызывах.

Вот тут более подробно написанно:
 

PackagedCat

Пользователь
Форумчанин
Регистрация
08.07.2019
Сообщения
3
А собираете как, для x64 ?

Там язык не важен, важно реализовать прототипы функций и соглашение о вызывах.

Вот тут более подробно написанно:

Да, собираю для x64, иначе в GetLastError получу ошибку 5 (ERROR_ACCESS_DENIED).

По поводу реализации, то согласен главное чтобы функции реализовать правильно, даже делал код идентичным тому, что написан на C++, в котором внедрение работает, но без результата. Делал отладку программы, все функции возвращают значения, GetLastError выдает 0, но DLL не внедряется. Хотя, в самом начале программы, почему-то получаю ошибку 122 (ERROR_INSUFFICIENT_BUFFER), но в самой функции внедрения ошибки не вылезают.

Есть ещё такой момент при использовании следующей функций:
WriteProcessMemory(Hdl, ParamAddr, PAnsichar(DllName), Length(DllName), BytesWrite);

Практически во всех примерах последним параметром (BytesWrite) выступает тип Cardinal, но у меня почему-то требует тип NativeUInt для x32 или UINT64 для x64. Может быть из-за этого проблемы?
 

virt

Просветленный
Просветленный
Регистрация
24.11.2016
Сообщения
706
Репутация
228
Хотя, в самом начале программы, почему-то получаю ошибку 122 (ERROR_INSUFFICIENT_BUFFER)
Переполнение буфера у вас, да скорей-всего что-то с типами данных у вас, например если вы передадите в uint32_t тип uint64_t, то во первых у вас будет потеря данных, а во вторых если обращаться к uint32_t, как с uint64_t то ещё и за пределы памяти выйдете, короче много-чего весёлого здесь.)
 

PackagedCat

Пользователь
Форумчанин
Регистрация
08.07.2019
Сообщения
3
Переполнение буфера у вас, да скорей-всего что-то с типами данных у вас
Сейчас создал пустое консольное приложение и также вначале поставил GetLastError, но там тоже выдает ошибку 122. Похоже эта ошибка происходит при инициализации где-то "внутри Delphi", но думаю она не причастна к моей проблеме.

например если вы передадите в uint32_t тип uint64_t, то во первых у вас будет потеря данных, а во вторых если обращаться к uint32_t, как с uint64_t то ещё и за пределы памяти выйдете, короче много-чего весёлого здесь.)
Что касается этого, то другой тип я всё равно не могу поставить, ведь так объявлена функция.

П.С. Ещё раз глянул в исходники программы на C++, так там вообще в функции WriteProcessMemory в качестве последнего параметра передается NULL (nullptr) + ещё размер буфера имени файла вычисляется по следующему методу
unsigned long long size = wcslen(lpdllpath) * sizeof(TCHAR)

Пытался подобное реализовать на Delphi:
size = Length(DllName) * SizeOf(PChar); //size - SIZE_T = ULONG_PTR = NativeUInt
Но результата не дал (да и не знаю правильно ли сделал)
 
Верх Низ