Не могу получить экспортную функцию

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

  1. sanny

    sanny Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    42
    Всем доброго времени суток. Скажу сразу, в с++ я баран, потому не судите строго если я что-то прям конкретно не так делаю.
    Суть проблемы:
    Есть дллка написанная на с++, в этой же дллке мне нужно получить экспортную функцию этой же дллки.. (сам ничего не понимаю.. такое возможно?) грубо говоря когда длл входит в процесс мне нужно дернуть некоторую хукнутую функцию из процесса, получить через GetProcAddress экспортную функцию своей дллки и передать в хукнутую функцию. Проблема в том, что дллку я внедряю дровом, и эта длл не отображается в списке модулей процесса, к примеру даже GetModuleHandle не находит внедренную дллку (пришлось получать HMODULE в DllMain), но она работает... и вот таким способом внедренная дллка не хочет выдавать мне функцию через GetProcAddress.
    А вот если эту дллку с тем же функционалом просто нацепить в импорты процесса - тогда все работает отлично. Но внедрять мне нужно дровом т.к. целевой релизный процесс находится под защитой которая не позволяет внедрить длл от юзера :dntknw:
    Может есть какие-то другие способы получения HMODULE? Или я чего-то не знаю? Или вообщен етак что-то делаю? Убил много времени, много искал в гугле, но так и решения не нашел, даже не знает как правильно запрос в гугле забить под свою проблему, дичь одну выдает..
     
  2. Bedolaga

    Bedolaga Member

    Публикаций:
    0
    Регистрация:
    10 июл 2019
    Сообщения:
    131
    В меру своей безграмотности сказал бы сделать Мап дллки, но думаю внедряющий на уровне дров до этого и без меня бы додумался....
     
  3. Indy_

    Indy_ Well-Known Member

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

    А какое отношение имеют апи загрузчика к не загруженному образу. Не трогай апи, а используй свой кодес, который импорты парсит.

    > Может есть какие-то другие способы получения HMODULE?

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

    > GetModuleHandle не находит внедренную дллку (пришлось получать HMODULE в DllMain), но она работает...

    До первого исключения, дальше защита прибьёт процесс. Даже аллокация памяти вне загрузчика может быть прибита защитой в следующем билде. Слишком опасный изврат.
     
  4. sanny

    sanny Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    42
    Ну длл внедренная таким способом проверена не на одном защите, работает уже достаточно долго и без перебоев.. только вот решил написать (дописать то что дали) длл на либах, все работает, длл сама подтягивается процессом и регает экспортные функции класса для их использования в XMLUI пакетах. Но вот момент "длл сама подтягивается процессом" портит всю картину когда процесс под защитой, и тут пришлось делать обход, мне сделали дров, все хорошо, только вот встала беда зарегать эти экспортные функции дллки чтобы их можно было дергать из XMLUI. Я пошел хукнул пару функций процесса и копнув глубже увидел что эти функции двигло получает через GetProcAddress, сделал свою функцию для бинда пакета (UI) к дллке - в итоге могу теперь внедрить длл (в не защищенный процесс от юзера) и сам получить экспортные функции и их зарегистрировать. А вот когда длл внедрена дровом - я не могу получить эти функции. С HMODULE не особо проблема, в дллмейн его раз получил и этого в принципе хватит, но вот почему я не могу найти функции - вот для меня вопрос который я тупо не могу осилить :dntknw:
     
  5. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.954
  6. sanny

    sanny Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    42
    Да, именно :) ибо из другой длл и не могу получить HMODULE внедренной через дров дллки)
     
  7. Indy_

    Indy_ Well-Known Member

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

    > проверена не на одном защите, работает уже достаточно долго и без перебоев..

    Исключение" так и названо, потому что ситуация исключительно редкая. Образ вне загрузчика даже не получит об этом нотифи, это не image область и исполнение в ней запрещено защитой(DEP).

    > пришлось делать обход, мне сделали дров, все хорошо

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

    > почему я не могу найти функции - вот для меня вопрос который я тупо не могу осилить :dntknw:

    Модуля нет в загрузчике, он про него ничего не знает. Загрузчик не просто парсит экспорты или есчо какие то структуры пе формата, он вначале ищет описатель модуля в своих базах, затем выполняет некоторые синхронизации и тп, только потом переходит к примитивной работе со структурами. Есть есчо всякие механизмы типо фильтров, функция может фикситься например для совместимости или эмуляции путей фс.

    И кто же реализует инжект на скриптах, плюсах в частности ?
    Неработоспособность заложена на этапе сборки, компилер всякого мусора прицепит, из за чего будут ошибки. Удивительно даже в вашем случае что плюсовый код как то завёлся и стабилен, притом что он вне модуля. Скорее всего это нэйтив сишный стаб.
     
    Последнее редактирование: 17 ноя 2019
  8. sanny

    sanny Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    42
    Если честно - без понятия как оно внедряет, но внутри моей дллки я использую все возможности с++ (все что пока знаю), проблем пока не было, до момента что описал с получением из своей же дллки адреса ее экспортных функций. Вот выше дали ссылку на какую-то инфу, но у меня голова уже совсем не варит.. даже не понял как ее использовать (
     
  9. Indy_

    Indy_ Well-Known Member

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

    Бери готовый код который разбирает структуры пе. Думаю его навалом, так как это самая примитивная и основная работа в ос. Лучше взять что то свежее и написанное спецами, иначе могут быть косяки. Если конечно сам не можешь столь простое.
    --- Сообщение объединено, 17 ноя 2019 ---
    > проблем пока не было

    Их небыло потому что защита не обнаружила нужное событие. Самое простое это исключение. Есть более сложные способы обнаружения событий обратного проектирования(OP атаки), карта CFG например. Ядро нт к примеру проверяет диапазон стека потока, что бы предупреждать атаки. Ты из не image пытаешься вызвать апи с защитой. Всё делаешь не правильно.
     
    Последнее редактирование: 17 ноя 2019
  10. sanny

    sanny Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    42
    Можешь дать пинка на пример? Я не знаю о чем ты говоришь и чем мне это поможет, как я уже сказал сразу - я баран )
     
  11. Indy_

    Indy_ Well-Known Member

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

    Тебе дадут линк далее те, кто следит за текущими проектами(для совместимости с 10-й, там вводится быстро и много защиты) на том же гитхабе например. Я не знаю, на твоём месте я бы сделал всё по своему.
     
  12. sanny

    sanny Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    42
    Сделал по своему что, дров другой для внедрения?) Это мне не по силам :) По новому переписать свой функционал внутри своей дл - не выйдет, моя длл привязана к способам регистрации пакетов с нативками и по другому как сделать - я хз.. а как сделано если тебе интересно - можешь посмотреть в сурсах UT2004 в функциях: Bind, BindPackage, GetDllExport, я учусь всего лишь работать на с++
     
  13. Indy_

    Indy_ Well-Known Member

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

    Тебе нужна всего лишь самая простая процедура разбирающая экспортную структуру пе, на плюсах. Я не использую плюсы и ничем тебе не могу помочь.
     
  14. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    sanny
    Как уже посоветовали, можно разобрать собственную таблицу экспорта. Для упрощения задачи можно назначить фиксированный ординал нужной функции и искать по номеру, а не по имени.
    Но возможно ещё проще будет вынести нужную функцию в отдельную секцию (например #pragma section(".text1",execute, read) ). Тогда при отсутствии больших изменений в коде DLL можно принять адрес начала функции постоянным и захардкодить RVA этой функции. В таком случае для вызова будет достаточно прибавить этот RVA к уже ивестному ImageBase (найденный HMODULE Вашей DLL-ки).
     
  15. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.173
    Адрес:
    подполье
    Зачем эти извраты, если в коде дллмейн можно получить адрес своей то собственной функции в глобальную, например переменную
     
    ormoulu и RamMerLabs нравится это.
  16. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    TrashGen
    Точняк. В таком случае и HMODULE не важен, Relocations (при наличии) сделают всё сами.
     
  17. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.173
    Адрес:
    подполье
    Именно!
     
  18. sanny

    sanny Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    42
    Как?
     
  19. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.173
    Адрес:
    подполье
    DWORD func_addr;
    func{};
    DLLMAIN
    {
    func_addr = [func];
    };

    как то так. я не помню как взять из ячейки в экспорте пральный адрес экспортируемой функи. я не сишнег и воще нечо не помню
    --- Сообщение объединено, 18 ноя 2019 ---
    и ощще неясно зачем в библиотеке адрес её же экспортируемой функцыи, когда её можна вызывать где угодно в коде этой библиотеки и всё сделают релоки
    --- Сообщение объединено, 18 ноя 2019 ---
    а если нужно передать в другой ощще модуль, пилите в дллмейне загружаемой дровом длл именнованные пайпы и прочие майлы глобальные на весь процесс, например, что там разрешают воще делать в дллмайн, тоже осведомитесь у местных авторитетов:dance2:
     
  20. sanny

    sanny Member

    Публикаций:
    0
    Регистрация:
    28 сен 2018
    Сообщения:
    42
    Спасибо, поищу еще инфу если не получится. На счет "зачем" - я писал чуть више, в целевом процессе есть функция которая ищет эти экспортные функции для регистрации (бинда) к пакету XMLUI, я эту функцию хукнул т.к. сама она мои экcпорты не может найти, а ищет она через GetProcAddress.