从 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 位记事本应用程序的快捷方式。所以这些散列不同,因为它们是两个不同程序的快捷方式。
文件系统重定向器有很好的文档记录和理解。虽然这并不排除它存在一些安全漏洞,但重定向器本身及其记录的行为通常不应被视为安全风险。
我从 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 位记事本应用程序的快捷方式。所以这些散列不同,因为它们是两个不同程序的快捷方式。
文件系统重定向器有很好的文档记录和理解。虽然这并不排除它存在一些安全漏洞,但重定向器本身及其记录的行为通常不应被视为安全风险。