powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Выполнить функцию по её названию из строки
21 сообщений из 21, страница 1 из 1
Выполнить функцию по её названию из строки
    #39809196
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет,

сразу оговорюсь случай когда функция не является членом класса.
В случае класса через MethodAdress как то так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
type
  TMyFuncType = function(a: integer; b: integer): string of object;

  TMyClass = class
  published
    function Func1(a: integer; b: integer): string;
    function Func2(a: integer; b: integer): string;
    function Func3(a: integer; b: integer): string;
  public
    function Call(MethodName: string; a, b: integer): string;
  end;

function TMyClass.Call(MethodName: string; a, b: integer): string;
var m: TMethod;
begin
  m.Code := Self.MethodAddress(MethodName); //find method code
  m.Data := pointer(Self); //store pointer to object instance
  Result := TMyFuncType(m)(a, b);
end;

{...}

//use it like this
var MyClass: TMyClass;
begin
  MyClass := TMyClass.Create;
  MyClass.Call('Func1', 3, 5);
  MyClass.Call('Func2', 6, 4);
  MyClass.Destroy;
end.



А если функция не член класса?
...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809203
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
if FunctionName = 'func1' then func1(a,b)
else if FunctionName = 'func2' then func2(a,b,c);


"Унутре" оно всё равно именно так и действует.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809207
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

это одна из функций имя которой берётся из шифрованного файла. Если использовать такой метод то при отладке легче разобраться какую функцию вызывать и взлом облегчается. Понятно можно методом перебора найти нужную функцию. Но это хоть как то осложнит взлом.
...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809211
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тогда
Код: sql
1.
if FunctionName = 'func1' then XPEH(B,A,M);


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809215
Фотография Dimonka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun,

Я бы попробовал посоветовать отказаться от идеи защищать самому. По многим причинам. Если кратко - это сложно сделать качественно и в 99% случаев вообще не нужно.
Воспользуйся готовой защитой.
...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809225
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimonkahlopotun,

Я бы попробовал посоветовать отказаться от идеи защищать самому. По многим причинам. Если кратко - это сложно сделать качественно и в 99% случаев вообще не нужно.
Воспользуйся готовой защитой.
на 100% и ненужно защищать. Просто усложнить взлом. Серьёзной защиты требуют дорогие программы. Эта из разряда которую проще купить чем оплачивать взлом. Область применения довольно узкая а стоимость низкая.
...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809232
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotunПросто усложнить взлом.

Парень, вытащи уже голову из... песка. То, что массив соответствия имён адресам спрятан
(от тебя) под ковриком какой-то библиотеки, для отладчика - ничего не меняет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809240
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovhlopotunПросто усложнить взлом.

Парень, вытащи уже голову из... песка. То, что массив соответствия имён адресам спрятан
(от тебя) под ковриком какой-то библиотеки, для отладчика - ничего не меняет.

да, но надо знать ещё какую функцию вызвать. А имя её в шифрованном файле лицензии. Можно конечно купить лицензию и потом сломать. Но сломают так сломают, в след версии функция поменяется …. это не то что меня разорит :)
...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809248
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotunВсем привет,

сразу оговорюсь случай когда функция не является членом класса.
В случае класса через MethodAdress как то так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
type
  TMyFuncType = function(a: integer; b: integer): string of object;

  TMyClass = class
  published
    function Func1(a: integer; b: integer): string;
    function Func2(a: integer; b: integer): string;
    function Func3(a: integer; b: integer): string;
  public
    function Call(MethodName: string; a, b: integer): string;
  end;

function TMyClass.Call(MethodName: string; a, b: integer): string;
var m: TMethod;
begin
  m.Code := Self.MethodAddress(MethodName); //find method code
  m.Data := pointer(Self); //store pointer to object instance
  Result := TMyFuncType(m)(a, b);
end;

{...}

//use it like this
var MyClass: TMyClass;
begin
  MyClass := TMyClass.Create;
  MyClass.Call('Func1', 3, 5);
  MyClass.Call('Func2', 6, 4);
  MyClass.Destroy;
end.



TRttiMethod.Invoke спасет отца дельфийской демократии
...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809252
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotunнадо знать ещё какую функцию вызвать. А имя её в шифрованном файле лицензии.

Ты серьёзно? Имя?..

Массив указателей на функции, а в лицензию прошиваешь индекс нужной. Если уж так хочется
заморочиться.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809257
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Квейд,

через RTTI тоже вроде только через класс:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
 TProcClass = class
    public
      procedure SayHi;
      function GetSum(X,Y:Integer): Integer;
  end;

uses
  Rtti;

{ TProcClass }

procedure TProcClass.SayHi;
begin
  ShowMessage('Hi');
end;

function TProcClass.GetSum(X, Y: Integer): Integer;
begin
  ShowMessage(IntToStr(X + Y));
