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

21 Авг 2019 в 07:03
272 +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 Апр 2024 в 13:09
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир