Перейти к содержанию

DLL Injector специфичный [c++]


Рекомендуемые сообщения

Добрый день.

 

Хочу создать DLL Injector. Очень оригинально, правда?)) На самом деле, не совсем.

Есть одна особенность: DLL'ка должна быть в ресурсах проекта. Идеальное решение для социопатов. Не доверять пользователю ничего) Даже дллку держать в себе.

Проблема в том, не знаю как реализовать. Сам код инжектора уже готов:

 

Нужно как-то воткнуть в проект дллку (в ресурсы). 

Кто знает, как сделать?

 

З.ы. Видел подобное у keng'a. Но у него это с Directx состовляющей, у меня по другому. Пытался переделать. Вырезал весь directx мусор ненужный код, написал создание консоли на WINAPI. 

Первая проблема была - консоль быстро закрывается. В обычном проекте - сустем пауз. Тут не сработало (over 200 warning'ov), помогло _getch();

Вторая проблема (критическая) - текст не выводится на экран. cout не работает, printf тоже.

 

Заранее спасибо!

#include <iostream>#include <Windows.h>#include <TlHelp32.h>using namespace std;bool InjectorDLL(DWORD ProcessID);char FileToInject[] = "mytemp.dll";char ProcessName[] = "notepad.exe";typedef HINSTANCE(*fpLoadLibrary)(char*);int main(){	setlocale(LC_ALL, "Russian");	SetConsoleTitle ("GameInjector");	DWORD processId = NULL;	PROCESSENTRY32 pe32 = {sizeof(PROCESSENTRY32)};	HANDLE hProcSnap;		while (!processId)	{		system("cls");		//cout << "Process Name == Game.exe" << endl;		cout << "DLL Name == mytemp.dll" << endl;		cout << "DLL Path == С:\\" << endl << endl;		cout << "Searching " << ProcessName << " ..." << endl;		hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);		if (Process32First(hProcSnap, &pe32))		{			do			{				if(!strcmp(pe32.szExeFile, ProcessName))				{					processId = pe32.th32ProcessID;					break;				}			}			while(Process32Next(hProcSnap, &pe32));		}		Sleep(1000);	}	while(!InjectorDLL(processId))	{		system("cls");		cout << "Я не смог заинжектить твою библиотеку :(" << endl;		Sleep(1000);	}	cout << "Ваша библиотека успешно внедрена!" << endl;	cout << "Закрываю инжектор через 5 секунд" << endl;	Sleep(1000);	cout << "Закрываю инжектор через 4 секунд" << endl;	Sleep(1000);	CloseHandle(hProcSnap);	cout << "Закрываю инжектор через 3 секунд" << endl;	Sleep(1000);	cout << "Закрываю инжектор через 2 секунд" << endl;	Sleep(1000);	cout << "Закрываю инжектор через 1 секунд" << endl;	Sleep(1000);			return 0;}bool InjectorDLL(DWORD ProcessID){	HANDLE hProc;	LPVOID paramAddr;		HINSTANCE hDll = LoadLibrary("kernel32");	fpLoadLibrary LoadLibraryAddr = (fpLoadLibrary)GetProcAddress(hDll, "LoadLibraryA");	hProc = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID);		char dllPath[250] = "C:\\";	strcat(dllPath, FileToInject);	paramAddr = VirtualAllocEx(hProc, 0, strlen(dllPath)+1, MEM_COMMIT, PAGE_READWRITE);	bool memoryWritten = WriteProcessMemory(hProc, paramAddr, dllPath, strlen(dllPath)+1, NULL);	CreateRemoteThread(hProc, 0 , 0 , (LPTHREAD_START_ROUTINE)LoadLibraryAddr, paramAddr, 0, 0);	CloseHandle(hProc);	return memoryWritten;} 
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Запихиваешь DLL-ку в ресурсы с типом RCDATA

Далее используешь функции FindResource, LockResource, SizeOfResource, memcpy, FreeResource, CreateFile, WriteFile, CloseFile. Порядок необязательно такой, как я привел, но все эти функции используются. Хотя мог одну-две и забыть. Читай описания, и думай. Если не получится, приводи примеры своего кода, подскажем, где ошибка.

 

Далее, поскольку длл-ка у тебя извлекается уже после старта проги, то и грузить ее придется вручную - LoadLibrary и тд и тп.

Ссылка на комментарий
Поделиться на другие сайты

Для отладочных целей текст можно выводить не на экран, а в файл. В чем такая офигенная особенность, кроме того что dll будет лежать в ресурсах?

Ссылка на комментарий
Поделиться на другие сайты

Для отладочных целей текст можно выводить не на экран, а в файл. В чем такая офигенная особенность, кроме того что dll будет лежать в ресурсах?

Создает видимость того, что это внешний external трейнер. У меня, на самом деле, немного посложнее идейка. Полностью описать не могу, т.к. нужно её еще реализовать. Как реализую - мигом презентую на GameHackLab :)

Ссылка на комментарий
Поделиться на другие сайты

чел, меня изза тебя скоро тут забанят :D

лучше рискни сделать самоинжекторную длку ака cpl, будешь выделятся среди кучи нубов xD

хмм твой код:

1 там после CreateRemoteThread ты забыл WaitForSingleObject а потом закрыть хендл потока и освободить память

2 задай размер стека CreateRemoteThread в 4096 иначе он будет по размеру из хидера ехе игры (иногда там слишком много) 3 параметр

3 юзай W (уникод) иначе некоторые юзера будут очень часто видеть "Я не смог заинжектить твою библиотеку :(" особенно китайские lol

4 длку пиши в темп (как на странном видео выше) а не в С. времена хп прошли

5 зачем делать "GetProcAddress LoadLibrary" если ты можешь добавить ее в импорт инжектора...

6 вероятно долбаные антивири будут ставить дофига детектов на такой инжектор, так что добавь какую-то примитив шифро или в upx его

7 правильно создавай файл когда достанешь из ресурса: CreateFileW,[FilePath],GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0

Ссылка на комментарий
Поделиться на другие сайты

1 там после CreateRemoteThread ты забыл WaitForSingleObject а потом закрыть хендл потока и освободить память

Ответ - зачем, если поток, выполнив функцию (если она не зациклена), завершится сам? 

2 задай размер стека CreateRemoteThread в 4096 иначе он будет по размеру из хидера ехе игры (иногда там слишком много) 3 параметр

3 юзай W (уникод) иначе некоторые юзера будут очень часто видеть "Я не смог заинжектить твою библиотеку :(" особенно китайские lol

На любой современной винде А-функции лишь врапперы для W-функций. Любой нуб это знает, а уж такой крутой проггер, могущий написать самоинжектируемую cpl - и подавно.

4 длку пиши в темп (как на странном видео выше) а не в С. времена хп прошли

С этим согласен

5 зачем делать "GetProcAddress LoadLibrary" если ты можешь добавить ее в импорт инжектора...

А если делать инжектор, чтобы юзер сам мог выбирать свою длл?

6 вероятно долбаные антивири будут ставить дофига детектов на такой инжектор, так что добавь какую-то примитив шифро или в upx его

Антивири срабатывают почти на все, что модифицирует чужую память, так что это тупо придирка.

7 правильно создавай файл когда достанешь из ресурса: CreateFileW,[FilePath],GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0

Ну и нахрена создааать файл с разделенным доступом во время первой его записи? Нефига к нему в это время вообще обращаться.

 

 

И да, напиши-таки dll, которая сама инжектится с хуком dx9, да ещё чтоб она не требовала эскалацию привилегий - думаю всем будет очень интересно взглянуть на это в деле.

Ссылка на комментарий
Поделиться на другие сайты

И да, напиши-таки dll, которая сама инжектится с хуком dx9, да ещё чтоб она не требовала эскалацию привилегий - думаю всем будет очень интересно взглянуть на это в деле.

 

Это кому?


чел, меня изза тебя скоро тут забанят :D

Почему? :D

Яж не для онлайн игр спрашиваю... Да и ты не для онлайн игр отвечаешь))


У меня есть видео урок по этой теме на канале.

Печально (

Нет исходников. А ты подключаешь неизвестные какие-то GDI библиотеки.

Ссылка на комментарий
Поделиться на другие сайты

воу

1 тестани. удивишся - винда не закроет его сама +насколько помню на мсдн индусы писали что надо закрывать самому

2 да ну? создай папку на китайском/японском брось туда длл и пробуй инжект через А

5 имел ввиду CreateRemoteThread,ebx,0,4096,[LoadLibraryW],edi,0,0 типа напрямую из импорта. C ведь так может хех

6 на примере вирьтотал и той кучи пародий на антивири - ефект будет

7 хммм интересно оно создаст файл на шареном диске без?

 

хз о чем ты. не вижу разницы между инжектом exe+dll и dll которая косит под cpl и которая сама себя инжектит будучи загруженой в rundll32.

Ссылка на комментарий
Поделиться на другие сайты

По поводу второго пункта - в MSVS давно есть поддержка типа "общих" вызовов функций (без аффикса A или W), а нужная функция выбирается исходя из настроек проекта. Зачем так сделано - хз, да и я уже давно на вижле не пишу, но факт. Закрывать хэндлы и освобождать память, которая выделилась - таки полезная привычка, ибо не придется помнить, в потоке твой код или еще где-нибудь. Как правильно сказал кодер, современные AV - параноики и подозревают любые бинарники сколько-нибудь нестандартного вида - маленького размера, с собственным заголовком\загрузчиком, с "кривыми" секциями, без импорта, использующие функции работы с памятью. От всего этого избавляет пометка "false positive" в nfo, но это - уже другая история.

 

Автор, я не зря спросил, в чем особенность твоего будущего инжектора. Ты ответил, что сформулировать идею полностью не можешь. Это плохо, так как если не можешь сформулировать полностью идею - реализовать тоже не сможешь, а пытаться реализовывать "по ходу" - так себе затея.

Ссылка на комментарий
Поделиться на другие сайты

По поводу второго пункта - в MSVS давно есть поддержка типа "общих" вызовов функций (без аффикса A или W), а нужная функция выбирается исходя из настроек проекта. Зачем так сделано - хз, да и я уже давно на вижле не пишу, но факт. Закрывать хэндлы и освобождать память, которая выделилась - таки полезная привычка, ибо не придется помнить, в потоке твой код или еще где-нибудь. Как правильно сказал кодер, современные AV - параноики и подозревают любые бинарники сколько-нибудь нестандартного вида - маленького размера, с собственным заголовком\загрузчиком, с "кривыми" секциями, без импорта, использующие функции работы с памятью. От всего этого избавляет пометка "false positive" в nfo, но это - уже другая история.

Автор, я не зря спросил, в чем особенность твоего будущего инжектора. Ты ответил, что сформулировать идею полностью не можешь. Это плохо, так как если не можешь сформулировать полностью идею - реализовать тоже не сможешь, а пытаться реализовывать "по ходу" - так себе затея.

Нет, дело не в формулировке. Боюсь, что не сбудется)
Ссылка на комментарий
Поделиться на другие сайты

воу

1 тестани. удивишся - винда не закроет его сама +насколько помню на мсдн индусы писали что надо закрывать самому

 

Тестанул. Закрылось. Не удивился.

 

2 да ну? создай папку на китайском/японском брось туда длл и пробуй инжект через А

 

Инжект не пробовал, но почему-то старый проект, построенный полностью в ANSI (с А-функциями), прекрасно заработал из этой папки.

 

5 имел ввиду CreateRemoteThread,ebx,0,4096,[LoadLibraryW],edi,0,0 типа напрямую из импорта. C ведь так может хех

Работать с регистрами без _asm директивы напрямую? Сомневаюсь, что Си так может, хех

 

6 на примере вирьтотал и той кучи пародий на антивири - ефект будет

Виртотал и иже с ним первыми начинают верещать, если файл чем-то пожат.

 

7 хммм интересно оно создаст файл на шареном диске без?

Создаст. Ибо тот флаг, что ты указал, прописывается для разделенного доступа к самому файлу и никакого отношения к Самбе (сетевая инфраструктура винды) не имеет.

 

