Где я могу найти информацию о структуре Delphi VMT?

Я не знаю, почему вы делаете это с PHP вместо того, чтобы делать все, что вам нужно в вашем приложении C #, но вы можете сделать это, запустив скрытый процесс вызова командной строки, например:

var startInfo = new System.Diagnostics.ProcessStartInfo
{
    WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden,
    FileName = "cmd.exe",
    Arguments = "/C php <yourscript>"
};
var process = new System.Diagnostics.Process
{
    StartInfo = startInfo
};
process.Start();
[113 ] и затем читаем вывод:

var output = process.StandardOutput.ReadToEnd();
12
задан Mason Wheeler 17 April 2009 в 13:53
поделиться

5 ответов

Какую структуру VMT вы хотите знать? Вы также знаете, что это внутренняя деталь реализации, которая может быть изменена (и изменилась с течением времени).

Чтобы ответить на ваш конкретный вопрос, вот простой способ узнать количество виртуальных методов для данного класса:

function GetVirtualMethodCount(AClass: TClass): Integer;
begin
  Result := (PInteger(Integer(AClass) + vmtClassName)^ - 
    (Integer(AClass) + vmtParent) - SizeOf(Pointer)) div SizeOf(Pointer);
end;

Это работает, потому что я знаю, что строка, представляющая имя класса, помещается сразу после всех виртуальных векторы методов в VMT.

Я также знаю, что есть 11 виртуальных методов (для D2009, 9 для D2007 и ранее) на всех объектах TO, которые отрицательно смещены от самого указателя VMT.

Вот причина ссылки на vmtParent.

Наконец, используя ссылку на класс TClass, вы можете передать любой производный класс TObject в эту функцию и получить количество виртуальных методов.

13
ответ дан 2 December 2019 в 05:55
поделиться

Я был почти уверен, что у Халварда было что-то на ВМТ. Конечно же, у него есть Хак № 8: явные вызовы VMT , в которых упоминается Рэй Лишнер Секреты Delphi 2 и Delphi в двух словах .

Вот его Взломанная версия VMT

type
  PClass = ^TClass;
  PSafeCallException = function  (Self: TObject; ExceptObject:
    TObject; ExceptAddr: Pointer): HResult;
  PAfterConstruction = procedure (Self: TObject);
  PBeforeDestruction = procedure (Self: TObject);
  PDispatch          = procedure (Self: TObject; var Message);
  PDefaultHandler    = procedure (Self: TObject; var Message);
  PNewInstance       = function  (Self: TClass) : TObject;
  PFreeInstance      = procedure (Self: TObject);
  PDestroy           = procedure (Self: TObject; OuterMost: ShortInt);
  PVmt = ^TVmt;
  TVmt = packed record
    SelfPtr           : TClass;
    IntfTable         : Pointer;
    AutoTable         : Pointer;
    InitTable         : Pointer;
    TypeInfo          : Pointer;
    FieldTable        : Pointer;
    MethodTable       : Pointer;
    DynamicTable      : Pointer;
    ClassName         : PShortString;
    InstanceSize      : PLongint;
    Parent            : PClass;
    SafeCallException : PSafeCallException;
    AfterConstruction : PAfterConstruction;
    BeforeDestruction : PBeforeDestruction;
    Dispatch          : PDispatch;
    DefaultHandler    : PDefaultHandler;
    NewInstance       : PNewInstance;
    FreeInstance      : PFreeInstance;
    Destroy           : PDestroy;
   {UserDefinedVirtuals: array[0..999] of procedure;}
  end;

Вам нужно будет прочитать его статью, чтобы узнать больше о взломе.

9
ответ дан 2 December 2019 в 05:55
поделиться

Поиск в Google :-P для "delphi vmt" дает this . Может быть, это даст вам начало.

2
ответ дан 2 December 2019 в 05:55
поделиться

Я помню, что была какая-то информация о delphi vmt в книге «delphi in a кратко». Вы можете начать с delphi в двух словах, глава 2 или , это

0
ответ дан 2 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: