Всем привет.
!!!Перед прочтением данной статьи рекомендую прочитать о Соглашении о вызовах(Calling Convention)!!!
Эта небольшая статья о вызове функций из приложения.
Если будет не понятно, то могу снять видео гайд по вызову функций.
Подопытным кроликом будет заранее заготовленное приложение.
Вот его код:
Примерно так выглядит наша программа:
Думаю и так понятно, что приложение по нажатию на F1 запускает функцию 1, а по нажатию на F2 функцию 2 и 3
С помощью x64dbg мы попробуем разобратся как вызывается функция:
Будем искать строчку из функции3. Для этого ищем ссылки на строки, как показано на скрине
Поиск ссылок на строки в x64dbg:
Находим там: "Function003 called! this is char* param of function003"
И смотрим:
Сдесь PUSH и CALL
Пологаю это то что нам надо, пушим аргумент в стек(наша строчка) и вызываем функцию.
Перед прочтением статьи я рекомендовал прочитать про соглашение о вызове.
Сейчас это бы пригодилось, но я зарание оговорюсь, что это C-Declaration - __cdecl:
Примерный внешний __cdecl
push ebp
mov ebp, esp
// Пушим аргументы вызова
push arg1
push arg2
// вызываем функция
call ourFunc
// чистим стек за нашей функцией
add esp, 8
Давайте посмотрим на скрин:
Интересующая нас функция:
Ну что же самое интересное, мы знаем какое используется соглашение о вызове, мы знаем параметры которые принимает функция.
Давайте теперь узнаем смещение функции относительно базового адреса, для этого открываем калькулятор, выбираем 16тиричную систему,
Адрес функции у меня 009С24С0.
Из адреса функции вычитаем Базовый адрес, в моем случае это 009B0000
009C24C0-009B0000=124C0 Запоминаем, смещение, оно нам понадобится!
Давайте напишем dll'ку которая по нажатию на F10 будет запускать функцию3.
Вот код:
Код достаточно прост, думаю пояснения тут не нужны. Собираем и иньжектим DLLку,
Для проверки можно заиньктить с помощью CE.
Результат:
Всем спасибо!
P.s. Сильно не пинайте если что-то не так, первая статья! С радостью выслушаю конструктивную критику