Возможно ли использование 64-разрядного кода Delphi для AV-стиля VCL во время выполнения?
Кажется, что не может быть пользовательского решения без исправления Delphi Tokyo, но, кажется, стоит спросить.
Самый простой способ сделать это AV воспроизводимым.
- Начать новый проект VCL.
- Измените Платформу на 64-битную.
- Связь с пакетами времени выполнения.
- Установите стиль на "Amakrits".
- Добавьте Флаг Высокой Энтропии ASLR. Примечание. Это выявляет множество ошибок в Win64.
Мой файл Dpr выглядит следующим образом (в основном блоке нет кода).
program MaskedCrash2;
{$SETPEOPTFLAGS $160} //High Entropy ASLR Flag causes issues with incorrect 64-bit programs.
uses
Vcl.Forms,
MaskedCrashed2MainUnt in 'MaskedCrashed2MainUnt.pas' {Form3},
Vcl.Themes,
Vcl.Styles;
{$R *.res}
begin
Application.Initialize;
Application.MainFormOnTaskbar := True;
TStyleManager.TrySetStyle('Amakrits');
Application.CreateForm(TForm3, Form3);
Application.Run;
end.
AV появляется в Delphi Tokyo в StyleUtils.inc в procedure TseBitmapLink.CheckingMasked(const Margin: TRect);
,
Несмотря на предупреждение, которое я недавно обнаружил в верхней части StyleUtils.inc:
//TODO -oUnassigned -cImplement : x64 : Implement PlatformNotImplemented in this unit or disable for x64.
Эта часть кода была очень стабильной в Delphi Berlin. Диалоги - другое дело, поскольку посты здесь показывают. Я отправил оскорбительный код на Портал качества.
Примечание. Чтобы получить ASLR с высокой энтропией (как показано в Process Explorer), необходимо использовать пакеты времени выполнения и установить бит High Entropy (20 долларов), а также 40 долларов за DEP и 100 долларов за ASLR.
Помимо повышения безопасности программы, использование High Entropy ASLR определенно способствует поиску ошибок в сообщениях Windows (например, использование приведения целых чисел в SendMessage
, так далее.). При использовании High Entropy ASLR обнаружил много ошибок в моем коде при переключении на 64-битную маску.
Перекомпиляция пакетов времени выполнения не представляется вероятной, и было правильно предложено использовать ловушку времени выполнения.
Однако метод procedure TseBitmapLink.CheckingMasked(const Margin: TRect);
входит в раздел реализации:
implementation
uses
System.Types, System.UITypes, System.SysUtils, Winapi.UxTheme, Vcl.StdCtrls, Vcl.ComCtrls,
Vcl.Mask, Vcl.GraphUtil, Vcl.ImgList, Vcl.Menus, Vcl.Grids, Vcl.CategoryButtons,
Vcl.ButtonGroup, Vcl.ExtCtrls, Vcl.Consts, Vcl.SysStyles;
{$I StyleUtils.inc}
{$I StyleAPI.inc}
Так есть ли способ использовать хук времени выполнения в качестве TseBitmapLink
недоступно для конечных пользователей, которые используют пакеты времени выполнения?
Это правильно?
У кого-нибудь есть предложения по сохранению High Entropy ASLR и Delphi Tokyo?
Извините, это заняло так много времени, пытаясь завершить.