Как получить список всех функций и перехватить их вызов (Delphi)? Например есть программка калькулятор. В ней есть 4 действия (функции): сложить, умножить, вычесть, разделить. Прикручиваем к нему процедуру динамического подключения внешних библиотек. Компилируем и больше исходный код программы не трогаем. Теперь пишем библиотеку авторизации со своими формами. В итоге, хочется, просто подключив в программе калькулятора эту библиотеку, что бы она выводила в своей форме все его события для назначения доступа тому или иному пользователю. И теперь, перед каждым вызовом этого действия, библиотека проверять наличие прав и либо его производит, либо выдает сообщение об ошибке. С учетом что код программы мы не трогаем и нигде в ручную проверки не прописываем. Ну и собственно сами вопросы: Как получить список всех действий (функций/процедур) программы куда подключилась библиотека? Как их отлавливать? И можно ли при написании программы, как то задавать псевдонимы или описания этим функциям, что бы в списке они появлялись с нормальным названием. Ну и если подход к задаче не верный, то каким способом можно реализовать задумку?
Для того чтобы получить список всех функций программы и перехватить их вызов, можно использовать такие методы как использование библиотеки 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;
Таким образом, можно реализовать перехват вызовов функций и добавление информации о них для дальнейшего использования в библиотеке авторизации.
Для того чтобы получить список всех функций программы и перехватить их вызов, можно использовать такие методы как использование библиотеки 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);
Чтобы задать псевдонимы или описания функциям, можно создать структуру или класс, в которой будет храниться информация о функции, например:
typeTFunctionInfo = 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;
Таким образом, можно реализовать перехват вызовов функций и добавление информации о них для дальнейшего использования в библиотеке авторизации.