读书人

为啥查找PE的特征代码失败

发布时间: 2013-08-01 15:23:18 作者: rapoo

为什么查找PE的特征代码失败?

unit Unit1;

interface

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

type
TForm1 = class(TForm)
btn1: TButton;
lbl1: TLabel;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
function HexToString(S: ansistring): ansistring;
var
i: integer;
Begin
Result := '';
for i := 1 to Length(S) do
begin
if ((i mod 2)=1) then
begin
Result:=Result + ansistring(Chr(StrToInt('0x' + Copy(S, i, 2))));

end;
end;
end;
function HexScan(t:tstream; s:ansistring):integer;
var
i,j: integer;
p: pansichar;
begin
Result:=-1;
getmem(p, t.size); // ---- 分配内存
t.readbuffer(p^, t.size );// ---- 读
for i:=0 to t.size -1 do
begin
for j:=1 to length(s) do
begin
if p[i+j]<>s[j] then // ---- 有一个不同即退出
begin
break;
end;
end;
if j>length(s) then // ---- 依据
begin
Result:=i+1;
break;
end;
end;
freemem(p);
t.seek(0, soBeginning); // ---- 返回文件头
end;



procedure TForm1.btn1Click(Sender: TObject);
var
MyFile: TFileStream;
Code: ansistring;
mm: ansistring;
Addr: Integer;
begin
MyFile:=TFileStream.Create('E:\1.exe', fmShareDenyNone);


Code:='83C40484C07502B30184DB74598D9538F7FFFF5268E8030000';//确定这个exe中有这个特征码
Addr:=HexScan(MyFile, HexToString(Code));
mm:=HexToString(Code);
if Addr<>0 then
begin
form1.lbl1.caption:=IntToStr(Addr);//这里的Addr没有返回地址 返回-1
end;
end;

end.


是在2010下的 ,原先的代码是delphi7下的,可以找到地址没问题
但是2010下无法找到,原先的string都转ansistring了,为什么还是不对呢? 特征码
[解决办法]
for j:=1 to length(s) do
begin
if p[i+j]<>s[j] then
begin
break;
end;
end;
if j>length(s) then//这里j的值是不确定的,除非把上面的for循环换成while

读书人网 >.NET

热点推荐