2013-09-03 3 views
2

Я хотел бы иметь возможность вызвать функцию в скомпилированном исполняемом файле с моими собственными параметрами. Например, смещение функции может быть 0x00402120 и принимает 2 параметра. Функция, которую я хотел бы назвать, прост по своей природе и не вызывает никаких библиотечных функций, поэтому мне не нужно беспокоиться об импорте библиотек и попытке исправить адреса библиотек.Выполнение функции из скомпилированного исполняемого файла

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

Любые предложения были бы замечательными. Я бы предпочел реализовать это на C или C++.

+0

Вызов функции откуда? –

+1

Это необоснованно, если вы не пытаетесь создать какой-то варез. Существует почти наверняка лучший способ сделать это, если ваш случай использования является законным. –

+0

Является ли эта функция экспортируемой? Я имею в виду, видите ли вы это в таких инструментах, как DLL Export Viewer? http://www.nirsoft.net/utils/dll_export_viewer.html – kol

ответ

3

Здесь, я сделал следующее.

Это мой C++ код:

#include<iostream> 

void foo(int x) { 
    std::cout<<"calling foo("<<x<<")"<<std::endl; 
} 

int main() { 
    return 0; 
} 

Это, как я скомпилировать:

g++ program.cpp -o program -O0 

Это, как я могу определить имя функции foo:

[myprompt ~] nm program 
0000000100001090 S _NXArgc 
0000000100001098 S _NXArgv 
0000000100000e70 t __GLOBAL__sub_I_program.cpp 
0000000100000dcc T __Z3fooi 
0000000100000e28 t __Z41__static_initialization_and_destruction_0ii 
       U __ZNSolsEPFRSoS_E 
       U __ZNSolsEi 
       U __ZNSt8ios_base4InitC1Ev 
       U __ZNSt8ios_base4InitD1Ev 
       U __ZSt4cout 
       U __ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_ 
0000000100001088 s __ZStL8__ioinit 
       U __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc 
       U ___cxa_atexit 
00000001000010a8 S ___progname 
0000000100000000 T __mh_execute_header 
00000001000010a0 S _environ 
       U _exit 
0000000100000e1d T _main 
0000000100001000 s _pvars 
       U dyld_stub_binder 
0000000100000d90 T start 

И вот как я называю функцию foo (я делаю это с Python, потому что я ленив, но вы можете d o это с помощью любой другой программы, которая позволяет загружать библиотеки).

import ctypes 
program = ctypes.CDLL("./program") 
program._Z3fooi(ctypes.c_int(2)) 

Пробег:

[myprompt ~] python callprogram.py 
calling foo(2) 

Это не портативный (имя коверкание может отличаться от компиляторов, от платформы). Меня устраивает. Но мне никогда не нужно это делать, поэтому мне интересно, насколько это полезно.

0

Большая проблема заключается в том, что программы могут не выполняться по одному и тому же адресу каждый раз. Таким образом, вам нужно будет знать смещение функции внутри исполняемого файла.

Другая проблема: ОС может «вывести на экран» функции исполняемого файла, которые не используются и считывают их в память по требованию. И только ОС будет знать, где они размещены.

Возможно, вы сможете использовать инструменты для извлечения функции из исполняемого файла и вставки в файл. Но функция может иметь зависимости в другом месте файла. Они должны быть извлечены, а адреса перенастроены. Возможно, но не предлагается.

Смежные вопросы