хз о чем ты. не вижу разницы между инжектом exe+dll и dll которая косит под cpl и которая сама себя инжектит будучи загруженой в rundll32.

 

Ты имел неосторожность заикнуться, что чтобы выбиться из толпы нубов надо написать такой инжектор. И ТЫ же строишь из себя тру-проггера. Исходя из твоей же логики, ты должен быть в состоянии написать инжектор, который у тебя попросил Кодер. Жду от тебя этого инжектора откомментированными на инглише исходниками. И если хотя бы часть этого исходника я каким-либо образом найду в гугле, значит, исходник не твой. И, следовательно, ты трепло. Точка.

Ссылка на комментарий
Поделиться на другие сайты

Ты имел неосторожность заикнуться, что чтобы выбиться из толпы нубов надо написать такой инжектор. И ТЫ же строишь из себя тру-проггера. Исходя из твоей же логики, ты должен быть в состоянии написать инжектор, который у тебя попросил Кодер. Жду от тебя этого инжектора откомментированными на инглише исходниками. И если хотя бы часть этого исходника я каким-либо образом найду в гугле, значит, исходник не твой. И, следовательно, ты трепло. Точка.

Уиии ^_^

Страсти накаляются)))

Ждем развязки))

Изменено пользователем Xipho
Первое устное за флуд и оффтоп. ЗЫ. Запасаемся попкорном.
Ссылка на комментарий
Поделиться на другие сайты

Тестанул. Закрылось. Не удивился.

окее: создай 1000 потоков в пустую проц. потом слип главного потока. посмотри сколько хендлов в диспетчере задач до/после. потом закрой вручную.

 

Инжект не пробовал, но почему-то старый проект, построенный полностью в ANSI (с А-функциями), прекрасно заработал из этой папки.

тогда возьми ollydbg2 и посмотри как она зафейлит загрузку ДЛЛ из папки с японским названием. loaddll.exe юзает А

 

Работать с регистрами без _asm директивы напрямую? Сомневаюсь, что Си так может, хех

я о ссылке на импорт LoadLibraryW без конструкции "GetProcAddress(hDll, "LoadLibraryA")"

 

Ты имел неосторожность заикнуться, что чтобы выбиться из толпы нубов надо написать такой инжектор. И ТЫ же строишь из себя тру-проггера. Исходя из твоей же логики, ты должен быть в состоянии написать инжектор, который у тебя попросил Кодер. Жду от тебя этого инжектора откомментированными на инглише исходниками. И если хотя бы часть этого исходника я каким-либо образом найду в гугле, значит, исходник не твой. И, следовательно, ты трепло. Точка.

такие методы мало кто юзает = будет выделятся. в другой теме (скрытие длл, в флудилке) я накинул как оно выглядит (метод мало чем отличается от ехе варианта), его может ЛЮБОЙ сделать за ~15мин. Кодера вааааашее не понял. код инжекта в DLL_PROCESS_ATTACH остальное НЕВАЖНО.

автор темы хотел "специфичный" инжект - я подал еще более спец. вариант. очень сомнительно что он не сможет его реализ.

 

Ссылка на комментарий
Поделиться на другие сайты

 

окее: создай 1000 потоков в пустую проц. потом слип главного потока. посмотри сколько хендлов в диспетчере задач до/после. потом закрой вручную.

Вот сейчас вообще этого потока мыслей не понял.

 

 

тогда возьми ollydbg2 и посмотри как она зафейлит загрузку ДЛЛ из папки с японским названием. loaddll.exe юзает А

Ну кто ж  виноват, что эта прога из состава олли так криво написана? Вполне себе вероятно, что суть фейла вовсе не в вызове анси функций.

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

 

 

я о ссылке на импорт LoadLibraryW без конструкции "GetProcAddress(hDll, "LoadLibraryA")"

И снова я тебя вообще не понял. В этом случае получается адрес заинжекченной длл-ки, и нет никакой гарантии, что она будет загружена в ту же область пространства, если ее грузить через LoadLibrary самим инжектором, так что ты вообще бред какой-то сказал. Или поясни свои слова.

 

 

