function hextoint(s: string): Integer; begin //$代表16进制 Result:=StrToInt('$'+s); end;
function Stream_SearchString( // 在流中搜索字符串 mStream: TStream; // 目标流 mStr: string; // 字符串 mStartAddress: Integer = 0; // 起始地址 mEndAddress: Integer = MaxInt; // 终止地址 mIgnoreCase: Boolean = False // 是否忽略大小写 ): Integer; // 返回字符串所在的位置 const cBufferSize = $1000; var S: string; T: string; I: Integer; J: Integer; L: Integer; begin Result := -1; if not Assigned(mStream) then Exit; if mStr = '' then Exit; L := Length(mStr); mStream.Position := mStartAddress; if mIgnoreCase then mStr := UpperCase(mStr); T := ''; J := mStartAddress; while mStream.Position <= mEndAddress do begin SetLength(S, cBufferSize); I := mStream.Read(S[1], cBufferSize); SetLength(S, I); if S = '' then Exit; if mIgnoreCase then S := UpperCase(S); Result := Pos(mStr, T + S) - 1; if Result >= 0 then begin Result := Result + J - Length(T); Exit; end; T := Copy(S, cBufferSize - L, MaxInt); Inc(J, I); end; end; { Stream_SearchString }
function File_SearchString( // 在文件中搜索字符串 mFileName: string; // 文件名 mStr: string; // 字符串 mStartAddress: Integer = 0; // 起始地址 mEndAddress: Integer = MaxInt; // 终止地址 mIgnoreCase: Boolean =true // 是否忽略大小写 ): Integer; // 返回字符串所在的位置 var vFileStream: TFileStream; vFileHandle: THandle; begin Result := -1; if not FileExists(mFileName) then Exit; vFileHandle := _lopen(PChar(mFileName), OF_READ or OF_SHARE_DENY_NONE); //06-09-25 No.1 ZswangY37 if Integer(vFileHandle) <= 0 then Exit; vFileStream := TFileStream.Create(vFileHandle); try Result := Stream_SearchString(vFileStream, mStr, mStartAddress, mEndAddress, mIgnoreCase); finally vFileStream.Free; end; end; { File_SearchString }
Procedure XorData(vFileName:string; vStart, vEnd: Integer); //===数据加密 var vMemoryStream: TMemoryStream; vBuffer: string; I: Integer; begin if not FileExists(vFileName) then begin application.MessageBox('指定的来原文件不存在!','提示',MB_ok+MB_Iconinformation); Exit; end; SetLength(vBuffer, vEnd - vStart + 1); vMemoryStream := TMemoryStream.Create; try vMemoryStream.LoadFromFile(vFileName); vMemoryStream.Seek(vStart, soFromBeginning); vMemoryStream.Read(vBuffer[1], Length(vBuffer)); for I := 1 to Length(vBuffer) do vBuffer[i] := Chr(Ord(vBuffer[i]) xor $51DE003A); vMemoryStream.Seek(vStart, soFromBeginning); vMemoryStream.Write(vBuffer[1], Length(vBuffer)); vMemoryStream.SaveToFile(vFileName); finally vMemoryStream.Free; showmessage('处理成功!'); end; end;
procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog.Execute then Edit1.Text:=OpenDialog.FileName; end;
procedure TForm1.Button3Click(Sender: TObject); //自动定位,地址可能有所偏差 begin Edit2.Text:= IntToHex(File_SearchString(Edit1.text,'xor_begin')-212,8); Edit3.Text:= IntToHex(File_SearchString(Edit1.text,'xor_end')-117,8); end;
procedure TForm1.Button2Click(Sender: TObject); var i1,i2:integer; begin i1:=hextoint(Edit2.Text); i2:=hextoint(Edit3.Text); XorData(Edit1.Text,i1,i2); //Xor end;
{$R *.dfm} //随便写一个算法演示 当然也可以把标位放在这函数里 function StrToASCII16(s: string): string; //字符串转换ascii码16进制, var i:integer; // 如:东方蜘蛛=$B6,$AB,$B7,$BD,$D6,$A9,$D6,$EB begin for i:=1 to length(s) do begin result := result+ '$'+ IntToHex(ord(s[i]),2)+','; end; Result:=copy(Result,0,Length(result)-1); end;
procedure TForm1.Button1Click(Sender: TObject); var x1,x2:string; begin try x1:='xor_begin'; //标位 if (Edit2.Text=StrToASCII16(Edit1.Text)) and (Length(edit2.Text)>0) then //明码 begin showmessage('注册成功了,呵呵!'); end; x2:='xor_end'; //标位 except end; end;