如果您使用 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;
...
任何的想法 ??(对不起,如果我的英语不好)。