Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Delphi+asm  [new]
Delphi_Watcher
Member

Откуда:
Сообщений: 45
Есть массив
var
  arr:  array[0..84991] of Byte =(
$4d,$5a,$90,$00,$03,$00,$00,$00,$04,$00,$00,$00,$ff,$ff,$00,$00,
$b8,$00,$00,$00,$00,$00,$00,$00,$40,$00,$00,$00,$00,$00,$00,$00,
$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,...
......
$00);
y:Pointer;


Не получается запустить его на выполнение:

asm
  MOV EAX, y
  LEA EBX, arr[0]
  CALL EBX
end;

Помогите запустить массив.

Модератор: Пользуйтесь тегом (кнопкой) SRC для оформления кода, пожалуйста.


Сообщение было отредактировано: 4 окт 19, 11:51
4 окт 19, 10:51    [21986504]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
alekcvp
Member

Откуда:
Сообщений: 1623
Delphi_Watcher,

https://stackoverflow.com/questions/38113551/can-i-execute-code-that-resides-in-data-segment-elf-binary
4 окт 19, 11:04    [21986522]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
Delphi_Watcher
Member

Откуда:
Сообщений: 45
alekcvp
Delphi_Watcher,

https://stackoverflow.com/questions/38113551/can-i-execute-code-that-resides-in-data-segment-elf-binary

не понятная статья
4 окт 19, 11:13    [21986534]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
alekcvp
Member

Откуда:
Сообщений: 1623
Delphi_Watcher
alekcvp
Delphi_Watcher,
https://stackoverflow.com/questions/38113551/can-i-execute-code-that-resides-in-data-segment-elf-binary

не понятная статья

Тогда, в твоём случае: выполнять код, который находится в сегменте данных, запрещено на аппаратном уровне.
4 окт 19, 11:21    [21986541]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
Delphi_Watcher
Member

Откуда:
Сообщений: 45
alekcvp, ДА можно как то на ассемблере выполнять код из массива делфи.
4 окт 19, 11:26    [21986548]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
Vladimir Baskakov
Member

Откуда:
Сообщений: 1993
Первый вопрос - зачем? Антивирусы позлить? ну если, чисто теоретически, то я бы попробовал сделать фейковую процедуру без параметров, которую оптимизатор не понимает, что ее можно выкинуть. Попытался записать исполняемый код в ее тушку, и перекрестясь....
4 окт 19, 11:34    [21986561]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
Delphi_Watcher
Member

Откуда:
Сообщений: 45
подскажите что нужно в эти трех строках изменить, очень нужно.
MOV EAX, y
LEA EBX, arr[0]
CALL EBX
4 окт 19, 11:46    [21986581]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
Vladimir Baskakov
Member

Откуда:
Сообщений: 1993
прямо в своей ассемблерной процедуре, забейте 1000 NOP - ов, или еще какой то фигни, и по этому адресу и пишите свой код из массива. а потом выполняйте.
..................
если прям хочется интересной жизни
4 окт 19, 11:46    [21986582]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
Vladimir Baskakov
Member

Откуда:
Сообщений: 1993
Delphi_Watcher
подскажите что нужно в эти трех строках изменить, очень нужно.
MOV EAX, y
LEA EBX, arr[0]
CALL EBX


1) это курсовик или что?
2) я с ассемблером работал 20 лет назад. Не все на лету помню.
3) вставьте в ассемблерный код кучу нопов, и присвойте метку. Считайте адрес метки, и пропишите туда массив, байт за байтом или слово за словом. Потом сделайте туда джамп или колл. На метку. Где раньше были НОПЫ а теперь прилетело из массива.

антивирь скорее всего временно стоит отключить.
4 окт 19, 11:51    [21986592]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
Vladimir Baskakov
Member

Откуда:
Сообщений: 1993
если эта инструкция непонятна, лучше найти того кто ее понимает, или подождать критики этого подхода людьми, которые лучше понимают как работают современные процессоры и операционные системы.

