作者: Fi7ke
这是修改了PE头后欺骗了PEID的小工具。 也就是说,在通常所说的程序中添加花的命令。 原理非常简单,就是在EXE文件中加PE头,写我们的“花的命令”。 如果你读过景陶的《谈谈中流在Delphi编程中的应用》一文。 我相信这个代码因为基本原理一样所以不知道。 不过,代码有几个数据结构。 虽然平时可能不怎么使用,但是是用于存储PE结构的变量。 请大家参考PE结构的资料。 (其实看名字应该也能猜到十有八九)因为懒得写评论,有问题就直接跟进。
单元单元1;
接口
用户系统
Windows、Messages、SysUtils、Variants、Classes、Graphics、Controls、Forms、
Dialogs、ExtCtrls、StdCtrls;
类型
tform1=class(tform ) )
Label1: TLabel;
Edit1: TEdit;
Button1: TButton;
Bevel1: TBevel;
Button3: TButton;
OpenDialog1: TOpenDialog;
procedure formcreate (发送器:主题;
procedure button1click (发送器:主题;
procedure button3click (发送器:主题;
产品启动;
私密的
{私有描述}
FImageBase: DWORD;
公共的
{公共描述}
结束;
THEAD=array[0.63] of byte;
var
Form1: TForm1;
常数
MYSECTION='Fi7ke '; //添加的节名称,自定义
JMP关闭=43; //花指令的机器码,由Ollydbg加载后自行取用
OEPCODE: THEAD=($55,$8B,$EC,$6A,$FF,$68,$2A,$0A,$00,$68,$38
$90,$0D,$00,$64,$A1,$00,$00,$00,$50,$64,$89,
$25,$00,$00,$00,$00,$58,$64,$A3,$00,$00,$00,$00,$00,
$58,$58,$58,$58,$8B,$E8,$B8,$00,$10,$40,$00,$FF
$E0、$90、$00、$00、$00、$00、$00、$00、$00、$00、$00、$00、$00、$00、$00、$00
$00,$00,$00,$00;
procedureaddsection (fname :字符串;
实施
{$R *.dfm}
procedureaddsection (fname :字符串;
var
DOSHEADER: IMAGE_DOS_HEADER;
PEHEADER: IMAGE_NT_HEADERS;
section header : image _ section _ header;
mysectionheader : image _ section _ header;
fs: TFileStream;
AddressOfEntryPoint: DWORD;
比根
f :=tfilestream.create (fname,fmOpenReadWrite
fmShareDenyWrite;
特里
fs.seek(0,soFromBeginning );
fs.read(dosheader,sizeof ) dosheader );
fs.seek(dosheader._lfanew,soFromBeginning );
fs.read(PEheader,sizeof ) PEheader );
fs.seek(sizeof(sectionheader ) *
(PE header.file header.number of sections-1 )、soFromCurrent );
fs.read(sectionheader,sizeof ) image_section_header );
mysection header.name [0] :=ord (' f );
p>MySectionHeader.Name[1] := ord('i');
MySectionHeader.Name[2] := ord('7');
MySectionHeader.Name[3] := ord('k');
MySectionHeader.Name[4] := ord('e');
MySectionHeader.Name[5] := 0;
MySectionHeader.Name[6] := 0;
MySectionHeader.Name[7] := 0;
MySectionHeader.VirtualAddress := PEHEADER.OptionalHeader.SizeOfImage;
MySectionHeader.Misc.VirtualSize := $200;
MySectionHeader.SizeOfRawData := (MySectionHeader.VirtualAddress div
PEHEADER.OptionalHeader.FileAlignment + 1) * PEHEADER.OptionalHeader.FileAlignment -
PEHEADER.OptionalHeader.SizeOfImage;
MySectionHeader.PointerToRawData :=
SectionHeader.SizeOfRawData + SectionHeader.PointerToRawData;
MySectionHeader.Characteristics := $E0000020;
Inc(PEHEADER.FileHeader.NumberOfSections);
fs.Write(MySectionHeader, sizeOf(MySectionHeader));
fs.Seek(DOSHEADER._lfanew, soFromBeginning);
AddressOfEntryPoint := PEHEADER.OptionalHeader.AddressOfEntryPoint;
PEHEADER.OptionalHeader.AddressOfEntryPoint :=
MySectionHeader.VirtualAddress;
PEHEADER.OptionalHeader.MajorLinkerVersion := 7;
PEHEADER.OptionalHeader.MinorLinkerVersion := 0;
AddressOfEntryPoint := AddressOfEntryPoint +
PEHEADER.OptionalHeader.ImageBase;
asm //这里说明一下,这是嵌入的汇编代码,寄存器—CPU暂时储存数据的东西,比内存更快,以提高效率
PUSHAD
LEA eax, OEPCODE //将OEPCODE的地址交给寄存器
ADD eax, JMPOFF 添加JMPOFF值给寄存器
MOV edx, AddressOfEntryPoint //转移指令,相当于付值语句,左边给右边
MOV DWORD ptr [eax], edx //同上
POPAD
end;
PEHEADER.OptionalHeader.SizeOfImage :=
PEHEADER.OptionalHeader.SizeOfImage + MySectionHeader.Misc.VirtualSize;
fs.Write(PEHEADER, sizeof(PEHEADER));
fs.Seek(fs.Size, soFromBeginning);
fs.Write(OEPCODE, MySectionHeader.Misc.VirtualSize)
finally
fs.Free;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Edit1.Clear;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Edit1.Text := OpenDialog1.FileName;
end;
procedure TForm1.obtain;
var
DOSHEADER: IMAGE_DOS_HEADER;
PEHEADER: IMAGE_NT_HEADERS;
fs: TFileStream;
begin
fs := TFileStream.Create(Edit1.Text, fmOpenReadWrite +
fmShareDenyWrite);
try
fs.Seek(0, soFromBeginning);
fs.Read(DOSHEADER, sizeof(DOSHEADER));
fs.Seek(DOSHEADER._lfanew, soFromBeginning);
fs.Read(PEHEADER, sizeOf(PEHEADER));
FImageBase := PEHEADER.OptionalHeader.ImageBase;
finally
fs.Free;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if trim(Edit1.Text) = '' then
begin
Messagebox(Handle, '请选择你要伪装的程序!', '提示', MB_OK + MB_ICONSTOP);
Exit;
end;
AddSection(Edit1.Text);
Messagebox(Handle, '伪装成功!', '提示', MB_OK + MB_ICONINFORMATION);
end;
end.