Проблема с указателями при подключении DLL

Тема в разделе "WASM.BEGINNERS", создана пользователем serverok, 20 апр 2007.

  1. serverok

    serverok New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    5
    Уважаемые знатоки!
    Возникла следующая проблема. Из моей программы (назовем ее my.exe) мне надо выполнить некоторые функции в чужой программе (назовем ее enemy.exe). Интересующие меня функции являются экспортируемыми, поэтому я подключаю enemy.exe с помощью LoadLibraryEx. Обращаюсь к экспортируемым функциям, передавая им на вход указатели на переменные в своей программе. Экспортируемые функции успешно загружают эти входные параметры, а далее начинают обращаться к своим данным из сегмента данных enemy.exe. Тут и возникает ошибка, поскольку регистр DS указывает на сегмент DATA my.exe, а экспортируемые функции расчитывают, что он указывает на сегмент данных DATA в enemy.exe. Как решить этот вопрос?
     
  2. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    serverok
    Ну накрутил, пережитки ДОС. Сегмент DATA (тобиш регистр DS) во FLAT модели памяти один с базой 0 и лимитом 0FFFFFFFFh. Скорее всего без переделки enemy.exe ничего не получится.
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Похоже на отсутсвие релоков в enemy.exe.
     
  4. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Без релоков лоадлиб не сработала бы. Скорее всего не произошла какая - то инициализация, т.к. нет длл майн
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    он и так решен, cs,ss,ds,es - плоские сегменты от 0 до FFFFFFFFh.
    только fs особнячком стоит, да и он тебе не нужен скорее всего
     
  6. MrMadguy

    MrMadguy New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2006
    Сообщения:
    19
    Адрес:
    Russia
    Читайте про станичную адресацию!

    У каждого процесса в Win32 есть свое виртуальное адресное пространство! Это значичт, что данные, которые находятся по адресу XXXXXXXXh одного процесса, ноходятся там только в его адресном пространстве... В адресном пространстве другого процесса они по этому адресу отсутствуют...Для "общения" двух процессов в Win32 нужно использовать общую DLL или объекты ядра - пайпы или отображаемые в память файлы...
     
  7. serverok

    serverok New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    5
    Уточнение вопроса
    Файл enemy.exe, подключенный как DLL, загрузился в адресное пространство моей программы my.exe. Но естественно теперь он находится не потому адресу, как если бы enemy.exe был в памяти один. Но его DLL этого не понимает. Экспортируемые функции enemy.exe хоть и являются экспортируемыми, но недокументированы, а разработчик enemy.exe уверяет об отсутствии в его программе всяческого API. Файл enemy.exe изменить не представляется возможным.
    Так есть ли решение?
     
  8. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Собрать my.exe c другой базой - ото раз, хотя вряд ли поможет.
    Не делать никакого my.exe, а сделать свою my.dll, и как-нибудь подгрузить её к enemy.exe и пользоваться.
     
  9. MrMadguy

    MrMadguy New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2006
    Сообщения:
    19
    Адрес:
    Russia
    Если это чужая программа, то нужно подгрузить свою DLL в ее адресное пространство, тут я согласен с asd... Я знаю два способа это сделать - простой и сложный... Вам какой больше нравится?
     
  10. serverok

    serverok New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    5
    Мне больше нравится простой :)
     
  11. MrMadguy

    MrMadguy New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2006
    Сообщения:
    19
    Адрес:
    Russia
    Простой способ требует наличия у прцесса окна, HWND которого нанужно выяснить... Это делается обычно через FindWindow... Затем на это окно ставится хук, например на сообщение WM_NULL... Затем шлешь окну это сообщение, а в обработчике делаешь, что твоей душе угодно... ОСь встраивает DLL, в которой расположен хук, в адесное пространство процесса автоматически... Но это конечно не надежный способ...
     
  12. serverok

    serverok New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    5
    А в чем ненадежность?
     
  13. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    MrMadguy это простой способ?:)
    serverok Берёшь PeTools и добавляешь в импорт свою длл. Если уж совсем нельзя менять ехешник, то делаешь лоадер. Лоадер запускает enemy.exe и делает с процессом всё что хочет.
     
  14. MrMadguy

    MrMadguy New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2006
    Сообщения:
    19
    Адрес:
    Russia
    Это второй способ...Мне кажется, что для BEGINNERS первый способ проще...Надо то всего несколоко вызовов API: FindWindow, SetWindowsHook(Ex), PostMessage и все...
    Точнее сказать неуниверсальнось...Не у всех прог есть окно, которое всегда можно найти напимер по классу...
     
  15. serverok

    serverok New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    5
    Спасибо за советы!
    HWND enemy.exe у меня есть
    Буду пробовать
     
  16. MrMadguy

    MrMadguy New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2006
    Сообщения:
    19
    Адрес:
    Russia
    SetWindowsHookEx требует ThreadID. Его можно получить через GetWindowThreadProcessID.
    Чтобы почноценно управлять приложением-жертвой можно в обработчике хука создать невидимое окно своего класса...