Здравствуйте. Пишу простенький инжектор на с++, в программировании я новичек. Прогррама запускает другой процесс и внедряет в него длл, все файлы в одном каталоге, интересует как можно добавить длл, которую внедряет, в ресурсы программи и из ресурсов сразу же внедрять в целевой процесс, без сохранения на диск, подскажите пожалуйста или дайте какие-то примеры, а то гугл скоро забанит. Текущий код: Код (C): #include "stdafx.h" #include "UIv3.h" inline bool InjectDll(HANDLE hProcess, std::string dllname) { auto res = false; if (auto lpAddr = VirtualAllocEx(hProcess, NULL, dllname.size(), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE)) { if (WriteProcessMemory(hProcess, lpAddr, dllname.c_str(), dllname.size(), NULL)) { auto lpLoadLibraryA = (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleA("kernel32"), "LoadLibraryA"); if (auto hThread = CreateRemoteThread(hProcess, NULL, 0, lpLoadLibraryA, lpAddr, 0, NULL)) { res = WaitForSingleObject(hThread, 10 * 1000) != WAIT_TIMEOUT; CloseHandle(hThread); } } VirtualFreeEx(hProcess, lpAddr, dllname.size(), MEM_FREE); } return res; } int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { STARTUPINFOA sInfo = { sizeof(STARTUPINFOA) }; PROCESS_INFORMATION pInfo; if (CreateProcessA("target.exe", "-test", NULL, NULL, FALSE, 0, NULL, NULL, &sInfo, &pInfo)) { InjectDll(pInfo.hProcess, "HelloWorld.dll"); exit(0); } }
В ресурсы? Они в загружаемый образ не входят, читаются с диска. Если речь об инжекте без длл, так этого добра в гугле как грязи.
Есть 3 файла например: injector.exe, target.exe, HelloWorld.dll. Я хотел бы спрятать HelloWorld.dll внутрь injector.exe и внедрять ее в target.exe не выгружая на диск. Ну или на крайняк тянуть дллку с сервера и внедрять не выгружая на диск, но опять же в этом еще больше баран, мне нужны примеры чтобы изучить их, в гугле не нашел
f13nd, > В ресурсы? Они в загружаемый образ не входят, читаются с диска. Почитай формат исполняемых файлов, узнаешь про директорию ресурсов и что такое rsrc"
Тогда зачем так сложно? Длл выгодна только тем, что заполняет импорт средствами винды. Если ты внедряешь код другим способом, об импорте придется заботиться самому, в чем тогда смысл длл, кроме ненужного геморроя? --- Сообщение объединено, 3 апр 2019 --- Прикинь, я это знаю и даже использую для подмены шифрованной программы для донгла на определенную лицензию без пересборки длл.
если ты про "почему бы не написать код дллки прямо в ехе и внедрять" - дллка не простая, это готовый екст, написанный внутри двигла, который линкуется к множеству захардкоженых дллок с тонной экспорта.
Ищи в сторону dll loader'ов. Тебе нужно будет самостоятельно обработать минимум импорт и релоки длл, когда заинжектишь ее просто в память.
Проблема не в внедрение длл и т.п., целевой процесс сам разворачивает функционал дллки как только она окажется в адресном пространстве. Проблему я описал в первом сообщении. Я хочу спрятать длл, либо внутрь лоадера, либо на сервер. Чтобы не выгружая на диск внедрять ее в целевой процесс.
О хосспади. При загрузке длл ее рандомная база складывается с оффсетами и помещается во все инструкции, использующие абсолютную адресацию, при помощи таблицы релоков. Не грузишь длл средствами винды в целевой процесс - ты сам должен это проделать без участия винды. Само не заработает. Винда умеет только с диска. С таблицей импорта та же петрушка. С экспортом еще хуже.
Он длл переделывать не хочет. По идее надо примерно это, но отдельным инжектом, плюс релоки. Недавно на кл была ситуация попроще - надо было грузить длл в свой процесс, а она в dllmain через GetModuleFileName пыталась свой путь получить, чтобы еще файло подтягивать. Все это костыли и полумеры, в идеале надо переписывать полностью под нормальный инжект. Или не маяться фигней, это все равно защита от дурака получится.
длл можно переделать, можно дописать что нужно.. я же сказал что баран в этом, думал что можно как-то проще например стянуть длл с сервера себе в память и потом внедрить в память другого процесса
Если твой код не выполняется на самом сервере и не на устройстве, в которое нельзя залезть, все эти страдания тщетны.
Потому что все затраченное на изготовление такого загрузчика время в сравнении со временем на получение этой длл из памяти процесса две большие разницы.
Да там сама формулировка такая, что с толку сбивает. "добавить длл, которую внедряет, в ресурсы программи и из ресурсов сразу же внедрять в целевой процесс", звучит как "давай, сломай себе мозг". Раз ресурсы упомянуты, наверное это важно, не может же это быть упоминание как дллку хранить, иначе зачем эта подробность
что за бред? я внятно описал вопрос, прочти еще раз: "Есть 3 файла например: injector.exe, target.exe, HelloWorld.dll. Я хотел бы спрятать HelloWorld.dll внутрь injector.exe и внедрять ее в target.exe не выгружая на диск." спасибо за внятный ответ!
Бред после первого поста, где еще раз или два раза прочитать это было нельзя, закончился. "вручную замапить в созданный процесс" может и решит проблему с релоками (если повезет и память по тем же адресам уже не будет чем-то другим занята), но остается импорт и экспорт, с которыми это не поможет. Так что все стало еще невнятней
f13nd, Может быть и это по твоему бред https://wasm.in/threads/pe-loader-i-tls.32411/ ? Каждый кто каким то образом относится к системному коденгу малварей/защит/виксов/етц начинает именно с реализации загрузчика из памяти. Это первое знакомство вплотную с пе форматом и системным загрузчиком(фактически первая самостоятельная своя работа, но в таком случае не бегут на форумы не ясно зачем), так как нужно отлаживать