Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как вызвать свою функцию из длл закинутой в сторонний процесс?

465
12 апреля 2012 года
QWERYTY
595 / / 25.03.2012
Закинул я удалённым потоком длл в сторонний процесс. Радость от этого события быстро закончилась когда я обнаружил что не могу вызвать функцию из своей длл.
Сначала я не понял серьёзности ситуации. Началось с того что я не мог получить хендл длл, как на поверку оказалось функция GetModuleHandle работает только в адресном пространстве вызывающего её прпоцесса. Ну я не стал отчаиваться и получил хендл с помощью тулхелп32. Второй шок я испытал когда обнаружил что функция GetProcAddress не смотря на полученный всеми правдами и неправдами хендл длл всё равно не извлекает адрес функции.
На данный момент я вижу решение в "ковырянии" PE заголовков моей длл.
Тема пока для меня мудрёная, чайник кипит, но разбираться нужно.
Вроде бы мне должна помоч функция ImageNtHeader, только толком не пойму что в неё передавать.
Во всёх примерах которые мне попадались делают какой то фаил маппед и результат передают в ImageNtHeader. Но в моём случае библиотека уже загруженна. У библиотеки совпадают хендл и .modBaseAddr тулхелповской структуры, нормально ли это?
Если я правильно понимаю то что читаю в книге Румянцева "Работа с файлами в WIN32 API" то мне нужно выйти на IMAGE_OPTIONAL_HEADER и получив оттуда все необходимые данные вычислить адрес функции.
И опять не понятно, получу я виртуальный адрес функции, а как её вызвать то потом?
Помогите кто знает как достич цели и вызвать функцию. Может здесь нужно какое то другое решение?
316
12 апреля 2012 года
Alm3n
889 / / 29.05.2009
Клац.
465
12 апреля 2012 года
QWERYTY
595 / / 25.03.2012
Да, Спасибо но я уже там был, и к сожалению не очень понял что он там делает.

"char* baseAddress = reinterpret_cast<char*>
(reinterpret_cast<DWORD>(hLib) & 0xFFFF0000); " - Вот например вот это я не очень понимаю.
Как в делфи получить baseAddress, а если это и есть хендл модуля то кто нибудь подтвердил или опроверг это.

Вообще си конечно не очень читаемый, фугурные скобки стоят бывает где попало и трудно уловить что там куда вложено.
А вот тут вообще сначала упустил из вида палки:
"if ((funcOrdinal < export.Base)
|| (funcOrdinal >= export.Base + export.NumberOfFunctions))
{"
В делфи то используется оператор OR который ещё и выделен жирным как зарезервированное слово, не пропустишь.

И ещё не понял зачем он читает память процесса, нам же вроде всё что нужно вернёт ImageNtHeader.
А потом в возвращённой структуре ковыряться всякими FindFunctionName, AddressOfNameOrdinals, AddressOfFunctions, или я глубоко заблуждаюсь?
465
12 апреля 2012 года
QWERYTY
595 / / 25.03.2012
Я кажется начинаю понимать суть происходящего.
Все примеры которые мне попадались по проще работают в рамках своего процесса(там везде делали либо LoadLibrary в свой процесс, либо вот этот фаил маппед который я пока не очень понимаю).
А в моём случае видимо деиствительно не обойтись без чтения памяти процесса.
Пример на который ссылка выше действительно чуть ли не один из мне подходящих, и мне придётся в нём разобраться чего бы то не стоило.
Я бы мог решить проблему проше, создать какой нибудь ресурс силами длл(которую внедряю) и в нём передать указатель на функцию, и считать указатель в своей программе. Но я не ищу лёгких путей, а теперь принципиально напишу функцию которая будет получать адрес функции в любом процессе, чтото такое видимо должно получиться:

function GetProcAddressInAllProcess(PId: CARDINAL; ModName: PWideChar; FuncName: PWideChar): POINTER;
Осталось только реализовать.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог