Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi+asm / 25 сообщений из 49, страница 1 из 2
04.10.2019, 10:51
    #39871511
Delphi_Watcher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+asm
Есть массив
Код: 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
04.10.2019, 11:04
    #39871515
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+asm
...
Рейтинг: 0 / 0
04.10.2019, 11:13
    #39871520
Delphi_Watcher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+asm
...
Рейтинг: 0 / 0
04.10.2019, 11:21
    #39871523
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+asm
Delphi_WatcheralekcvpDelphi_Watcher,
https://stackoverflow.com/questions/38113551/can-i-execute-code-that-resides-in-data-segment-elf-binary
не понятная статья
Тогда, в твоём случае: выполнять код, который находится в сегменте данных, запрещено на аппаратном уровне.
...
Рейтинг: 0 / 0
04.10.2019, 11:26
    #39871527
Delphi_Watcher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+asm
alekcvp, ДА можно как то на ассемблере выполнять код из массива делфи.
...
Рейтинг: 0 / 0
04.10.2019, 11:34
    #39871535
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+asm
Первый вопрос - зачем? Антивирусы позлить? ну если, чисто теоретически, то я бы попробовал сделать фейковую процедуру без параметров, которую оптимизатор не понимает, что ее можно выкинуть. Попытался записать исполняемый код в ее тушку, и перекрестясь....
...
Рейтинг: 0 / 0
04.10.2019, 11:46
    #39871548
Delphi_Watcher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+asm
подскажите что нужно в эти трех строках изменить, очень нужно.
MOV EAX, y
LEA EBX, arr[0]
CALL EBX
...
Рейтинг: 0 / 0
04.10.2019, 11:46
    #39871549
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+asm
прямо в своей ассемблерной процедуре, забейте 1000 NOP - ов, или еще какой то фигни, и по этому адресу и пишите свой код из массива. а потом выполняйте.
..................
если прям хочется интересной жизни
...
Рейтинг: 0 / 0
04.10.2019, 11:51
    #39871559
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+asm
Delphi_Watcherподскажите что нужно в эти трех строках изменить, очень нужно.
MOV EAX, y
LEA EBX, arr[0]
CALL EBX

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

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

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

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

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

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

Код: 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
04.10.2019, 12:55
    #39871621
Delphi_Watcher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+asm
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
04.10.2019, 13:02
    #39871623
Vladimir Baskakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+asm
Delphi_WatcherТут как то все проще делается, есть массив в который калькулятор запихнул, как мне этот массив выполнить на asm что бы калькулятор открылся.

открыть калькулятор через ассемблер, это собеседование или курсовик.
Если курсовик, то его знают сокурсники. Если собеседование, то нафига работа в которой не понимаешь .....
Сорри если что не так.
...
Рейтинг: 0 / 0
04.10.2019, 13:02
    #39871624
ziv-2014
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+asm
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
04.10.2019, 13:05
    #39871625
Delphi_Watcher
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi+asm
ziv-2014Delphi_Watcherпропущено...


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

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

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

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

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


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

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

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

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

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


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