Внедрение длл из ресурсов

Тема в разделе "WASM.WIN32", создана пользователем sanny, 3 апр 2019.

  1. sanny

    sanny New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    14
    Здравствуйте. Пишу простенький инжектор на с++, в программировании я новичек. Прогррама запускает другой процесс и внедряет в него длл, все файлы в одном каталоге, интересует как можно добавить длл, которую внедряет, в ресурсы программи и из ресурсов сразу же внедрять в целевой процесс, без сохранения на диск, подскажите пожалуйста или дайте какие-то примеры, а то гугл скоро забанит.
    Текущий код:
    Код (C):
    1. #include "stdafx.h"
    2. #include "UIv3.h"
    3.  
    4. inline bool InjectDll(HANDLE hProcess, std::string dllname)
    5. {
    6.           auto res = false;
    7.          if (auto lpAddr = VirtualAllocEx(hProcess, NULL, dllname.size(), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE))
    8.          {
    9.                    if (WriteProcessMemory(hProcess, lpAddr, dllname.c_str(), dllname.size(), NULL))
    10.                   {
    11.                            auto lpLoadLibraryA = (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleA("kernel32"), "LoadLibraryA");
    12.                            if (auto hThread = CreateRemoteThread(hProcess, NULL, 0, lpLoadLibraryA, lpAddr, 0, NULL))
    13.                            {
    14.                                     res = WaitForSingleObject(hThread, 10 * 1000) != WAIT_TIMEOUT;
    15.                                     CloseHandle(hThread);
    16.                            }
    17.                   }
    18.                   VirtualFreeEx(hProcess, lpAddr, dllname.size(), MEM_FREE);
    19.          }
    20.          return res;
    21. }
    22.  
    23. int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    24. {
    25.          STARTUPINFOA sInfo = { sizeof(STARTUPINFOA) };
    26.          PROCESS_INFORMATION pInfo;
    27.          if (CreateProcessA("target.exe", "-test", NULL, NULL, FALSE, 0, NULL, NULL, &sInfo, &pInfo))
    28.          {
    29.                   InjectDll(pInfo.hProcess, "HelloWorld.dll");
    30.                   exit(0);
    31.          }
    32. }
     
  2. f13nd

    f13nd Active Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    559
    В ресурсы? Они в загружаемый образ не входят, читаются с диска. Если речь об инжекте без длл, так этого добра в гугле как грязи.
     
  3. sanny

    sanny New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    14
    Есть 3 файла например: injector.exe, target.exe, HelloWorld.dll. Я хотел бы спрятать HelloWorld.dll внутрь injector.exe и внедрять ее в target.exe не выгружая на диск. Ну или на крайняк тянуть дллку с сервера и внедрять не выгружая на диск, но опять же в этом еще больше баран, мне нужны примеры чтобы изучить их, в гугле не нашел :dntknw:
     
  4. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    2.354
    f13nd,

    > В ресурсы? Они в загружаемый образ не входят, читаются с диска.

    Почитай формат исполняемых файлов, узнаешь про директорию ресурсов и что такое rsrc" :preved:
     
  5. f13nd

    f13nd Active Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    559
    Тогда зачем так сложно? Длл выгодна только тем, что заполняет импорт средствами винды. Если ты внедряешь код другим способом, об импорте придется заботиться самому, в чем тогда смысл длл, кроме ненужного геморроя?
    --- Сообщение объединено, 3 апр 2019 ---
    Прикинь, я это знаю и даже использую для подмены шифрованной программы для донгла на определенную лицензию без пересборки длл.
     
  6. sanny

    sanny New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    14
    если ты про "почему бы не написать код дллки прямо в ехе и внедрять" - дллка не простая, это готовый екст, написанный внутри двигла, который линкуется к множеству захардкоженых дллок с тонной экспорта.
     
  7. f13nd

    f13nd Active Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    559
    Ищи в сторону dll loader'ов. Тебе нужно будет самостоятельно обработать минимум импорт и релоки длл, когда заинжектишь ее просто в память.
     
  8. sanny

    sanny New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    14
    Проблема не в внедрение длл и т.п., целевой процесс сам разворачивает функционал дллки как только она окажется в адресном пространстве. Проблему я описал в первом сообщении. Я хочу спрятать длл, либо внутрь лоадера, либо на сервер. Чтобы не выгружая на диск внедрять ее в целевой процесс.
     
  9. f13nd

    f13nd Active Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    559
    О хосспади. При загрузке длл ее рандомная база складывается с оффсетами и помещается во все инструкции, использующие абсолютную адресацию, при помощи таблицы релоков. Не грузишь длл средствами винды в целевой процесс - ты сам должен это проделать без участия винды. Само не заработает. Винда умеет только с диска. С таблицей импорта та же петрушка. С экспортом еще хуже.
     
  10. sanny

    sanny New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    14
    Вот теперь понял, спасибо.
     
  11. Коцит

    Коцит Active Member

    Публикаций:
    0
    Регистрация:
    31 янв 2017
    Сообщения:
    121
    WASM.RU - "Запуск файла из памяти": https://wasm.in/blogs/zapusk-fajla-iz-pamjati.454/
     
  12. f13nd

    f13nd Active Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    559
    Он длл переделывать не хочет. По идее надо примерно это, но отдельным инжектом, плюс релоки. Недавно на кл была ситуация попроще - надо было грузить длл в свой процесс, а она в dllmain через GetModuleFileName пыталась свой путь получить, чтобы еще файло подтягивать. Все это костыли и полумеры, в идеале надо переписывать полностью под нормальный инжект. Или не маяться фигней, это все равно защита от дурака получится.
     
  13. sanny

    sanny New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    14
    длл можно переделать, можно дописать что нужно.. я же сказал что баран в этом, думал что можно как-то проще например стянуть длл с сервера себе в память и потом внедрить в память другого процесса :)
     
  14. f13nd

    f13nd Active Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    559
    Если твой код не выполняется на самом сервере и не на устройстве, в которое нельзя залезть, все эти страдания тщетны.
     
  15. sanny

    sanny New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    14
    что ты имеешь в виду?
     
  16. f13nd

    f13nd Active Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    559
    Потому что все затраченное на изготовление такого загрузчика время в сравнении со временем на получение этой длл из памяти процесса две большие разницы.
     
  17. superakira

    superakira Active Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    467
    f13nd, ты сейчас его запутал капец) про ресурсы ты мудришь на самом деле. с чего ты взял что ресурсы в память не грузятся? по твоей аналогии - у меня всегда должен быть исполняемый файл на диске для работы с ресурсами, но это как бы не так)
    sanny, да из ресурсов можно. алгоритм такой - заводишь ресурс, в него кладешь длл (бинарь, тип хоть картинка), при старте твоей софтиный его берешь через стандартные апи (примеров миллион), те ты получшь указатель на него и размер. этот буфер тебе надо вручную замапить в созданный процесс. но есть момент - ручное маппирование не все обработает. исключения - сразу мимо + на куче рантайма отвалится. поэтому пиши эту длл аккуратно)
     
    Коцит и sanny нравится это.
  18. f13nd

    f13nd Active Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    559
    Да там сама формулировка такая, что с толку сбивает. "добавить длл, которую внедряет, в ресурсы программи и из ресурсов сразу же внедрять в целевой процесс", звучит как "давай, сломай себе мозг". Раз ресурсы упомянуты, наверное это важно, не может же это быть упоминание как дллку хранить, иначе зачем эта подробность :blum2:
     
    Последнее редактирование: 3 апр 2019
  19. sanny

    sanny New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    14
    что за бред? я внятно описал вопрос, прочти еще раз: "Есть 3 файла например: injector.exe, target.exe, HelloWorld.dll. Я хотел бы спрятать HelloWorld.dll внутрь injector.exe и внедрять ее в target.exe не выгружая на диск."
    спасибо за внятный ответ!
     
  20. f13nd

    f13nd Active Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    559
    Бред после первого поста, где еще раз или два раза прочитать это было нельзя, закончился. "вручную замапить в созданный процесс" может и решит проблему с релоками (если повезет и память по тем же адресам уже не будет чем-то другим занята), но остается импорт и экспорт, с которыми это не поможет. Так что все стало еще невнятней :laugh2: