powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi+asm
25 сообщений из 49, страница 1 из 2
Delphi+asm
    #39871511
Delphi_Watcher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть массив
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
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;



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

Код: pascal
1.
2.
3.
4.
5.
asm
  MOV EAX, y
  LEA EBX, arr[0]
  CALL EBX
end;


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

Модератор: Пользуйтесь тегом (кнопкой) SRC для оформления кода, пожалуйста.
...
Рейтинг: 0 / 0
Delphi+asm
    #39871515
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Delphi+asm
    #39871520
Delphi_Watcher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Delphi+asm
    #39871523
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Delphi_WatcheralekcvpDelphi_Watcher,
https://stackoverflow.com/questions/38113551/can-i-execute-code-that-resides-in-data-segment-elf-binary
не понятная статья
Тогда, в твоём случае: выполнять код, который находится в сегменте данных, запрещено на аппаратном уровне.
...
Рейтинг: 0 / 0
Delphi+asm
    #39871527
Delphi_Watcher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp, ДА можно как то на ассемблере выполнять код из массива делфи.
...
Рейтинг: 0 / 0
Delphi+asm
    #39871535
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Первый вопрос - зачем? Антивирусы позлить? ну если, чисто теоретически, то я бы попробовал сделать фейковую процедуру без параметров, которую оптимизатор не понимает, что ее можно выкинуть. Попытался записать исполняемый код в ее тушку, и перекрестясь....
...
Рейтинг: 0 / 0
Delphi+asm
    #39871548
Delphi_Watcher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
подскажите что нужно в эти трех строках изменить, очень нужно.
MOV EAX, y
LEA EBX, arr[0]
CALL EBX
...
Рейтинг: 0 / 0
Delphi+asm
    #39871549
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
прямо в своей ассемблерной процедуре, забейте 1000 NOP - ов, или еще какой то фигни, и по этому адресу и пишите свой код из массива. а потом выполняйте.
..................
если прям хочется интересной жизни
...
Рейтинг: 0 / 0
Delphi+asm
    #39871559
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Delphi_Watcherподскажите что нужно в эти трех строках изменить, очень нужно.
MOV EAX, y
LEA EBX, arr[0]
CALL EBX

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

антивирь скорее всего временно стоит отключить.
...
Рейтинг: 0 / 0
Delphi+asm
    #39871565
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если эта инструкция непонятна, лучше найти того кто ее понимает, или подождать критики этого подхода людьми, которые лучше понимают как работают современные процессоры и операционные системы.

Вариант. Записывать байт за байтом в правильное место dll свой код. Динамически загружать. Вызывать ее метод.
Профит!
...
Рейтинг: 0 / 0
Delphi+asm
    #39871569
Delphi_Watcher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут как то все проще делается, есть массив в который калькулятор запихнул, как мне этот массив выполнить на asm что бы калькулятор открылся.
...
Рейтинг: 0 / 0
Delphi+asm
    #39871609
Delphi_Watcher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Vladimir BaskakovDelphi_Watcherподскажите что нужно в эти трех строках изменить, очень нужно.
MOV EAX, y
LEA EBX, arr[0]
CALL EBX

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

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

Да мне пофиг на этот антивирус, мне надо запустить массив командами asm.
...
Рейтинг: 0 / 0
Delphi+asm
    #39871617
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант можно сделать так.

Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
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.


...
Рейтинг: 0 / 0
Delphi+asm
    #39871621
Delphi_Watcher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ziv-2014Как вариант можно сделать так.

Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
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.




а мой код как то можно поправить?
...
Рейтинг: 0 / 0
Delphi+asm
    #39871623
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Delphi_WatcherТут как то все проще делается, есть массив в который калькулятор запихнул, как мне этот массив выполнить на asm что бы калькулятор открылся.

открыть калькулятор через ассемблер, это собеседование или курсовик.
Если курсовик, то его знают сокурсники. Если собеседование, то нафига работа в которой не понимаешь .....
Сорри если что не так.
...
Рейтинг: 0 / 0
Delphi+asm
    #39871624
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Delphi_Watcherziv-2014Как вариант можно сделать так.

Код: 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.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
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. Очисти память после вызова
Дальше же сам думай, крутись :)
...
Рейтинг: 0 / 0
Delphi+asm
    #39871625
Delphi_Watcher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ziv-2014Delphi_Watcherпропущено...


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

Нет мне так не пойдет, у меня этот код как то работал, вот пытаюсь восстановить...
...
Рейтинг: 0 / 0
Delphi+asm
    #39871626
Delphi_Watcher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня тремя строками запускался массив, просто забыл как((( помогите кто знает
...
Рейтинг: 0 / 0
Delphi+asm
    #39871630
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FCallBackPool := VirtualAlloc(nil, THUNK_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
- это кстати объясняет, где я глупость сказал. конечно же прав на запись на те участки, где лежит код может и не быть.
...
Рейтинг: 0 / 0
Delphi+asm
    #39871631
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Delphi_WatcherУ меня тремя строками запускался массив, просто забыл как((( помогите кто знает

на каком процессоре или операционке?
...
Рейтинг: 0 / 0
Delphi+asm
    #39871632
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Delphi_WatcherУ меня тремя строками запускался массив, просто забыл как(((

Времена DOS давно прошли, теперь запрещены почти все трюки внедрения исполняемого кода.
Вызывай свой калькулятор через CreateProcess('calc.exe') и не выпендривайся.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Delphi+asm
    #39871633
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Vladimir BaskakovDelphi_WatcherУ меня тремя строками запускался массив, просто забыл как((( помогите кто знает

на каком процессоре или операционке?
и под какими дельфями
...
Рейтинг: 0 / 0
Delphi+asm
    #39871636
Delphi_Watcher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecatorVladimir Baskakovпропущено...


на каком процессоре или операционке?
и под какими дельфями
Если память не изменяет то по Delphi 7.
...
Рейтинг: 0 / 0
Delphi+asm
    #39871637
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Delphi_Watcherziv-2014пропущено...

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

Нет мне так не пойдет, у меня этот код как то работал, вот пытаюсь восстановить...
почему не подойдёт ? за тебя уже всё сделано, осталось три строки написать
...
Рейтинг: 0 / 0
Delphi+asm
    #39871642
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Delphi_Watcherziv-2014пропущено...

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

Нет мне так не пойдет, у меня этот код как то работал, вот пытаюсь восстановить...
Тогда сиди и плач
...
Рейтинг: 0 / 0
25 сообщений из 49, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi+asm
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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