{*****************************************************************
AddShell()源自于前一段时间有写的addsection()新增区段代码,
在增加区段代码的基础上,追加了
1.修改启动入口点位置
2.增加一段壳头xor $50的代码function AttachStart-function AttachEnd
这一段代码是先填充,再被修改成合适原EXE的壳头
3.修改原启动代码入口点所在区段的段属性可写并进行xor $50运算加密
不支持addshell()处理已经过addshell的exe
*****************************************************************}
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1 : TForm1;
implementation
{$R *.dfm}
function AttachStart: dword; stdcall; //我们定义的待填充数据
asm
pushfd
pushad
mov eax,$12345678 //将会被自动计算并修改为加密初始地址
mov ebx,$1234 //将会被自动计算并修改为加密大小
mov ecx,0
@AA:
xor byte ptr[eax],$50
inc eax
inc ecx
cmp ecx,ebx
jbe @aa
popad
popfd
push $12345678 //将会被自动计算并修改为原OEP
ret
end;
function AttachEnd: dword; stdcall;
begin
end;
{-------------------------增加区块并实现简易加壳--------------------------------}
procedure AddShell(lFileName: string; lBackup: boolean); //打开exe文件,是否备份
var
hFile : THandle; //文件句柄
ImageDosHeader : IMAGE_DOS_HEADER; //DOS部首
ImageNtHeaders : IMAGE_NT_HEADERS; //映象头
ImageSectionHeader: IMAGE_SECTION_HEADER; //块表
lPointerToRawData : dword; //指向文件中的偏移
lVirtualAddress : dword; //指向内存中的偏移
i : integer; //循环变量
BytesRead, ByteSWrite: Cardinal;