Вариант. Записывать байт за байтом в правильное место dll свой код. Динамически загружать. Вызывать ее метод.
Профит!
4 окт 19, 11:55    [21986598]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
Delphi_Watcher
Member

Откуда:
Сообщений: 45
Тут как то все проще делается, есть массив в который калькулятор запихнул, как мне этот массив выполнить на asm что бы калькулятор открылся.
4 окт 19, 11:59    [21986602]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
Delphi_Watcher
Member

Откуда:
Сообщений: 45
Vladimir Baskakov
Delphi_Watcher
подскажите что нужно в эти трех строках изменить, очень нужно.
MOV EAX, y
LEA EBX, arr[0]
CALL EBX


1) это курсовик или что?
2) я с ассемблером работал 20 лет назад. Не все на лету помню.
3) вставьте в ассемблерный код кучу нопов, и присвойте метку. Считайте адрес метки, и пропишите туда массив, байт за байтом или слово за словом. Потом сделайте туда джамп или колл. На метку. Где раньше были НОПЫ а теперь прилетело из массива.

антивирь скорее всего временно стоит отключить.


Да мне пофиг на этот антивирус, мне надо запустить массив командами asm.
4 окт 19, 12:39    [21986648]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
ziv-2014
Member

Откуда:
Сообщений: 468
Как вариант можно сделать так.
+

unit CnCallBack;

interface

uses
  Classes, Windows, SysUtils;

type
  ECallBackException = class(Exception)
  end;

function StdcallMethodToCallBack(ASelf: Pointer; AMethodAddr: Pointer): Pointer;
{* Ѕ« stdcall µДАаіЙФ±єЇКэєНКµАэјУТФ°ьЧ°Ј¬·µ»ШТ»ёцРВµД stdcall µД»ШµчєЇКэµШЦ· }

{* К№УГУп·Ё:
  @AStdCallbackFunc := StdcallMethodToCallBack(AObject, @TAObject.CallbackMethod);
  ЖдЦР AStdCallbackFunc єН CallbackMethod ¶ј±ШРлК№УГ stdcall ЙщГчЎЈ
}

implementation

type
  TCnCallback = array [1..18] of Byte; // °ґґъВлЦРЧоі¤µДАґ
  PCnCallback = ^TCnCallback;
  
const
  THUNK_SIZE = 4096; // x86 ТіґуРЎЈ¬ДїЗ°Ц»ЕЄТ»ёцТіГж

  StdcallCode: TCnCallback =
    ($8B,$04,$24,$50,$B8,$00,$00,$00,$00,$89,$44,$24,$04,$E9,$00,$00,$00,$00);

  {----------------------------}
  { Stdcall CallbackCode ASM   }
  {----------------------------}
  {    MOV EAX, [ESP];         }
  {    PUSH EAX;               }
  {    MOV EAX, ASelf;         }
  {    MOV [ESP+4], EAX;       }
  {    JMP AMethodAddr;        }
  {----------------------------}

var
  FCallBackPool: Pointer = nil;
  FEmptyPtr: Integer = 0;
  FCS: TRTLCriticalSection;

