Создать экземпляр класса с помощью встроенного ассемблера Delphi

Что я хотел бы сделать, так это, используя сборку, создать экземпляр класса, вызвать один из его методов, а затем освободить i экземпляр.

Я знаю, что упускаю что-то очень важное и, возможно, очень простое, но не знаю что.

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TSomeClass = class(TObject)
  private
    FCreateDateTime: string;
  public
    constructor Create;
    procedure SayYeah;
  end;

constructor TSomeClass.Create;
begin
  FCreateDateTime := DateTimeToStr(Now);
end;

procedure TSomeClass.SayYeah;
begin
  Writeln('yeah @ ' + FCreateDateTime);
end;

procedure Doit;
asm
  CALL TSomeClass.Create; // <= Access Violation
  CALL TSomeClass.SayYeah;
  CALL TSomeClass.Free;
end;

begin
  try
    Doit;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

К вашему сведению: я хочу понять, как я могу добиться этого на низком уровне, а не другим способом.

ОБНОВЛЕНИЕ:

Благодаря Андреасу Рейбранду мне удалось найти виновника:

Обновление 2:

Спасибо Арно за обнаружение уязвимости с использованием EBX, а не PUSH/POP ЭАКС

var
  TSomeClass_TypeInfo: Pointer;

procedure Doit;
asm
  MOV DL, $01;
  MOV EAX, TSomeClass_TypeInfo;
  CALL TSomeClass.Create;
  PUSH EAX;
  CALL TSomeClass.SayYeah; // call method
  POP EAX;
  MOV DL, $01;
  CALL TSomeClass.Free; // pointer to instance(Self) is expected in EAX
end;

begin
  TSomeClass_TypeInfo := TSomeClass;
  try
    Doit;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.
5
задан ComputerSaysNo 17 May 2012 в 12:23
поделиться