2

PEiD (または同様のアプリ) を使用している場合、アプリは開いた実行可能ファイルがどのコンパイラーでコンパイルされたか、またはどのパッカーでパックされたかを伝えることができることを知っています。PEiD は、実行可能な署名を .xml 内のすべての署名と比較して、この作業を行います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' 

result には次の文字列を取得する必要があります。

'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