Уважаемые знатоки! Возникла следующая проблема. Из моей программы (назовем ее my.exe) мне надо выполнить некоторые функции в чужой программе (назовем ее enemy.exe). Интересующие меня функции являются экспортируемыми, поэтому я подключаю enemy.exe с помощью LoadLibraryEx. Обращаюсь к экспортируемым функциям, передавая им на вход указатели на переменные в своей программе. Экспортируемые функции успешно загружают эти входные параметры, а далее начинают обращаться к своим данным из сегмента данных enemy.exe. Тут и возникает ошибка, поскольку регистр DS указывает на сегмент DATA my.exe, а экспортируемые функции расчитывают, что он указывает на сегмент данных DATA в enemy.exe. Как решить этот вопрос?
serverok Ну накрутил, пережитки ДОС. Сегмент DATA (тобиш регистр DS) во FLAT модели памяти один с базой 0 и лимитом 0FFFFFFFFh. Скорее всего без переделки enemy.exe ничего не получится.
Без релоков лоадлиб не сработала бы. Скорее всего не произошла какая - то инициализация, т.к. нет длл майн
он и так решен, cs,ss,ds,es - плоские сегменты от 0 до FFFFFFFFh. только fs особнячком стоит, да и он тебе не нужен скорее всего
Читайте про станичную адресацию! У каждого процесса в Win32 есть свое виртуальное адресное пространство! Это значичт, что данные, которые находятся по адресу XXXXXXXXh одного процесса, ноходятся там только в его адресном пространстве... В адресном пространстве другого процесса они по этому адресу отсутствуют...Для "общения" двух процессов в Win32 нужно использовать общую DLL или объекты ядра - пайпы или отображаемые в память файлы...
Уточнение вопроса Файл enemy.exe, подключенный как DLL, загрузился в адресное пространство моей программы my.exe. Но естественно теперь он находится не потому адресу, как если бы enemy.exe был в памяти один. Но его DLL этого не понимает. Экспортируемые функции enemy.exe хоть и являются экспортируемыми, но недокументированы, а разработчик enemy.exe уверяет об отсутствии в его программе всяческого API. Файл enemy.exe изменить не представляется возможным. Так есть ли решение?
Собрать my.exe c другой базой - ото раз, хотя вряд ли поможет. Не делать никакого my.exe, а сделать свою my.dll, и как-нибудь подгрузить её к enemy.exe и пользоваться.
Если это чужая программа, то нужно подгрузить свою DLL в ее адресное пространство, тут я согласен с asd... Я знаю два способа это сделать - простой и сложный... Вам какой больше нравится?
Простой способ требует наличия у прцесса окна, HWND которого нанужно выяснить... Это делается обычно через FindWindow... Затем на это окно ставится хук, например на сообщение WM_NULL... Затем шлешь окну это сообщение, а в обработчике делаешь, что твоей душе угодно... ОСь встраивает DLL, в которой расположен хук, в адесное пространство процесса автоматически... Но это конечно не надежный способ...
MrMadguy это простой способ? serverok Берёшь PeTools и добавляешь в импорт свою длл. Если уж совсем нельзя менять ехешник, то делаешь лоадер. Лоадер запускает enemy.exe и делает с процессом всё что хочет.
Это второй способ...Мне кажется, что для BEGINNERS первый способ проще...Надо то всего несколоко вызовов API: FindWindow, SetWindowsHook(Ex), PostMessage и все... Точнее сказать неуниверсальнось...Не у всех прог есть окно, которое всегда можно найти напимер по классу...
SetWindowsHookEx требует ThreadID. Его можно получить через GetWindowThreadProcessID. Чтобы почноценно управлять приложением-жертвой можно в обработчике хука создать невидимое окно своего класса...