Инъекция кода в Delphi: как заменить функцию?Linux

Ответить
Anonymous
 Инъекция кода в Delphi: как заменить функцию?

Сообщение Anonymous »

Я использую какой-то сторонний компонент в приложении FiremonKey для Linux, разработанного в Embarcadero Rad Studio 10.4.
Этот компонент является пробным и показывает сообщение при первом запусках. Обычное окно showmessage () (от fmx.dialogs). < /P>
Я решил скрыть это сообщение в тестовых целях, поэтому сначала попытался выполнить работу с компонентом в другом потоке, где Showmessage ( ) не может быть показан (потому что это не основной поток). Как и ожидалось, компонент отказался работать из -за исключения. < /P>
Поэтому я решил сделать инъекцию памяти. Это сработало (в Linux). Но теперь у меня есть вопрос, который я пишу ниже код. < /P>

Код: Выделить всё

type
size_t = NativeUInt;

var
asm_cmd: Integer;
flag_NeedRemove_RET: Boolean;

const
PROT_READ = 1;
PROT_WRITE = 2;
PROT_EXEC = 4;

function mprotect(Addr: Pointer; Len: size_t; Prot: Integer): Integer; cdecl external 'libc.so' name 'mprotect';
function getpagesize: Integer; external 'libc.so' name 'getpagesize';

implementation

uses
Posix.Base;

...

function InjectCode(PDest: Pointer; PSrc: Pointer; Size: Integer): Boolean;
var
SysPageSize, PageSize, AlignedAddr: Integer;
begin
Result := False;
SysPageSize := getpagesize;
AlignedAddr := (Integer(PDest) - 1) and not (SysPageSize - 1);

PageSize := SysPageSize;
while Integer(PDest) - 1 + Size >= AlignedAddr + PageSize do
Inc(PageSize, SysPageSize);

if mprotect(Pointer(AlignedAddr), PageSize, PROT_READ or PROT_WRITE or PROT_EXEC) = 0 then
try
Move(PSrc^, PDest^, Size);

if mprotect(Pointer(AlignedAddr), PageSize, PROT_READ or PROT_EXEC) = 0 then
Result := True;
except
end;
end;

...

procedure TForm.btComponentRunClick(Sender: TObject);
begin
Component.Run;  // Here is a component call with hidden ShowMessage inside

// Restoring original ShowMessage
if flag_NeedRemove_RET then
begin
asm_cmd := $55;
if not InjectCode(Addr(ShowMessage), Addr(asm_cmd), 1) then
raise Exception.Create('Error code injection');

flag_NeedRemove_RET := False;
end;
end;

initialization

// Setting force exit at start of ShowMessage
asm_cmd := $C3;
if not InjectCode(Addr(ShowMessage), Addr(asm_cmd), 1) then
raise Exception.Create('Error code injection');

flag_NeedRemove_RET := True;
Вопрос: Как заменить showmessage () на другой вызов, а не только выход ? Теперь я просто скрываю сообщение от ShowMessage, выходя из процедуры в начале. Но что, если я хочу заменить ShowMessage на другой звонок? Является ли это возможным? Все попытки сделать примеры рабочих испытаний были неудачными ... < /p>
и вопрос №2 (меньше): нарушать ли я любое из пользовательских соглашений этим действием, если я не сделаю это В тестовых целях? Я не изменяю код компонента ... все, что я делаю, это изменение кода функций Embarcadero в памяти.

Подробнее здесь: https://stackoverflow.com/questions/794 ... e-function
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»