Здравствуйте! У меня есть чужая программа, в которой есть ряд функций... например мне нужно получить результат функции int myfunc(). можно ли воспользовавшись dll инжектом вызвать эту функцию? если да то как?
Можно. Но насколько я понимаю int myfunc() находится в exe. Надо вручную найти адрес этой функции с помощью отладчика. Дальше можно вызывать эту функцию с помощью call адрес_функции или jmp адрес_функции, либо же устанавливать перехват на нее путем замены первых 5 байт или любым другим способом.
да, она находится в ехе. то есть такой метод можно применять, если адрес такой функции постоянен? просто такой странный этот ехе. Эта функция находится в dll_ex.dll, но в программе я не могу найти не одного вызова этой функции с библиотеки, но эта функция экспортируется самой ехе... но вызвать ее не могу... проблемы с памятью возникают, даже когда я соблюдаю декларацию... нечего не понимаю... ПС: а можно по подробней, как вызываются такие функции и получить от них можно результат?
Так все таки функция находится в DLL? Тогда загрузите свой exe через отладчик (Olly Debugger, например) и установите бряк (Toggle breakpoint) на данную функцию. Выполните в программе некоторые действия, при которых предположительно должна вызываться эта функция. Прерывание сработает при ее вызове (если она где то вызывается, конечно) и вы сможете посмотреть, в каком месте в exe она вызывается, какие параметры принимает и что возвращает. А по поводу Импортируется, наверное? Тогда это полностью возможно.
Да, эта функция находится в самой dll, но я не могу найти ни одного вызова этой функции в самой программе, тогда как программа экспортирует эту функцию. Я уже ставил бряк на эту функцию, доходило выполнение к этому моменту, (функция одной переменной), передавалось текстовое значение, и возвращалось целочисленное. Но когда я хотел в своей программе ее использовать - я получал ошибку связанной с памятью. так как доступа получить я не мог... декларация соблюдена верно. в ида про эта функция находится в таблице экспорта самой ехе, и в длл в таблице экспорта
Если это не приватный проект - выложите exe и dll, чтобы можно было взглянуть. На каком этапе происходит ошибка при вызове этой функции из вашей программы пробовали разобраться? Если dll написана в Delphi и принимает string, то есть некоторые особенности, при которых может появляться Access violation. На каком языке написана библиотека?
Происходит ошибка именно при вызове. На сколько я понимаю библиотека как и сама программа написаны на VC++. Вызов программы осуществляется с файла info.exe. Сама dll - qpile.dll. Функция имеет название IS_CONNECTED вот сама программа http://dl.dropbox.com/u/9129402/arch.rar
ну дак функция экспортируется приложением info.exe и возвращает просто значение какой-то переменной, которая в свою очередь инициализируется при "нормальном" запуске программы, то есть: Code: double __cdecl IS_CONNECTED(int a1) { *(double *)a1 = (double)bEnable; return *(double *)a1; } если просто пытаться вызвать функцию примерно таким кодом: Code: hLib:= LoadLibrary('info.exe'); if hLib <> 0 then begin IS_CONNECTED:= GetProcAddress(hLib, 'IS_CONNECTED'); ... то переменная bEnable будет не инициализирована, соответственно отсюда и ошибка доступа
Извините, очень туплю, подскажите, можно ли вызвать функцию напрямик с qpile.dll и получить результат ее выполнения? или каким другим образом можно вызвать и получить значение...
если автор проги особо не химичил, то код функции должен быть в сегменте кода, который ReadOnly. даже если образ будет релоцироваться, то функцию можно найти по паттерну - то бишь просто ища последовательность скажем из 10 байт, но сперва ее конечно нужно найти отладчиком.