end;

procedure ExecMethod(MethodName:string; const Args: array of TValue);
var
 R : TRttiContext;
 T : TRttiType;
 M : TRttiMethod;
begin
  T := R.GetType(TProcClass);
  for M in t.GetMethods do
    if (m.Parent = t) and (m.Name = MethodName)then
      M.Invoke(TProcClass.Create,Args)
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ExecMethod('SayHi',[]);
  ExecMethod('GetSum',[10,20]);
end;


...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809261
hlopotun
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakovhlopotunнадо знать ещё какую функцию вызвать. А имя её в шифрованном файле лицензии.

Ты серьёзно? Имя?..

Массив указателей на функции, а в лицензию прошиваешь индекс нужной. Если уж так хочется
заморочиться.

а где гарантия что этот индекс не изменится при перекомпиляции итп
через имя и проще и надёжнее. Ещё раз повторюсь. 100% защита не нужна.
...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809268
shonli95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот тут есть пример, если функция это функция обычная.
https://github.com/NyaSik/php_wincall7.1/blob/master/php_WinCall.dpr#L543

Для вызова загружается через обычный GetProcAddress Значит подойдёт и обычный адрес на функцию.
https://github.com/NyaSik/php_wincall7.1/blob/master/php_WinCall.dpr#L566


То есть, адрес надо куда - то добавить, что бы потом искать его. Тот же TDictionary<string, Pointer>
...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809271
shonli95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hlopotunна 100% и ненужно защищать. Просто усложнить взлом. Серьёзной защиты требуют дорогие программы. Эта из разряда которую проще купить чем оплачивать взлом. Область применения довольно узкая а стоимость низкая.

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

И человек сразу узнает где он сейчас, при выполнение каких - то условий.

Это никак не защитить, кроме того как запретить коннектится к процессу.
...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809276
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotunа где гарантия что этот индекс не изменится при перекомпиляции

Это твой массив, ты его заполняешь собственными руками. Где гарантия, что твои руки делают
то, что хочет твой мозг?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809300
Фотография Victor Cookin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне кажется задача решается проще и надежнее таким образом:
1) запрет на работу отладчика
2) сжатие экзешника
Думаю, есть недорогие готовые решения.
...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809364
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun...
А если функция не член класса?
Например, ничто не мешает объявить функцию экспортируемой, все как в .dll -
Код: pascal
1.
2.
3.
4.
5.
6.
procedure a(...); export;
begin
...
end;

exports a name 'b';


Доступ к процедуркам - посредством LoadLibraryEx*:
https://docs.microsoft.com/en-us/windows/desktop/api/libloaderapi/nf-libloaderapi-loadlibraryexw
https://docs.microsoft.com/en-us/windows/desktop/api/libloaderapi/nf-libloaderapi-loadlibraryexa
- с флажком DONT_RESOLVE_DLL_REFERENCES.
...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809428
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ёёёёёhlopotun...
А если функция не член класса?
Например, ничто не мешает объявить функцию экспортируемой, все как в .dll -
Код: pascal
1.
procedure a(...); export;


Доступ к процедуркам - посредством LoadLibraryEx*:


+1

Только можно обойтись без LoadLibraryEx

Объявление функции:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
unit Unit2;

interface

implementation

function MyFunc( i : integer ) : integer; export;
begin
  Result := Succ( i );
end;

exports
  MyFunc;

end.



Вызов функции:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
type
  TFunc = function ( i : integer ) : integer;

procedure TForm1.Button1Click(Sender: TObject);
var
  h : THandle;
  f : TFunc;
  i : integer;
begin
  h := GetModuleHandleA( pAnsiChar( ParamStr( 0 ) ) );
  f := GetProcAddress( h, 'MyFunc' );
  i := f( 9 );
end;



С уважением, Polesov.
...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809431
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использование GetModuleHandleA тоже не требуется:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
type
  TFunc = function ( i : integer ) : integer;

procedure TForm1.Button1Click(Sender: TObject);
var
  f : TFunc;
  i : integer;
begin
  f := GetProcAddress( hInstance, 'MyFunc' );
  i := f( 9 );
end;
...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809440
Фотография Dimonka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hlopotun,

Кодируй скрипт разблокировки в ключе и запускай его после введения ключа. Делов-то.
Скрипт можно пропустить через обфускатор, чтобы названия функций были F1, F2, F3.. В скрипторе зарегистрировать миллион функций, чтобы взломщикам угадывать было интереснее. Как-то так.
...
Рейтинг: 0 / 0
Выполнить функцию по её названию из строки
    #39809483
shonli95
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Любой отладчик прыгнет в call и jmp куда угодно, включая библиотеки по адресам.

Вообще не понимаю с каких пор косвенный вызов адреса даёт хоть что - то)
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Выполнить функцию по её названию из строки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]