RockHammer Опубликовано 25 января, 2015 Поделиться Опубликовано 25 января, 2015 Добрый день. Хочу создать 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 Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 25 января, 2015 Поделиться Опубликовано 25 января, 2015 Запихиваешь DLL-ку в ресурсы с типом RCDATAДалее используешь функции FindResource, LockResource, SizeOfResource, memcpy, FreeResource, CreateFile, WriteFile, CloseFile. Порядок необязательно такой, как я привел, но все эти функции используются. Хотя мог одну-две и забыть. Читай описания, и думай. Если не получится, приводи примеры своего кода, подскажем, где ошибка. Далее, поскольку длл-ка у тебя извлекается уже после старта проги, то и грузить ее придется вручную - LoadLibrary и тд и тп. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 25 января, 2015 Поделиться Опубликовано 25 января, 2015 Для отладочных целей текст можно выводить не на экран, а в файл. В чем такая офигенная особенность, кроме того что dll будет лежать в ресурсах? Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 25 января, 2015 Автор Поделиться Опубликовано 25 января, 2015 Для отладочных целей текст можно выводить не на экран, а в файл. В чем такая офигенная особенность, кроме того что dll будет лежать в ресурсах?Создает видимость того, что это внешний external трейнер. У меня, на самом деле, немного посложнее идейка. Полностью описать не могу, т.к. нужно её еще реализовать. Как реализую - мигом презентую на GameHackLab Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 25 января, 2015 Поделиться Опубликовано 25 января, 2015 У меня есть видео урок по этой теме на канале. Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 25 января, 2015 Поделиться Опубликовано 25 января, 2015 чел, меня изза тебя скоро тут забанят лучше рискни сделать самоинжекторную длку ака cpl, будешь выделятся среди кучи нубов xDхмм твой код:1 там после CreateRemoteThread ты забыл WaitForSingleObject а потом закрыть хендл потока и освободить память2 задай размер стека CreateRemoteThread в 4096 иначе он будет по размеру из хидера ехе игры (иногда там слишком много) 3 параметр3 юзай W (уникод) иначе некоторые юзера будут очень часто видеть "Я не смог заинжектить твою библиотеку :(" особенно китайские lol4 длку пиши в темп (как на странном видео выше) а не в С. времена хп прошли5 зачем делать "GetProcAddress LoadLibrary" если ты можешь добавить ее в импорт инжектора...6 вероятно долбаные антивири будут ставить дофига детектов на такой инжектор, так что добавь какую-то примитив шифро или в upx его7 правильно создавай файл когда достанешь из ресурса: CreateFileW,[FilePath],GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 25 января, 2015 Поделиться Опубликовано 25 января, 2015 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, да ещё чтоб она не требовала эскалацию привилегий - думаю всем будет очень интересно взглянуть на это в деле. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 25 января, 2015 Автор Поделиться Опубликовано 25 января, 2015 И да, напиши-таки dll, которая сама инжектится с хуком dx9, да ещё чтоб она не требовала эскалацию привилегий - думаю всем будет очень интересно взглянуть на это в деле. Это кому?чел, меня изза тебя скоро тут забанят Почему? Яж не для онлайн игр спрашиваю... Да и ты не для онлайн игр отвечаешь))У меня есть видео урок по этой теме на канале. Печально (Нет исходников. А ты подключаешь неизвестные какие-то GDI библиотеки. Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 26 января, 2015 Поделиться Опубликовано 26 января, 2015 воу1 тестани. удивишся - винда не закроет его сама +насколько помню на мсдн индусы писали что надо закрывать самому2 да ну? создай папку на китайском/японском брось туда длл и пробуй инжект через А5 имел ввиду CreateRemoteThread,ebx,0,4096,[LoadLibraryW],edi,0,0 типа напрямую из импорта. C ведь так может хех6 на примере вирьтотал и той кучи пародий на антивири - ефект будет7 хммм интересно оно создаст файл на шареном диске без? хз о чем ты. не вижу разницы между инжектом exe+dll и dll которая косит под cpl и которая сама себя инжектит будучи загруженой в rundll32. Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 26 января, 2015 Поделиться Опубликовано 26 января, 2015 По поводу второго пункта - в MSVS давно есть поддержка типа "общих" вызовов функций (без аффикса A или W), а нужная функция выбирается исходя из настроек проекта. Зачем так сделано - хз, да и я уже давно на вижле не пишу, но факт. Закрывать хэндлы и освобождать память, которая выделилась - таки полезная привычка, ибо не придется помнить, в потоке твой код или еще где-нибудь. Как правильно сказал кодер, современные AV - параноики и подозревают любые бинарники сколько-нибудь нестандартного вида - маленького размера, с собственным заголовком\загрузчиком, с "кривыми" секциями, без импорта, использующие функции работы с памятью. От всего этого избавляет пометка "false positive" в nfo, но это - уже другая история. Автор, я не зря спросил, в чем особенность твоего будущего инжектора. Ты ответил, что сформулировать идею полностью не можешь. Это плохо, так как если не можешь сформулировать полностью идею - реализовать тоже не сможешь, а пытаться реализовывать "по ходу" - так себе затея. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 26 января, 2015 Автор Поделиться Опубликовано 26 января, 2015 По поводу второго пункта - в MSVS давно есть поддержка типа "общих" вызовов функций (без аффикса A или W), а нужная функция выбирается исходя из настроек проекта. Зачем так сделано - хз, да и я уже давно на вижле не пишу, но факт. Закрывать хэндлы и освобождать память, которая выделилась - таки полезная привычка, ибо не придется помнить, в потоке твой код или еще где-нибудь. Как правильно сказал кодер, современные AV - параноики и подозревают любые бинарники сколько-нибудь нестандартного вида - маленького размера, с собственным заголовком\загрузчиком, с "кривыми" секциями, без импорта, использующие функции работы с памятью. От всего этого избавляет пометка "false positive" в nfo, но это - уже другая история.Автор, я не зря спросил, в чем особенность твоего будущего инжектора. Ты ответил, что сформулировать идею полностью не можешь. Это плохо, так как если не можешь сформулировать полностью идею - реализовать тоже не сможешь, а пытаться реализовывать "по ходу" - так себе затея.Нет, дело не в формулировке. Боюсь, что не сбудется) Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 26 января, 2015 Поделиться Опубликовано 26 января, 2015 воу1 тестани. удивишся - винда не закроет его сама +насколько помню на мсдн индусы писали что надо закрывать самому Тестанул. Закрылось. Не удивился. 2 да ну? создай папку на китайском/японском брось туда длл и пробуй инжект через А Инжект не пробовал, но почему-то старый проект, построенный полностью в ANSI (с А-функциями), прекрасно заработал из этой папки. 5 имел ввиду CreateRemoteThread,ebx,0,4096,[LoadLibraryW],edi,0,0 типа напрямую из импорта. C ведь так может хехРаботать с регистрами без _asm директивы напрямую? Сомневаюсь, что Си так может, хех 6 на примере вирьтотал и той кучи пародий на антивири - ефект будетВиртотал и иже с ним первыми начинают верещать, если файл чем-то пожат. 7 хммм интересно оно создаст файл на шареном диске без?Создаст. Ибо тот флаг, что ты указал, прописывается для разделенного доступа к самому файлу и никакого отношения к Самбе (сетевая инфраструктура винды) не имеет. хз о чем ты. не вижу разницы между инжектом exe+dll и dll которая косит под cpl и которая сама себя инжектит будучи загруженой в rundll32. Ты имел неосторожность заикнуться, что чтобы выбиться из толпы нубов надо написать такой инжектор. И ТЫ же строишь из себя тру-проггера. Исходя из твоей же логики, ты должен быть в состоянии написать инжектор, который у тебя попросил Кодер. Жду от тебя этого инжектора откомментированными на инглише исходниками. И если хотя бы часть этого исходника я каким-либо образом найду в гугле, значит, исходник не твой. И, следовательно, ты трепло. Точка. Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 26 января, 2015 Автор Поделиться Опубликовано 26 января, 2015 (изменено) Ты имел неосторожность заикнуться, что чтобы выбиться из толпы нубов надо написать такой инжектор. И ТЫ же строишь из себя тру-проггера. Исходя из твоей же логики, ты должен быть в состоянии написать инжектор, который у тебя попросил Кодер. Жду от тебя этого инжектора откомментированными на инглише исходниками. И если хотя бы часть этого исходника я каким-либо образом найду в гугле, значит, исходник не твой. И, следовательно, ты трепло. Точка.Уиии Страсти накаляются)))Ждем развязки)) Изменено 26 января, 2015 пользователем Xipho Первое устное за флуд и оффтоп. ЗЫ. Запасаемся попкорном. Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 26 января, 2015 Поделиться Опубликовано 26 января, 2015 Тестанул. Закрылось. Не удивился.окее: создай 1000 потоков в пустую проц. потом слип главного потока. посмотри сколько хендлов в диспетчере задач до/после. потом закрой вручную. Инжект не пробовал, но почему-то старый проект, построенный полностью в ANSI (с А-функциями), прекрасно заработал из этой папки.тогда возьми ollydbg2 и посмотри как она зафейлит загрузку ДЛЛ из папки с японским названием. loaddll.exe юзает А Работать с регистрами без _asm директивы напрямую? Сомневаюсь, что Си так может, хехя о ссылке на импорт LoadLibraryW без конструкции "GetProcAddress(hDll, "LoadLibraryA")" Ты имел неосторожность заикнуться, что чтобы выбиться из толпы нубов надо написать такой инжектор. И ТЫ же строишь из себя тру-проггера. Исходя из твоей же логики, ты должен быть в состоянии написать инжектор, который у тебя попросил Кодер. Жду от тебя этого инжектора откомментированными на инглише исходниками. И если хотя бы часть этого исходника я каким-либо образом найду в гугле, значит, исходник не твой. И, следовательно, ты трепло. Точка.такие методы мало кто юзает = будет выделятся. в другой теме (скрытие длл, в флудилке) я накинул как оно выглядит (метод мало чем отличается от ехе варианта), его может ЛЮБОЙ сделать за ~15мин. Кодера вааааашее не понял. код инжекта в DLL_PROCESS_ATTACH остальное НЕВАЖНО.автор темы хотел "специфичный" инжект - я подал еще более спец. вариант. очень сомнительно что он не сможет его реализ. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 27 января, 2015 Поделиться Опубликовано 27 января, 2015 окее: создай 1000 потоков в пустую проц. потом слип главного потока. посмотри сколько хендлов в диспетчере задач до/после. потом закрой вручную.Вот сейчас вообще этого потока мыслей не понял. тогда возьми ollydbg2 и посмотри как она зафейлит загрузку ДЛЛ из папки с японским названием. loaddll.exe юзает АНу кто ж виноват, что эта прога из состава олли так криво написана? Вполне себе вероятно, что суть фейла вовсе не в вызове анси функций.Возьми любую программу анси, запусти под отладчиком, поставь бряк на любую анси-функцию, и немного потрейси внутрь. Сам убедишься, что все анси функции в современных виндах служат заглушкой на юникодовые функции. я о ссылке на импорт LoadLibraryW без конструкции "GetProcAddress(hDll, "LoadLibraryA")"И снова я тебя вообще не понял. В этом случае получается адрес заинжекченной длл-ки, и нет никакой гарантии, что она будет загружена в ту же область пространства, если ее грузить через LoadLibrary самим инжектором, так что ты вообще бред какой-то сказал. Или поясни свои слова. такие методы мало кто юзает = будет выделятся. в другой теме (скрытие длл, в флудилке) я накинул как оно выглядит (метод мало чем отличается от ехе варианта), его может ЛЮБОЙ сделать за ~15мин. Кодера вааааашее не понял. код инжекта в DLL_PROCESS_ATTACH остальное НЕВАЖНО.автор темы хотел "специфичный" инжект - я подал еще более спец. вариант. очень сомнительно что он не сможет его реализ.Что и требовалось доказать - дошло до дела, ты в кусты. Несколькими постами ранее ты говорил, что нужно этот твой cpl инжектор сделать, чтобы выбиваться из толпы нубов. Теперь говоришь, что ЛЮБОЙ может сделать этот инжектор. Тему, про которую ты говоришь, что-то не увидел, может она и есть. Но если она даже есть, и там нет примеров твоего (подчеркиваю - твоего) кода - твои слова остаются лишь словами. В общем, слился ты, дружище. Все с тобой ясно. Не строй из себя того, кем ты не являешься, и перестань пороть чушь, а лучше вместе с ребятами разбирай код. Глядишь, что-то полезное сделаешь. За сим тему обсуждения считаю исчерпанной. Дальнейшие попытки снова ее поднять буду считать оффтопом и (или) флудом и наказывать по всей строгости. Я все сказал. Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 27 января, 2015 Поделиться Опубликовано 27 января, 2015 Вот сейчас вообще этого потока мыслей не понял.проехали. читай мсдн Ну кто ж виноват, что эта прога из состава олли так криво написана? Вполне себе вероятно, что суть фейла вовсе не в вызове анси функций.Возьми любую программу анси, запусти под отладчиком, поставь бряк на любую анси-функцию, и немного потрейси внутрь. Сам убедишься, что все анси функции в современных виндах служат заглушкой на юникодовые функции.норм она написана. в даном случае это фейл именно А. а то что внутри А функций видел. получается W даже быстрее работает lulz И снова я тебя вообще не понял. В этом случае получается адрес заинжекченной длл-ки, и нет никакой гарантии, что она будет загружена в ту же область пространства, если ее грузить через LoadLibrary самим инжектором, так что ты вообще бред какой-то сказал. Или поясни свои слова.PUSH 0PUSH 0PUSH EDIPUSH DWORD PTR [<&kernel32.LoadLibraryW>] <--- видел на С так делалИ. ЭТО не бред xDPUSH 1000PUSH 0PUSH EBXCALL DWORD PTR [<&kernel32.CreateRemoteThread>] Что и требовалось доказать - дошло до дела, ты в кусты. Несколькими постами ранее ты говорил, что нужно этот твой cpl инжектор сделать, чтобы выбиваться из толпы нубов. Теперь говоришь, что ЛЮБОЙ может сделать этот инжектор. Тему, про которую ты говоришь, что-то не увидел, может она и есть. Но если она даже есть, и там нет примеров твоего (подчеркиваю - твоего) кода - твои слова остаются лишь словами. В общем, слился ты, дружище. Все с тобой ясно. Не строй из себя того, кем ты не являешься, и перестань пороть чушь, а лучше вместе с ребятами разбирай код. Глядишь, что-то полезное сделаешь. За сим тему обсуждения считаю исчерпанной. Дальнейшие попытки снова ее поднять буду считать оффтопом и (или) флудом и наказывать по всей строгости. Я все сказал.*facepalmкст поискал FILE_SHARE_WRITE, оказалось без него у некоторых были странные фейлы CreateFile - так что все правильно задал там. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 27 января, 2015 Поделиться Опубликовано 27 января, 2015 кст поискал FILE_SHARE_WRITE, оказалось без него у некоторых были странные фейлы CreateFile - так что все правильно задал там.Отвечу только на это, по остальному уже и так все ясно. FILE_SHARE_WRITE дает разделенный доступ, чтобы сразу несколько потоков (или приложений) могли в него писать. Такое поведение у приложения запрограммировано - да, этот флаг нужен. Но в случае инжектора с извлечением длл-ки из ресурсов такое поведение абсолютно не нужно и даже вредно, следовательно - флаг лишний. Учи матчасть. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения