Другой файл, имеющий sh файла ярлыка при создании ярлыка из 32-битной или 64-битной программы - PullRequest
2 голосов
/ 08 января 2020

Я создаю ярлык ShellLink из 64-разрядной программы:

program ShellLinkShortcutHashTest;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Winapi.Windows,
  JclShell,
  Winapi.ActiveX,
  IdHashMessageDigest,
  System.Classes, System.SysUtils;

const
  ShortcutFile = 'R:\myshortcut.lnk';
  ShortcutTarget = 'C:\Windows\System32\notepad.exe';

function GetHashFromFile(const AFileToHash: string): string;
var
  IdMD5: TIdHashMessageDigest5;
  FS: TFileStream;
begin
  IdMD5 := TIdHashMessageDigest5.Create;
  FS := TFileStream.Create(AFileToHash, fmOpenRead or fmShareDenyWrite);
  try
    Result := IdMD5.HashStreamAsHex(FS);
  finally
    FS.Free;
    IdMD5.Free;
  end;
end;

function SaveShortcutShellLink(const AFile: string): string;
var
  SL: JclShell.TShellLink;
  HR: Integer;
begin
  Result := 'error';

  SL.Target := ShortcutTarget;
  SL.Description := 'My description';
  HR := JclShell.ShellLinkCreate(SL, AFile);

  if HR = Winapi.Windows.S_OK then
    Result := 'OK - this is the shortcut file hash: ' + GetHashFromFile(AFile)
  else
    Result := 'Error: ' + IntToStr(HR);
end;

begin
  try
    Winapi.ActiveX.OleInitialize(nil);
    try
      Writeln(SaveShortcutShellLink(ShortcutFile));
    finally
      Winapi.ActiveX.OleUninitialize;
    end;
    Readln;
  except
    on E: Exception do
    begin
      Writeln(E.ClassName, ': ', E.Message);
      Readln;
    end;
  end;
end.

Файл MD5 ha sh из файла ярлыка: 4113F96CD9D6D94EB1B93D03B9604FFA.

Затем я строю 32-разрядная версия программы SAME . Но ха sh файла ярлыка, созданного с помощью 32-разрядной программы, отличается: 6512AB03F39307D9F7E3FC129140117A.

Я протестировал MD5 га sh файла ярлыка и с другими внешними инструментами, не связанными с Delphi. Они также подтверждают 64/32-битную разницу.

Означает ли это, что ярлыки являются двоичными, если они были созданы из 64-битной программы или из 32-битной программы? В чем разница? Может ли это быть проблемой безопасности?

1 Ответ

3 голосов
/ 09 января 2020

Вы становитесь жертвой перенаправителя файловой системы WOW64 .

Когда ваше 64-разрядное приложение пытается получить доступ:

C: \ Windows \ System32 \ notepad.exe

все нормально, вы получаете ярлык для приложения 64-битного блокнота в System32. Однако при попытке доступа к тому же пути из 32-разрядного приложения перенаправитель автоматически заменяет путь WOW64 на его место:

C: \ Windows \ SysWOW64 \ notepad. exe

и ваше приложение вместо этого создает ярлык для 32-разрядного приложения блокнота в SysWOW64. Так что они sh по-разному, потому что они являются ярлыками для двух разных программ.

Перенаправитель файловой системы хорошо документирован и понят. Хотя это не исключает наличия некоторых уязвимостей безопасности, сам перенаправитель и его документированное поведение, как правило, не следует рассматривать как угрозу безопасности.

...