- 人气:
- 放大
- 缩小
- 二维码
- 赞赏
delphi 给程序添加“伪”数字签名代码的优化
最近看了某位仁兄的给程序添加数字签名的delphi代码,其中里面的文件流的使用让人感觉很高深,其实还有一种更加简单的方法,下面是我修改后的代码:
- function AddDigiSignFromFile(const FormFile, ToFile: string): Boolean;
- var
- vFileSZQMDZ: Integer;
- vSZQMDZ: Integer;
- vBufSize: Integer;
- vFS: TFileStream;
- vBufAttr: array of Byte;
- vSize: Integer;
- begin
- Result := False;
- if not FileExists(ToFile) then
- Exit;
- try
- vFS := TFileStream.Create(FormFile, fmOpenRead);
- try
- vFS.Position:= $3C;
- vFS.ReadBuffer(vFileSZQMDZ, SizeOf(vFileSZQMDZ));
- Inc(vFileSZQMDZ, $98) ;
- vFS.Position:= vFileSZQMDZ;
- vFS.ReadBuffer(vSZQMDZ, SizeOf(vSZQMDZ));
- vFS.ReadBuffer(vBufSize, SizeOf(vBufSize));
- vFS.Position:= vSZQMDZ;
- SetLength(vBufAttr, vBufSize);
- vFS.ReadBuffer(vBufAttr[0], vBufSize);
- finally
- vFS.Free;
- end;
- vFS := TFileStream.Create(ToFile, fmOpenReadWrite);
- try
- vFS.Position:= $3C;
- vFS.ReadBuffer(vFileSZQMDZ, SizeOf(vFileSZQMDZ));
- Inc(vFileSZQMDZ, $98) ;
- vFS.Position:= vFileSZQMDZ;
- vSize := vFS.Size;
- vFS.WriteBuffer(vSize, SizeOf(vSize));
- vFS.WriteBuffer(vBufSize, SizeOf(vBufSize));
- vFS.Position:= vFS.Size;
- vFS.WriteBuffer(vBufAttr[0], vBufSize);
- finally
- vFS.Free;
- end;
- Result := True;
- except
- end;
- end;
原来的代码如下:
view plaincopy to clipboardprint?
- function ReadHexDZ(fvFileName:string; fvHexDZ:Integer):Integer;
- var
- vBuffer : array [0..3] of byte;
- vInt : integer;
- vFS : TFileStream;
- vStr : string;
- begin
- Result := -1 ;
- vStr:= '';
- try
- vFS:= TFileStream.Create(fvFileName, fmOpenRead);
- vFS.Position:= fvHexDZ;
- vFS.ReadBuffer(vBuffer, SizeOf(vBuffer));
- for vInt:=0 to 3 do
- vStr:=IntToHex(vBuffer[vInt], 2) + vStr;
- Result:= StrToInt('$'+vStr) ;
- except
- Result := -1
- END;
- vFS.Free;
- end;
- procedure TForm1.Button4Click(Sender: TObject);
- var
- vFile1, vFile2: string;
- vBuf1,vBuf2: array [0..3] of Byte;
- vFS: TFileStream;
- vBufAttr: array [0..100000] of PAnsiChar ;
- vFile2SZQMDZ,
- vFile1SZQMDZ,
- vFile1SZQMSizeDZ,
- vSZQMDZ,
- vBufSize:integer;
- vStr, vNewStr, vNewStr2:string;
- vInt: Integer;
- begin
- vFile1:= Trim(EFile1.Text);
- vFile2 := Trim(EFile2.Text);
- if not FileExists(vFile1) or not FileExists(vFile2) then
- begin
- ShowMessBox('消息', '找不到文件!');
- Exit;
- end;
- if CBbakFile.Checked then
- CopyFile(PAnsiChar(vFile2), PAnsiChar(ExtractFileName(vFile2)+'.bak'), False);
- vFile1SZQMDZ:= ReadHexDZ(vFile1, $3C) + $98 ;
- vFile1SZQMSizeDZ := vFile1SZQMDZ +$4;
- vSZQMDZ:= ReadHexDZ(vFile1, vFile1SZQMDZ);
- vBufSize := ReadHexDZ(vFile1, vFile1SZQMSizeDZ) ;
- try
- vFS := TFileStream.Create(vFile1, fmOpenRead);
- try
- vFS.Position:= vFile1SZQMDZ;
- vFS.ReadBuffer(vBuf1, 4);
- vFS.Position:= vFile1SZQMSizeDZ;
- vFS.ReadBuffer(vBuf2, 4);
- vFS.Position:= vSZQMDZ;
- vFS.ReadBuffer(vBufAttr, vBufSize);
- finally
- vFS.Free;
- end;
- vFile2SZQMDZ := ReadHexDZ(vFile2, $3C) + $98;
- vFS := TFileStream.Create(vFile2, fmOpenReadWrite);
- try
- vFS.Position:= vFile2SZQMDZ;
- vStr:= IntToHex(vFS.Size, 8);
- vNewStr:= Copy(vStr, 7, 2) ;
- vNewStr:= vNewStr + Copy(vStr, 5, 2) ;
- vNewStr:= vNewStr + Copy(vStr, 3, 2) ;
- vNewStr:= vNewStr + Copy(vStr, 1, 2) ;
- vNewStr2:= '';
- for vInt:=1 to (length(vNewStr) div 2) do
- vNewStr2:=vNewStr2+char(strtoint('$'+copy(vNewStr,(vInt-1)*2+1,2)));
- vFS.WriteBuffer(Pointer(vNewStr2)^, 4);
- vFS.Position := vFile2SZQMDZ + $4;
- vFS.WriteBuffer(vbuf2, SizeOf(vBuf2));
- vFS.Position:= vFS.Size;
- vFS.WriteBuffer(vBufAttr, vBufSize);
- finally
- vFS.Free;
- end;
- ShowMessBox('消息','添加数字签名成功');
- except
- ShowMessBox('坏消息','添加数字签名出错');
- end;
- end;
其实那个ReadHexDZ函数没有什么必要,把整型以一个一个字节的形式读出来,然后连接起来又转换为整型,直接以整型的形式去读不就行了?不理解作者的意图-_-!。然后每次用ReadHexDZ都要打开一次文件,效率不高,其实完全可以打开一次文件做完所有的事。这只是我的一点分析,如有不足的地方还请指正。
复制数字签名以后这个程序的“属性”里面就会出现“数字签名”的选项卡,但是这种靠复制其它程序数字签名的方法是有问题的,因为这个不是程序本身的数字签名,所以即使复制了数字签名也会验证失败。Windows也会提示这个数字签名无效。所以这个只能骗过一些不知情的用户,对于有经验的用户这个反而说明了这个程序更加有问题。