procedure InitCallBackPool;
begin
  FCallBackPool := VirtualAlloc(nil, THUNK_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  if FCallBackPool = nil then
    raise ECallBackException.Create('Callback Pool Init Error!');
end;

function StdcallMethodToCallBack(ASelf: Pointer; AMethodAddr: Pointer): Pointer;
var
  Instance: PCnCallback;
begin
  Result := nil;
  Instance := nil;
  
  try
    EnterCriticalSection(FCS);

    if FCallBackPool = nil then
    begin
      InitCallBackPool;
      Instance := FCallBackPool;
    end
    else
    begin
      if FEmptyPtr = (THUNK_SIZE div SizeOf(TCnCallback)) then
        raise ECallBackException.Create('Callback Pool Overflow!');

      Inc(FEmptyPtr);
      Instance := PCnCallback(Integer(FCallBackPool) + FEmptyPtr * SizeOf(TCnCallback));
    end;
  finally
    LeaveCriticalSection(FCS);
  end;

  if Instance <> nil then
  begin
    Move(StdcallCode, Instance^, SizeOf(TCnCallback));
    PInteger(@(Instance^[6]))^ := Integer(ASelf);
    PInteger(@(Instance^[15]))^ := Integer(Integer(AMethodAddr) - Integer(Instance) - 18);
    Result := Instance;
  end;
end;

initialization
  InitializeCriticalSection(FCS);

finalization
  DeleteCriticalSection(FCS);
  if FCallBackPool <> nil then
    VirtualFree(FCallBackPool, 0, MEM_RELEASE);

end.

4 окт 19, 12:51    [21986659]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
Delphi_Watcher
Member

Откуда:
Сообщений: 45
ziv-2014
Как вариант можно сделать так.
+

unit CnCallBack;

interface

uses
  Classes, Windows, SysUtils;

type
  ECallBackException = class(Exception)
  end;

function StdcallMethodToCallBack(ASelf: Pointer; AMethodAddr: Pointer): Pointer;
{* Ѕ« stdcall µДАаіЙФ±єЇКэєНКµАэјУТФ°ьЧ°Ј¬·µ»ШТ»ёцРВµД stdcall µД»ШµчєЇКэµШЦ· }

{* К№УГУп·Ё:
  @AStdCallbackFunc := StdcallMethodToCallBack(AObject, @TAObject.CallbackMethod);
  ЖдЦР AStdCallbackFunc єН CallbackMethod ¶ј±ШРлК№УГ stdcall ЙщГчЎЈ
}

implementation

type
  TCnCallback = array [1..18] of Byte; // °ґґъВлЦРЧоі¤µДАґ
  PCnCallback = ^TCnCallback;
  
const
  THUNK_SIZE = 4096; // x86 ТіґуРЎЈ¬ДїЗ°Ц»ЕЄТ»ёцТіГж

  StdcallCode: TCnCallback =
    ($8B,$04,$24,$50,$B8,$00,$00,$00,$00,$89,$44,$24,$04,$E9,$00,$00,$00,$00);

  {----------------------------}
  { Stdcall CallbackCode ASM   }
  {----------------------------}
  {    MOV EAX, [ESP];         }
  {    PUSH EAX;               }
  {    MOV EAX, ASelf;         }
  {    MOV [ESP+4], EAX;       }
  {    JMP AMethodAddr;        }
  {----------------------------}

var
  FCallBackPool: Pointer = nil;
  FEmptyPtr: Integer = 0;
  FCS: TRTLCriticalSection;

procedure InitCallBackPool;
begin
  FCallBackPool := VirtualAlloc(nil, THUNK_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  if FCallBackPool = nil then
    raise ECallBackException.Create('Callback Pool Init Error!');
end;

function StdcallMethodToCallBack(ASelf: Pointer; AMethodAddr: Pointer): Pointer;
var
  Instance: PCnCallback;
begin
  Result := nil;
  Instance := nil;
  
  try
    EnterCriticalSection(FCS);

    if FCallBackPool = nil then
    begin
      InitCallBackPool;
      Instance := FCallBackPool;
    end
    else
    begin
      if FEmptyPtr = (THUNK_SIZE div SizeOf(TCnCallback)) then
        raise ECallBackException.Create('Callback Pool Overflow!');

      Inc(FEmptyPtr);
      Instance := PCnCallback(Integer(FCallBackPool) + FEmptyPtr * SizeOf(TCnCallback));
    end;
  finally
    LeaveCriticalSection(FCS);
  end;

  if Instance <> nil then
  begin
    Move(StdcallCode, Instance^, SizeOf(TCnCallback));
    PInteger(@(Instance^[6]))^ := Integer(ASelf);
    PInteger(@(Instance^[15]))^ := Integer(Integer(AMethodAddr) - Integer(Instance) - 18);
    Result := Instance;
  end;
end;

initialization
  InitializeCriticalSection(FCS);

finalization
  DeleteCriticalSection(FCS);
  if FCallBackPool <> nil then
    VirtualFree(FCallBackPool, 0, MEM_RELEASE);

end.



а мой код как то можно поправить?
4 окт 19, 12:55    [21986666]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
Vladimir Baskakov
Member

Откуда:
Сообщений: 1993
Delphi_Watcher
Тут как то все проще делается, есть массив в который калькулятор запихнул, как мне этот массив выполнить на asm что бы калькулятор открылся.


открыть калькулятор через ассемблер, это собеседование или курсовик.
Если курсовик, то его знают сокурсники. Если собеседование, то нафига работа в которой не понимаешь .....
Сорри если что не так.
4 окт 19, 13:02    [21986669]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
ziv-2014
Member

Откуда:
Сообщений: 468
Delphi_Watcher
ziv-2014
Как вариант можно сделать так.
+

unit CnCallBack;

interface

uses
  Classes, Windows, SysUtils;

type
  ECallBackException = class(Exception)
  end;

function StdcallMethodToCallBack(ASelf: Pointer; AMethodAddr: Pointer): Pointer;
{* Ѕ« stdcall µДАаіЙФ±єЇКэєНКµАэјУТФ°ьЧ°Ј¬·µ»ШТ»ёцРВµД stdcall µД»ШµчєЇКэµШЦ· }

{* К№УГУп·Ё:
  @AStdCallbackFunc := StdcallMethodToCallBack(AObject, @TAObject.CallbackMethod);
  ЖдЦР AStdCallbackFunc єН CallbackMethod ¶ј±ШРлК№УГ stdcall ЙщГчЎЈ
}

implementation

type
  TCnCallback = array [1..18] of Byte; // °ґґъВлЦРЧоі¤µДАґ
  PCnCallback = ^TCnCallback;
  
const
  THUNK_SIZE = 4096; // x86 ТіґуРЎЈ¬ДїЗ°Ц»ЕЄТ»ёцТіГж

  StdcallCode: TCnCallback =
    ($8B,$04,$24,$50,$B8,$00,$00,$00,$00,$89,$44,$24,$04,$E9,$00,$00,$00,$00);

  {----------------------------}
  { Stdcall CallbackCode ASM   }
  {----------------------------}
  {    MOV EAX, [ESP];         }
  {    PUSH EAX;               }
  {    MOV EAX, ASelf;         }
  {    MOV [ESP+4], EAX;       }
  {    JMP AMethodAddr;        }
  {----------------------------}

var
  FCallBackPool: Pointer = nil;
  FEmptyPtr: Integer = 0;
  FCS: TRTLCriticalSection;

procedure InitCallBackPool;
begin
  FCallBackPool := VirtualAlloc(nil, THUNK_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  if FCallBackPool = nil then
    raise ECallBackException.Create('Callback Pool Init Error!');
end;

function StdcallMethodToCallBack(ASelf: Pointer; AMethodAddr: Pointer): Pointer;
var
  Instance: PCnCallback;
begin
  Result := nil;
  Instance := nil;
  
  try
    EnterCriticalSection(FCS);

    if FCallBackPool = nil then
    begin
      InitCallBackPool;
      Instance := FCallBackPool;
    end
    else
    begin
      if FEmptyPtr = (THUNK_SIZE div SizeOf(TCnCallback)) then
        raise ECallBackException.Create('Callback Pool Overflow!');

      Inc(FEmptyPtr);
      Instance := PCnCallback(Integer(FCallBackPool) + FEmptyPtr * SizeOf(TCnCallback));
    end;
  finally
    LeaveCriticalSection(FCS);
  end;

  if Instance <> nil then
  begin
    Move(StdcallCode, Instance^, SizeOf(TCnCallback));
    PInteger(@(Instance^[6]))^ := Integer(ASelf);
    PInteger(@(Instance^[15]))^ := Integer(Integer(AMethodAddr) - Integer(Instance) - 18);
    Result := Instance;
  end;
end;

initialization
  InitializeCriticalSection(FCS);

finalization
  DeleteCriticalSection(FCS);
  if FCallBackPool <> nil then
    VirtualFree(FCallBackPool, 0, MEM_RELEASE);

end.



а мой код как то можно поправить?

Там же Делфийским языком написано:
1. Выдели память для исполнения
2. Скопируй туда свой код
3. Вызови код
4. Очисти память после вызова
Дальше же сам думай, крутись :)
4 окт 19, 13:02    [21986670]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
Delphi_Watcher
Member

Откуда:
Сообщений: 45
ziv-2014
Delphi_Watcher
пропущено...


а мой код как то можно поправить?

Там же Делфийским языком написано:
1. Выдели память для исполнения
2. Скопируй туда свой код
3. Вызови код
4. Очисти память после вызова
Дальше же сам думай, крутись :)


Нет мне так не пойдет, у меня этот код как то работал, вот пытаюсь восстановить...
4 окт 19, 13:05    [21986672]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
Delphi_Watcher
Member

Откуда:
Сообщений: 45
У меня тремя строками запускался массив, просто забыл как((( помогите кто знает
4 окт 19, 13:05    [21986673]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
Vladimir Baskakov
Member

Откуда:
Сообщений: 1993
FCallBackPool := VirtualAlloc(nil, THUNK_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
- это кстати объясняет, где я глупость сказал. конечно же прав на запись на те участки, где лежит код может и не быть.
4 окт 19, 13:09    [21986680]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
Vladimir Baskakov
Member

Откуда:
Сообщений: 1993
Delphi_Watcher
У меня тремя строками запускался массив, просто забыл как((( помогите кто знает


на каком процессоре или операционке?
4 окт 19, 13:10    [21986682]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48594

Delphi_Watcher
У меня тремя строками запускался массив, просто забыл как(((

Времена DOS давно прошли, теперь запрещены почти все трюки внедрения исполняемого кода.
Вызывай свой калькулятор через CreateProcess('calc.exe') и не выпендривайся.

Posted via ActualForum NNTP Server 1.5

4 окт 19, 13:11    [21986684]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
defecator
Member

Откуда:
Сообщений: 39363
Vladimir Baskakov
Delphi_Watcher
У меня тремя строками запускался массив, просто забыл как((( помогите кто знает


на каком процессоре или операционке?

и под какими дельфями
4 окт 19, 13:12    [21986685]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
Delphi_Watcher
Member

Откуда:
Сообщений: 45
defecator
Vladimir Baskakov
пропущено...


на каком процессоре или операционке?

и под какими дельфями

Если память не изменяет то по Delphi 7.
4 окт 19, 13:18    [21986693]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
defecator
Member

Откуда:
Сообщений: 39363
Delphi_Watcher
ziv-2014
пропущено...

Там же Делфийским языком написано:
1. Выдели память для исполнения
2. Скопируй туда свой код
3. Вызови код
4. Очисти память после вызова
Дальше же сам думай, крутись :)


Нет мне так не пойдет, у меня этот код как то работал, вот пытаюсь восстановить...

почему не подойдёт ? за тебя уже всё сделано, осталось три строки написать
4 окт 19, 13:20    [21986696]     Ответить | Цитировать Сообщить модератору
 Re: Delphi+asm  [new]
ziv-2014
Member

Откуда:
Сообщений: 468
Delphi_Watcher
ziv-2014
пропущено...

Там же Делфийским языком написано:
1. Выдели память для исполнения
2. Скопируй туда свой код
3. Вызови код
4. Очисти память после вызова
Дальше же сам думай, крутись :)


Нет мне так не пойдет, у меня этот код как то работал, вот пытаюсь восстановить...

Тогда сиди и плач
4 окт 19, 13:36    [21986710]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить