Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Выполнить функцию по её названию из строки / 21 сообщений из 21, страница 1 из 1
02.05.2019, 13:00
    #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
02.05.2019, 13:04
    #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
02.05.2019, 13:09
    #39809207
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить функцию по её названию из строки
Dimitry Sibiryakov,

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


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

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

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

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

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

да, но надо знать ещё какую функцию вызвать. А имя её в шифрованном файле лицензии. Можно конечно купить лицензию и потом сломать. Но сломают так сломают, в след версии функция поменяется …. это не то что меня разорит :)
...
Рейтинг: 0 / 0
02.05.2019, 13:35
    #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
02.05.2019, 13:40
    #39809252
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить функцию по её названию из строки
hlopotunнадо знать ещё какую функцию вызвать. А имя её в шифрованном файле лицензии.

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

Массив указателей на функции, а в лицензию прошиваешь индекс нужной. Если уж так хочется
заморочиться.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.05.2019, 13:46
    #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
02.05.2019, 13:49
    #39809261
hlopotun
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить функцию по её названию из строки
Dimitry Sibiryakovhlopotunнадо знать ещё какую функцию вызвать. А имя её в шифрованном файле лицензии.

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

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

а где гарантия что этот индекс не изменится при перекомпиляции итп
через имя и проще и надёжнее. Ещё раз повторюсь. 100% защита не нужна.
...
Рейтинг: 0 / 0
02.05.2019, 14:02
    #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
02.05.2019, 14:05
    #39809271
shonli95
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить функцию по её названию из строки
hlopotunна 100% и ненужно защищать. Просто усложнить взлом. Серьёзной защиты требуют дорогие программы. Эта из разряда которую проще купить чем оплачивать взлом. Область применения довольно узкая а стоимость низкая.

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

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

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

Это твой массив, ты его заполняешь собственными руками. Где гарантия, что твои руки делают
то, что хочет твой мозг?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.05.2019, 16:20
    #39809300
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить функцию по её названию из строки
Мне кажется задача решается проще и надежнее таким образом:
1) запрет на работу отладчика
2) сжатие экзешника
Думаю, есть недорогие готовые решения.
...
Рейтинг: 0 / 0
02.05.2019, 22:35
    #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
03.05.2019, 10:55
    #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
03.05.2019, 11:01
    #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
03.05.2019, 11:27
    #39809440
Dimonka
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить функцию по её названию из строки
hlopotun,

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

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


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