【问题标题】:Different file hash of shortcut file when shortcut created from 32-bit or 64-bit program从 32 位或 64 位程序创建快捷方式时,快捷方式文件的文件哈希不同
【发布时间】:2020-01-08 20:59:12
【问题描述】:

我从 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位程序创建的快捷方式文件的hash不一样:6512AB03F39307D9F7E3FC129140117A

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

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

【问题讨论】:

  • "如果快捷方式是从 64 位程序或 32 位程序创建的,这是否意味着它们是二进制不同的?" - 是的,显然,如果你得到不同的哈希值。 “有什么区别?” - 使用十六进制编辑器并自己查看字节差异。如果您想知道不同字节实际代表什么,则必须在某处在线找到快捷方式文件格式规范。 “这可能是一个安全问题吗?” - 没有。
  • @RemyLebeau “是的,很明显,如果你得到不同的哈希值” 你将一般问题误解为特定问题。这是否决我的问题的原因吗?
  • 如果@J... 说的是真的,你每次都会得到一个不同的快捷方式(哈希)。您是否至少为同一个可执行文件创建了两个快捷方式,以检查它们是否相同?
  • @GolezTrol 我收回 - 不是那样的。看我的回答。
  • @user1580348 我没有投反对票

标签: delphi md5 delphi-10.3-rio shortcut-file


【解决方案1】:

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

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

C:\Windows\System32\notepad.exe

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

C:\Windows\SysWOW64\notepad.exe

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2016-07-14
    • 2011-03-03
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    相关资源
    最近更新 更多