delphi 给程序添加“伪”数字签名代码的优化。

转载自品略图书馆 http://www.pinlue.com/article/2020/05/0706/2710353185826.html

 

最近看了某位仁兄的给程序添加数字签名的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); //读取数字签名数据到vbufattr

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 of byte; //没指定长度的话调用函数回出错

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; //得到16进制

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) ;

//ShowMessBox(IntToStr(vFile1SZQMSizeDZ), IntToStr(vBufSize));

// exit;

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); //读取数字签名数据到vbufattr

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也会提示这个数字签名无效。所以这个只能骗过一些不知情的用户,对于有经验的用户这个反而说明了这个程序更加有问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值