Как получить список всех функций и перехватить их вызов (Delphi)? Например есть программка калькулятор.
В ней есть 4 действия (функции): сложить, умножить, вычесть, разделить.
Прикручиваем к нему процедуру динамического подключения внешних библиотек.
Компилируем и больше исходный код программы не трогаем.
Теперь пишем библиотеку авторизации со своими формами.
В итоге, хочется, просто подключив в программе калькулятора эту библиотеку, что бы она выводила в своей форме все его события для назначения доступа тому или иному пользователю. И теперь, перед каждым вызовом этого действия, библиотека проверять наличие прав и либо его производит, либо выдает сообщение об ошибке. С учетом что код программы мы не трогаем и нигде в ручную проверки не прописываем.
Ну и собственно сами вопросы:
Как получить список всех действий (функций/процедур) программы куда подключилась библиотека?
Как их отлавливать?
И можно ли при написании программы, как то задавать псевдонимы или описания этим функциям, что бы в списке они появлялись с нормальным названием.
Ну и если подход к задаче не верный, то каким способом можно реализовать задумку?

21 Авг 2019 в 07:03
231 +1
1
Ответы
1

Для того чтобы получить список всех функций программы и перехватить их вызов, можно использовать такие методы как использование библиотеки Detours или использование API функций Windows, таких как GetProcAddress и VirtualProtect.

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

// Получить адрес функции
function GetFunctionAddress(ModuleName, FunctionName: string): Pointer;
var
ModuleHandle: HMODULE;
begin
ModuleHandle := GetModuleHandle(PChar(ModuleName));
Result := GetProcAddress(ModuleHandle, PChar(FunctionName));
end;
// Перехват функции
function NewFunction: ReturnType; stdcall;
begin
// Ваш код перехвата
end;
procedure HookFunction(ModuleName, FunctionName: string; NewFunction: Pointer);
var
FunctionAddr: Pointer;
OldProtect: DWORD;
begin
FunctionAddr := GetFunctionAddress(ModuleName, FunctionName);
VirtualProtect(FunctionAddr, SizeOf(Pointer), PAGE_EXECUTE_READWRITE, @OldProtect);
Pointer(FunctionAddr)^ := NewFunction;
VirtualProtect(FunctionAddr, SizeOf(Pointer), OldProtect, @OldProtect);
end;
// Пример вызова
HookFunction('Calculator.exe', 'AddFunction', @NewFunction);

Чтобы задать псевдонимы или описания функциям, можно создать структуру или класс, в которой будет храниться информация о функции, например:

type
TFunctionInfo = record
FunctionName: string;
AliasName: string;
Description: string;
FunctionPtr: Pointer;
end;
var
FunctionsList: array of TFunctionInfo;
// Пример добавления функции в список
SetLength(FunctionsList, Length(FunctionsList) + 1);
FunctionsList[High(FunctionsList)].FunctionName := 'AddFunction';
FunctionsList[High(FunctionsList)].AliasName := 'Сложить';
FunctionsList[High(FunctionsList)].Description := 'Складывает два числа';
FunctionsList[High(FunctionsList)].FunctionPtr := @AddFunction;

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

20 Апр в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 493 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир