数字签名添加器源码

   unit uMain;

  interface

  uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;

  type

  TForm1 = class(TForm)

  Button1: TButton;

  SelFile: TOpenDialog;

  EFile1: TEdit;

  Label1: TLabel;

  Label2: TLabel;

  EFile2: TEdit;

  Button2: TButton;

  Button3: TButton;

  Button4: TButton;

  CBbakFile: TCheckBox;

  Label3: TLabel;

  procedure Button1Click(Sender: TObject);

  procedure Button2Click(Sender: TObject);

  procedure Button3Click(Sender: TObject);

  procedure Button4Click(Sender: TObject);

  procedure FormClose(Sender: TObject; var Action: TCloseAction);

  private

  { Private declarations }

  public

  { Public declarations }

  end;

  var

  Form1: TForm1;

  implementation

  {$R *.dfm}

  procedure ShowMessBox(pvCaptiong, pvText: string);

  begin

  MessageBox(Form1.Handle, PAnsiChar(pvText), PAnsiChar(pvCaptiong), 0);

  end;

  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.Button1Click(Sender: TObject);

  begin

  Self.Close;

  end;

  procedure TForm1.Button2Click(Sender: TObject);

  begin

  SelFile.Title := '请选择含有数字签名的文件';

  if not SelFile.Execute then Exit;

  EFile1.Text := Selfile.FileName;

  end;

  procedure TForm1.Button3Click(Sender: TObject);

  begin

  SelFile.Title := '请选择要添加数字签名的文件';

  if not SelFile.Execute then Exit;

  EFile2.Text := Selfile.FileName;

  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;

  procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);

  begin

  Action:= caFree;

  end;

  end.

时间: 2024-11-08 22:12:59

数字签名添加器源码的相关文章

安卓app----小说在线阅读器 源码

问题描述 安卓app----小说在线阅读器 源码 求 安卓app----小说在线阅读器 源码 求 安卓app----小说在线阅读器 源码 求 安卓app----小说在线阅读器 源码 求 安卓app----小说在线阅读器 源码 求 安卓app----小说在线阅读器 源码 解决方案 http://download.csdn.net/detail/qq_27665781/9282161 可以参考下

Android 简单的图片查看器源码实现

本文介绍了Android 简单的图片查看器源码实现,分享给大家,具体如下: public class MainActivity extends Activity { private EditText et_path; private ImageView iv; //创建handler 对象 // private Handler handler = new Handler(){ // // //处理消息 // public void handleMessage(android.os.Message

Java---网络蜘蛛-网页邮箱抓取器~源码

刚刚学完Socket,迫不及待的做了这个网页邮箱抓取~~~ 自己以前做过微商,而且还掏钱买过抓取网络邮箱的软件~现在O(∩_∩)O哈哈~我自己做~当然啦,没有别人做得好~只是功能还是差不多啦~ 给一个带协议的网站~然后深入网页中查找邮箱~ 因为博主知识有限~线程池目前还没有学~导致无法控制线程~~~见谅~ 还有~就是没有设置停止按钮~也是因为没学线程池~水平不够啊~ 只能关闭软件来停止程序~ package cn.hncu.bs; import java.io.BufferedOutputStr

开发一个Linux调试器(五):源码和信号

在上一部分我们学习了关于 DWARF 的信息,以及它如何被用于读取变量和将被执行的机器码与我们的高级语言的源码联系起来.在这一部分,我们将进入实践,实现一些我们调试器后面会使用的 DWARF 原语.我们也会利用这个机会,使我们的调试器可以在命中一个断点时打印出当前的源码上下文. 系列文章索引 随着后面文章的发布,这些链接会逐渐生效. 准备环境 断点 寄存器和内存 Elves 和 dwarves 源码和信号 源码级逐步执行 源码级断点 调用栈展开 读取变量 下一步 设置我们的 DWARF 解析器

android仿新闻阅读器菜单弹出效果实例(附源码DEMO下载)_Android

开发中碰到问题之后实现的,觉得可能有的开发者用的到或则希望独立成一个小功能DEMO,所以就放出来这么一个DEMO. 原本觉得是最后完成后发网站客户端的,可是这样体现不出一个功能一个功能的分析实现效果,而且周期时间长,所以就完成一部分,发一部分,敬请谅解. 下面的菜单弹出效果在很多的新闻阅读器上都有,比如今日头条.360新闻等. 其实这个实现起来很简单,看其效果,其实就是一个PopupWindow,之后设定相应postion的按钮点击属性,之后获取按钮的位置,给它设置动画显示消失就可以出现了. 下

Java集合源码剖析:Hashtable源码剖析

Hashtable简介 Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境中. Hashtable同样实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆. HashTable源码剖析 Hashtable的源码的很多实现都与HashMap差不多,源码如下(加入了比较详细的注释):

Java集合源码剖析:LinkedList源码剖析

LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使用. LinkedList同样是非线程安全的,只在单线程下适合使用. LinkedList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了Cloneable接口,能被克隆. LinkedList源码剖析 LinkedList的源码如下(加入了比较详细的注释): package java.util; publi

ym——android源码大放送(实战开发必备)

文件夹 PATH 列表 卷序列号为 000A-8F50 E:. │  javaapk.com文件列表生成工具.bat │  使用说明.txt │  免费下载更多源码.url │  目录列表.txt │   ├─android web应用 │      jqmDemo_static.zip │      jqmMobileDemo-master.zip │      jqmMobileDemo1_1-master.zip │      Location1014.rar │ ├─anko │    

查看和调试Qt源码

简述 在调试程序的时候,有时需要调试进入 Qt 源码,这不仅有利于我们了解内部实现机制,而且对于解决一些隐蔽性问题很有帮助. 都知道 F11 是"单步进入",可是在调试的过程中,按下 F11 却无法进入.有人说需要静态编译 Qt 才可以,其实不然,只需要简单的几个配置就可以搞定. 简述 Qt 版本及安装 配置 Qt Creator 源码调试 更多参考 版权所有:一去丶二三里,转载请注明出处:http://blog.csdn.net/liang19890820 Qt 版本及安装 Qt 针