2

如果您使用 PEiD(或类似应用程序),那么您知道应用程序可以告诉我们,打开的可执行文件使用什么编译器编译或使用什么打包器打包。PEiD 使用将可执行签名与UserDB.

我想为(例如)一个新的编译器/打包器创建一个新签名。我该怎么做?

我编写了一个从可执行文件中提取编译器/加壳器签名的例程,现在我想获得一个新签名,我应该从一些可执行文件(在本例中为 5)中检索编译器/加壳器签名并将其比较并创建新签名,例如,如果以下字符串是 5 个文件的编译器/打包程序签名:

'E4 55 33 22 00 FF E4 55 33 22 00 11 FF E2 22 00 E0' 
'E4 55 32 22 01 FF E4 55 32 22 01 11 FF E2 21 00 E0' 
'E4 55 42 22 00 FF E2 55 42 22 00 11 FE E2 22 10 E0' 
'E4 55 35 22 01 FF E4 55 35 22 01 11 FF E2 22 00 E0' 
'E4 55 25 22 01 FF E4 55 35 22 01 11 FF E2 22 00 E0' 

我必须得到这个字符串的结果:

'E4 55 ?? 22 ?? FF ?? 55 ?? 22 ?? 11 ?? E2 ?? ?? E0'

这意味着:如果一个值(例如'E4')在所有其他签名中都很常见,那么这将添加到结果中否则替换为'??'(我希望你能理解我的意思)

我编写了以下代码,但无法正常工作并返回:

 'E4 55 ?? 22 ?? FF E4 55 ?? 22 ?? 11 FF E2 ?? 00 E0'

代替 :

'E4 55 ?? 22 ?? FF ?? 55 ?? 22 ?? 11 ?? E2 ?? ?? E0'

代码 :

...
uses System.StrUtils, System.Types;
...
var
  InputSignatures: TStringList;
  I, J: Integer;
  CompleteTxt: string;
  Con: array of TStringDynArray;
begin
  InputSignatures := TStringList.Create;

    InputSignatures.Add('E4 55 33 22 00 FF E4 55 33 22 00 11 FF E2 22 00 E0');
    InputSignatures.Add('E4 55 32 22 01 FF E4 55 32 22 01 11 FF E2 21 00 E0');
    InputSignatures.Add('E4 55 42 22 00 FF E2 55 42 22 00 11 FE E2 22 10 E0');
    InputSignatures.Add('E4 55 35 22 01 FF E4 55 35 22 01 11 FF E2 22 00 E0');
    InputSignatures.Add('E4 55 25 22 01 FF E4 55 35 22 01 11 FF E2 22 00 E0');
    // E4 55 ?? 22 ?? FF ?? 55 ?? 22 ?? 11 ?? E2 ?? ?? E0
    SetLength(Con, InputSignatures.Count);

    for I := 0 to InputSignatures.Count - 1 do
    begin
      Con[I] := SplitString(InputSignatures[I], ' ');
    end;

    J := 0;
    for I := 0 to Length(Con[J]) - 1 do
    begin
      for J := Low(Con) to High(Con) - 1 do
      begin
        if Con[J][I] <> Con[J + 1][I] then
        begin
          CompleteTxt := CompleteTxt + '?? ';
          Break;
        end
        else
        begin
          CompleteTxt := CompleteTxt + Con[J][I] + ' ';
          Break;
        end;
      end;
    end;
    ShowMessage(CompleteTxt);
 end;
...

任何的想法 ??(对不起,如果我的英语不好)。

4

1 回答 1

3

我出于相同目的编写此代码,请尝试此方法:

procedure TForm1.Button1Click(Sender: TObject);
var
  InputSignatures: TStringList;
  item, output: TStringList;
  i, j: integer;
  ret: string;
begin
  InputSignatures := TStringList.Create;

  InputSignatures.Add('E4 55 33 22 00 FF E4 55 33 22 00 11 FF E2 22 00 E0');
  InputSignatures.Add('E4 55 32 22 01 FF E4 55 32 22 01 11 FF E2 21 00 E0');
  InputSignatures.Add('E4 55 42 22 00 FF E2 55 42 22 00 11 FE E2 22 10 E0');
  InputSignatures.Add('E4 55 35 22 01 FF E4 55 35 22 01 11 FF E2 22 00 E0');
  InputSignatures.Add('E4 55 25 22 01 FF E4 55 35 22 01 11 FF E2 22 00 E0');
    // E4 55 ?? 22 ?? FF ?? 55 ?? 22 ?? 11 ?? E2 ?? ?? E0

  output := TStringList.Create;
  item := TStringList.Create;
  output.Text := StringReplace(InputSignatures[0], ' ', #13#10, [rfReplaceAll]);

  for i := 1 to InputSignatures.Count -1 do
    begin
    item.Text := StringReplace(InputSignatures[i], ' ', #13#10, [rfReplaceAll]);

    for j := 0 to item.Count -1 do
      if item[j] <> output[j] then
        output[j] := '??';
    end;

  ret := StringReplace(output.Text, #13#10, ' ', [rfReplaceAll]);

  output.Free;
  item.Free;
  InputSignatures.Free;

  ShowMessage(ret);
end;
于 2013-11-11T20:59:51.950 回答