такие методы мало кто юзает = будет выделятся. в другой теме (скрытие длл, в флудилке) я накинул как оно выглядит (метод мало чем отличается от ехе варианта), его может ЛЮБОЙ сделать за ~15мин. Кодера вааааашее не понял. код инжекта в DLL_PROCESS_ATTACH остальное НЕВАЖНО.

автор темы хотел "специфичный" инжект - я подал еще более спец. вариант. очень сомнительно что он не сможет его реализ.

Что и требовалось доказать - дошло до дела, ты в кусты. Несколькими постами ранее ты говорил, что нужно этот твой cpl инжектор сделать, чтобы выбиваться из толпы нубов. Теперь говоришь, что ЛЮБОЙ может сделать этот инжектор. Тему, про которую ты говоришь, что-то не увидел, может она и есть. Но если она даже есть, и там нет примеров твоего (подчеркиваю - твоего) кода - твои слова остаются лишь словами. В общем, слился ты, дружище. Все с тобой ясно. Не строй из себя того, кем ты не являешься, и перестань пороть чушь, а лучше вместе с ребятами разбирай код. Глядишь, что-то полезное сделаешь. За сим тему обсуждения считаю исчерпанной. Дальнейшие попытки снова ее поднять буду считать оффтопом и (или) флудом и наказывать по всей строгости. Я все сказал.

Ссылка на комментарий
Поделиться на другие сайты

Вот сейчас вообще этого потока мыслей не понял.

проехали. читай мсдн

 

 

Ну кто ж  виноват, что эта прога из состава олли так криво написана? Вполне себе вероятно, что суть фейла вовсе не в вызове анси функций.

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

норм она написана. в даном случае это фейл именно А. а то что внутри А функций видел. получается W даже быстрее работает lulz

 

 

И снова я тебя вообще не понял. В этом случае получается адрес заинжекченной длл-ки, и нет никакой гарантии, что она будет загружена в ту же область пространства, если ее грузить через LoadLibrary самим инжектором, так что ты вообще бред какой-то сказал. Или поясни свои слова.

PUSH 0

PUSH 0

PUSH EDI

PUSH DWORD PTR [<&kernel32.LoadLibraryW>] <--- видел на С так делалИ. ЭТО не бред xD

PUSH 1000

PUSH 0

PUSH EBX

CALL DWORD PTR [<&kernel32.CreateRemoteThread>]

 

 

Что и требовалось доказать - дошло до дела, ты в кусты. Несколькими постами ранее ты говорил, что нужно этот твой cpl инжектор сделать, чтобы выбиваться из толпы нубов. Теперь говоришь, что ЛЮБОЙ может сделать этот инжектор. Тему, про которую ты говоришь, что-то не увидел, может она и есть. Но если она даже есть, и там нет примеров твоего (подчеркиваю - твоего) кода - твои слова остаются лишь словами. В общем, слился ты, дружище. Все с тобой ясно. Не строй из себя того, кем ты не являешься, и перестань пороть чушь, а лучше вместе с ребятами разбирай код. Глядишь, что-то полезное сделаешь. За сим тему обсуждения считаю исчерпанной. Дальнейшие попытки снова ее поднять буду считать оффтопом и (или) флудом и наказывать по всей строгости. Я все сказал.

*facepalm

кст поискал FILE_SHARE_WRITE, оказалось без него у некоторых были странные фейлы CreateFile - так что все правильно задал там.

 

Ссылка на комментарий
Поделиться на другие сайты

 

кст поискал FILE_SHARE_WRITE, оказалось без него у некоторых были странные фейлы CreateFile - так что все правильно задал там.

Отвечу только на это, по остальному уже и так все ясно. FILE_SHARE_WRITE дает разделенный доступ, чтобы сразу несколько потоков (или приложений) могли в него писать. Такое поведение у приложения запрограммировано - да, этот флаг нужен. Но в случае инжектора с извлечением длл-ки из ресурсов такое поведение абсолютно не нужно и даже вредно, следовательно - флаг лишний. Учи матчасть.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.