【发布时间】: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