如何让程序修改自己?(20分)

  • 主题发起人 主题发起人 snappy
  • 开始时间 开始时间
“我在启用KV3000的时候报告说:XX程序将被修改是否确认?”

上面的现象可不可以这样模拟:a放出b修改a,a被kv3000发现?再运行a
最好拿来跟踪分析一下
 
一个更简单的思路:A运行自己时先备份一下自身到临时文件B,然后带参数运行B,并退出A。
接下来,在B中修改A。B退出时删除B自身即可。:)
 
B能删除自己吗?!他如能删除自己也就能改自己了!别告诉我又要生成什么文件!
 
这个就能做到在运行期删除自身。它是一个DLL,但DLL自已也能删除自已,同时
提供了for delphi的接口和DEMO:
http://members.nbci.com/_XMCM/elicz/export/DelMod.zip
 
snappy:b可以这样运行a a.exe/del_B
方法多多
 
to snappy:
> 经过我的分析,应该是可以做到这一点的,因为我们在杀病毒的时候,当一些系统
>文件感染上病毒后,在WIN系统下就不能杀这些文件了,因为它“正在使用”。可病毒写
>这个文件的时候我想绝不会是等你进入DOS下后才把病毒写进去的吧?!

反病毒软件通常是形成待杀文件列表,然后重启,并在autoexec.bat或者winstart.bat中
启动反病毒软件,通过待杀文件列表列表来杀毒。
安装程序通常是要求重启,并在注册表的run/runserver运行安装程序来替换DLL。
操作系统会通过win.ini中的start项来启动程序来替换server pack中的文件。例如win98。
但winnt/2k可能不是这样用的。:)

随便说一下,我所在的公司就做反病毒软件。:)
 
compile another application to resource, then generate a execute file and start it,
this application modify the first application by update the resource. then start it,
then close self.

some code is below.

in first appliction
procedure TForm1.Button1Click(Sender: TObject);
var
lvi_ResHandle: THandle;
lvi_MemHandle: THandle;
lvp_ResPtr: PByte;
lvi_ResSize: integer;
lvs_ResFile: string;
lvi_ExtStart: integer;
lvo_binfile:file of byte;
FResourceType:string;
FileName:string;
begin
FResourceType:='exefile';
FileName:='test';
lvi_ExtStart := Pos('.', FileName);
if lvi_ExtStart = 0 then
lvi_ExtStart := Length(FileName)
else
dec(lvi_ExtStart);
lvs_ResFile := Copy(FileName, 1, lvi_ExtStart);
lvi_ResHandle := FindResource(hInstance, PChar(lvs_ResFile), PChar(FResourceType));
if lvi_ResHandle = 0 then
Exit;
try

lvi_MemHandle := LoadResource(hInstance, lvi_ResHandle);
lvp_ResPtr := LockResource(lvi_MemHandle);
lvi_ResSize := SizeOfResource(hInstance, lvi_ResHandle);
FreeResource(lvi_MemHandle);
assignfile(lvo_binfile,FileName);
rewrite(lvo_binfile);
blockwrite(lvo_binfile,lvp_ResPtr^,lvi_ResSize);
closefile(lvo_binfile);
finally

end;
end;

in the second one,
procedure TForm1.Button1Click(Sender: TObject);
var
ptr:pointer;
lvo_binfile:file of byte;
lvo_binfile2:file of byte;
reshandle:thandle;
lvi_ExtStart: integer;
lvs_ResFile:string;
lvo_content:tstrings;
FExeFileName:string;
FResourceType:string;
result:boolean;
begin
FExeFileName:='project1.exe';
FResourceType:='inifile';
lvs_ResFile:='profile.ini';
reshandle:=BeginUpdateResource(pchar(FExeFileName),TRUE);
assignfile(lvo_binfile,lvs_ResFile);
reset(lvo_binfile);
getmem(ptr,filesize(lvo_binfile));
blockread(lvo_binfile,ptr^,filesize(lvo_binfile));
UpdateResource(reshandle,pchar(FResourceType),'profile',0,ptr,filesize(lvo_binfile)) ;
showmessage(SysErrorMessage(GetLastError));
EndUpdateResource(reshandle,false);
freemem(ptr);
closefile(lvo_binfile);

end;
 
program Hello;

{$APPTYPE CONSOLE}

uses
Windows,
SysUtils;

var //
szSrc, //
szDest : array[0..MAX_PATH] of char; //
szCmdLine : string;
hFile : THandle;
hProcess : THandle;
SI : TStartupInfo;
PI : TProcessInformation;
nTimes : DWord;
begin
if ParamCount = 0 then
begin
GetModuleFileName(0, szSrc, MAX_PATH);
GetTempPath(MAX_PATH, szDest);
GetTempFileName(szDest, 'Tmp', 0, szDest);
CopyFile(szSrc, szDest, FALSE); // 将当前可执行文件复制一个副本

hFile := CreateFile(szDest, // pointer to name of the file
0, // access (read-write) mode
FILE_SHARE_READ, // share mode
nil, // pointer to security attributes
OPEN_EXISTING, // how to create
FILE_FLAG_DELETE_ON_CLOSE, // file attributes
0); // handle to file with attributes to copy

hProcess := OpenProcess(SYNCHRONIZE, // access flag
TRUE, // handle inheritance flag
GetCurrentProcessId); // process identifier


szCmdLine := Format('%s %d "%s"', [szDest, hProcess, szSrc]); //格式化命令行参数

FillChar(SI, SizeOf(SI), 0);
SI.cb := SizeOf(SI);

CreateProcess(nil, // pointer to name of executable module
PChar(szCmdLine), // pointer to command line string
nil, // pointer to process security attributes
nil, // pointer to thread security attributes
TRUE, // handle inheritance flag
0, // creation flags
nil, // pointer to new environment block
nil, // pointer to current directory name
SI, // pointer to STARTUPINFO
PI); // pointer to PROCESS_INFORMATION

CloseHandle(hProcess);
CloseHandle(hFile);
end
else
begin
hProcess := THANDLE(StrToInt(ParamStr(1)));
WaitForSingleObject(hProcess, INFINITE); //等待主进程结束
CloseHandle(hProcess);

hFile := FileOpen(ParamStr(2), fmOpenReadWrite);
if hFile > 0 then
begin
FileSeek(hFile, $80, 0);
FileRead(hFile, nTimes, SizeOf(nTimes));
Inc(nTimes);
FileSeek(hFile, $80, 0);
FileWrite(hFile, nTimes, SizeOf(nTimes));
FileClose(hFile);
Writeln('我已经运行'+IntToStr(nTimes)+'次了');
end;

end;
end.
 
真有这么回事吗?
如果这是真的能够实现,那我得一个软件创意就完全可以变成现实了
如下: 文档加密保存软件!
利用硬盘剩余空间,从磁盘尾部写用户数据,并且对文件的各个属性作标记,然后,把一些信息写入自己
此过程不影响文件分配表,需要时用该软件读取数据,软件启动时需要密码,一次错误就把自己初始化!
这样谁也不知道你硬盘上存了些什么!
谁能编出来,我给500分!!
编出来了,给我发信 ruozhino1@21cn.com
 
TO foolboy007:
你的想法我在DOS下就考虑过了, 存在一个没有解决的问题: 有一些软件会临时占用未
分配的磁盘空间, 如磁盘整理软件. 这样一来, 你保存的数据就被破坏了.
 
应该是通过创建一个文件副本(TMP)来实现的!
 
多人接受答案了。
 
后退
顶部