首页
社区
课程
招聘
[求助]如何利用crc32判断文件是否被改动?
发表于: 2005-9-10 08:18 6608

[求助]如何利用crc32判断文件是否被改动?

2005-9-10 08:18
6608
以下代码好像不能用在文件自效检上,如何利用crc32进行文件自效检的判断,那位给点意见?
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit2;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  MakeTable();
  Edit1.Text := GetCrc32Str('11111111', 8); //这里取指定字符串的CRC32校验值;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  FileStr: string;
  crc: DWORD;
begin
  MakeTable();
  FileStr := Application.ExeName; //这里取指定的文件的crc32校验值;
  GetCRC32File(FileStr, crc);
  if crc <> 0 then
    Edit2.Text := PChar(IntToHex(crc, 6));
end;
end.

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个好像是turbo pascal
2005-9-19 13:01
0
雪    币: 201
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
是Delphi
2005-9-19 14:20
0
雪    币: 201
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
可不可以把GetCrc32Str
和GetCRC32File
贴出来
CRC32,如果要对文件所有字节进行校验的话,就要把CRC32值存放在别的文件中,如果是对文件的局部代码和数据进行校验,可以把CRC32值放在不是校验的部份
2005-9-19 14:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
delphi用的就是pascal。delphi只是个工具,而不是语言。

我看那语法和我大学时用的turbo pascal 6一模一样。

你看那unit关键字、interface关键字、uses关键字、程序结构、语法等等,一模一样。
2005-9-19 16:45
0
雪    币: 217
活跃值: (91)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
最初由 酷酷 发布
可不可以把GetCrc32Str
和GetCRC32File
贴出来
CRC32,如果要对文件所有字节进行校验的话,就要把CRC32值存放在别的文件中,如果是对文件的局部代码和数据进行校验,可以把CRC32值放在不是校验的部份

具体说明一下如何使用把CRC32值存放在别的文件中和把CRC32值放在不是校验的部份。
procedure GetCRC32File(FileName: string; var CRC32: DWORD);
    var
      F: file;
      BytesRead: DWORD;
      Buffer: array[1..65521] of Byte;
      i: Word;
    begin
      FileMode := 0;
      CRC32 := $FFFFFFFF;
  {$I-}
      AssignFile(F, FileName);
      Reset(F, 1);
      if IoResult = 0 then
      begin
        repeat
          BlockRead(F, Buffer, Sizeof(Buffer), BytesRead);
          for i := 1 to BytesRead do
            CRC32 := (CRC32 shr 8) xor Table[Buffer[i] xor (CRC32 and
              $000000FF)];
        until BytesRead = 0;
      end;
      CloseFile(F);
  {$I+}
      CRC32 := not CRC32;
    end;

    function GetCrc32Str(s: string; Seed: LongInt): string;
    var
      Count: Integer;
      CrcVal: LongInt;
    begin
      CrcVal := Seed;
      for Count := 1 to Length(s) do
        CrcVal := Table[Byte(CrcVal xor DWORD(Ord(s[Count])))] xor ((CrcVal shr
          8) and $00FFFFFF);
      Result := IntToHex(not (CrcVal), 8);
    end;
2005-9-22 08:03
0
雪    币: 201
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
1,新建一个文件,把CRC值写到里面去,在校验的时候,再把这个值读出来和目前算出来的值做比较.

2,比如你只对代码段做校验,你可以把CRC值存在PE文件头的空字段中,也可以放在数据段或别的段的空白处
2005-9-22 09:03
0
游客
登录 | 注册 方可回帖
返回
//