从 32 位或 64 位程序创建快捷方式时,快捷方式文件的不同文件哈希

Different file hash of shortcut file when shortcut created from 32-bit or 64-bit program

我从 64 位程序创建了一个 ShellLink 快捷方式:

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 文件哈希为:4113F96CD9D6D94EB1B93D03B9604FFA

然后我构建了一个 32 位版本的 SAME 程序。但是用 32 位程序创建的快捷方式文件的哈希值不同:6512AB03F39307D9F7E3FC129140117A.

我还使用与 Delphi 无关的其他外部工具测试了快捷方式文件的 MD5 哈希值。他们还确认了 64/32 位的差异。

这是否意味着快捷方式是二进制不同的,如果它们是从 64 位程序或 32 位程序创建的?有什么不同?这可能是安全问题吗?

您正在成为 WOW64 filesystem redirector 的受害者。

当您的 64 位应用程序尝试访问时:

C:\Windows\System32\notepad.exe

一切正常您在 System32 中获得了 64 位记事本应用程序的快捷方式。但是,当您尝试从 32 位应用程序访问同一路径时,重定向器会自动将 WOW64 路径替换为 :

C:\Windows\SysWOW64\notepad.exe

您的应用程序反而会在 SysWOW64 中创建 32 位记事本应用程序的快捷方式。所以这些散列不同,因为它们是两个不同程序的快捷方式。

文件系统重定向器有很好的文档记录和理解。虽然这并不排除它存在一些安全漏洞,但重定向器本身及其记录的行为通常不应被视为安全风险。