程序覆盖问题 编写一个程序,要求运行该程序,通过一个事件,从事先设定好的某处拷贝一个同名文件覆盖自己,覆盖后再自动运行该程序。类别进行应用程序更新 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一个a.exe是不可能自己从其他地方拷贝一个文件来覆盖自己的,覆盖工作只能由另一个程序来完成。假设另一个程序是B.exe。那么在a.exe中:Application.Terminate;WinExec(PChar('路径\B.exe', SW_SHOW);接下来B.exe就可以拷贝文件覆盖A.exe了。在A.exe拷贝覆盖完毕后再:WinExec(PChar('路径\A.exe', SW_SHOW);B.exe从何处拷贝文件,复制到何处,这两个信息必须实现由A.exe保存到某个地方(如一个文件或者注册表),然后由B.exe去读取。—————————————————————————————————宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。————————————————————————————————— 建议把更新部份做成exe,其他重要功能做成Dll,动态调用,更新时更新Dll就行了,我们的程序都是这样做的 严黎斌() ( ) :这不是为了干坏事,大型多人使用的项目必须有自动更新能力。这是减少后期维护工作的最重要的保证。做成dll仍然有更新主程序的问题。总是“覆盖自己”是逃避不了的。—————————————————————————————————宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。————————————————————————————————— lxpbuaa(桂枝香在故国晚秋)说的对 lxpbuaa(桂枝香在故国晚秋) 你说的方法我已经用上了,当有新版本的时候,会提示用户更新,同时把主程序关掉,把更新程序运行,进行更新后再把更新程序关了,把主程序运行起来 我有个办法,不知大家的意见,LOOK:http://218.56.11.178:8020/web/technology.aspx-》下载基地-》例程-经典应用-》自杀程序做写小改动,将批处理的内容换一下就OK了。 自己覆盖自己其实并不是没有办法,自己还可以删除自己呢,呵呵。只要思路对了应该不难完成。windows是可以创建线程的,我们如何利用这一点呢,写好一个函数他是负责拷贝的,我们把这个函数放在一个线程里面,然后再发挥一下,把这个线程注入到explorer进程里面关闭应用程序后,他还是在运行的。 小弟用Delphi没多久,只会用来写MIS系统,高级的都不会,有没有哪位大侠能提供一下源码,感激不尽 能不能用自杀的方法,写一个BAT,COPY过来,运行 大家还是来看看高手的作品吧(转贴)下面的代码由Gary Nebbett写就.Gary Nebbett乃是WINDOWS NT/2000 NATIVE API REFERENCE的作者.乃NT系统一等一的高手.下面就分析一些他的这段代码. 这段代码在PROCESS没有结束前就将启动PROCESS的EXE文件删除了. int main(int argc, char *argv[]) { HMODULE module = GetModuleHandle(0); CHAR buf[MAX_PATH]; GetModuleFileName(module, buf, sizeof buf); CloseHandle(HANDLE(4)); __asm { lea eax, buf push 0 push 0 push eax push ExitProcess push module push DeleteFile push UnmapViewOfFile ret } return 0; } 现在,我们先看一下堆栈中的东西 偏移 内容 24 0 20 0 16 offset buf 12 address of ExitProcess 8 module 4 address of DeleteFile 0 address of UnmapViewOfFile 调用RET返回到了UnmapViewOfFile,也就是栈里的偏移0所指的地方.当进入UnmapViewOfF ile的流程时,栈里见到的是返回地址DeleteFile和HMODUL module.也就是说调用完毕后 返回到了DeleteFile的入口地址.当返回到DeleteFile时,看到了ExitProcess的地址,也 就是返回地址.和参数EAX,而EAX则是buffer.buffer存的是EXE的文件名.由GetModuleFil eName(module, buf, sizeof buf)返回得到.执行了DeleteFile后,就返回到了ExitProce ss的函数入口.并且参数为0而返回地址也是0.0是个非法地址.如果返回到地址0则会出错 .而调用ExitProcess则应该不会返回. /* 下面的解释非常重要 */ 这段代码的精妙之处在于: 1.如果有文件的HANDLE打开,文件删除就会失败,所以,CloseHandle(HANDLE(4));是十分 巧妙的一手.HANDLE4是OS的硬编码,对应于EXE的IMAGE.在缺省情况下,OS假定没有任何调 用会关闭IMAGE SECTION的HANDLE,而现在,该HANDLE被关闭了.删除文件就解除了文件对 应的一个句柄. 2.由于UnmapViewOfFile解除了另外一个对应IMAGE的HANDLE,而且解除了IMAGE在内存的 映射.所以,后面的任何代码都不可以引用IMAGE映射地址内的任何代码.否则就OS会报错. 而现在的代码在UnmapViewOfFile后则刚好没有引用到任何IMAGE内的代码. 3.在ExitProcess之前,EXE文件就被删除了.也就是说,进程尚在,而主线程所在的EXE文件 已经没了.(WINNT/9X都保护这些被映射到内存的WIN32 IMAGE不被删除.) 一开始,不明白这段话:当返回到DeleteFile时,看到了ExitProcess的地址 后来想起WinAPI的call convention是__stdcall,特点是参数从右向左入栈, 而且由callee维护stack frame, 感觉是C和Pascal的混血儿,这样就迎刃而解了. 这段代码在C编译器的眼皮底下构造如此巧妙的调用序列 再次崇拜一把Gary Nebbett 自动产生编号的问题 小弟刚学三层时候遇到几个小小问题!!! 各位来看下啊! 帮忙解决一下代码的疑问,谢谢! DELPHI中执行如下的代码后,不能打开EXCEL文件,可能是内存管理的问题,解决???? 我是个新手,请大家帮我解决一下这个问题 我动态创建了 NMSMTP1控件,怎样在OnConnect事件中编写代码?100 关于KsHooks, KsForms,KsControls, KsButton的问题,急等 如何用Base64编码和解码? 用EXCEL打印数据库? 光标位置的问题,请高人指教! ?listview edit?
WinExec(PChar('路径\B.exe', SW_SHOW);接下来B.exe就可以拷贝文件覆盖A.exe了。在A.exe拷贝覆盖完毕后再:
WinExec(PChar('路径\A.exe', SW_SHOW);
B.exe从何处拷贝文件,复制到何处,这两个信息必须实现由A.exe保存到某个地方(如一个文件或者注册表),然后由B.exe去读取。—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
这不是为了干坏事,大型多人使用的项目必须有自动更新能力。这是减少后期维护工作的最重要的保证。做成dll仍然有更新主程序的问题。总是“覆盖自己”是逃避不了的。—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
你说的方法我已经用上了,当有新版本的时候,会提示用户更新,同时把主程序关掉,把更新程序运行,进行更新后再把更新程序关了,把主程序运行起来
只要思路对了应该不难完成。
windows是可以创建线程的,我们如何利用这一点呢,写好一个函数他是负责拷贝的,
我们把这个函数放在一个线程里面,然后再发挥一下,把这个线程注入到explorer进程里面
关闭应用程序后,他还是在运行的。
下面的代码由Gary Nebbett写就.Gary Nebbett乃是WINDOWS NT/2000 NATIVE API
REFERENCE的作者.乃NT系统一等一的高手.下面就分析一些他的这段代码.
这段代码在PROCESS没有结束前就将启动PROCESS的EXE文件删除了.
int main(int argc, char *argv[])
{
HMODULE module = GetModuleHandle(0);
CHAR buf[MAX_PATH];
GetModuleFileName(module, buf, sizeof buf);
CloseHandle(HANDLE(4));
__asm {
lea eax, buf
push 0
push 0
push eax
push ExitProcess
push module
push DeleteFile
push UnmapViewOfFile
ret
}
return 0;
}
现在,我们先看一下堆栈中的东西
偏移 内容
24 0
20 0
16 offset buf
12 address of ExitProcess
8 module
4 address of DeleteFile
0 address of UnmapViewOfFile
调用RET返回到了UnmapViewOfFile,也就是栈里的偏移0所指的地方.当进入UnmapViewOfF
ile的流程时,栈里见到的是返回地址DeleteFile和HMODUL module.也就是说调用完毕后
返回到了DeleteFile的入口地址.当返回到DeleteFile时,看到了ExitProcess的地址,也
就是返回地址.和参数EAX,而EAX则是buffer.buffer存的是EXE的文件名.由GetModuleFil
eName(module, buf, sizeof buf)返回得到.执行了DeleteFile后,就返回到了ExitProce
ss的函数入口.并且参数为0而返回地址也是0.0是个非法地址.如果返回到地址0则会出错
.而调用ExitProcess则应该不会返回.
/* 下面的解释非常重要 */
这段代码的精妙之处在于:
1.如果有文件的HANDLE打开,文件删除就会失败,所以,CloseHandle(HANDLE(4));是十分
巧妙的一手.HANDLE4是OS的硬编码,对应于EXE的IMAGE.在缺省情况下,OS假定没有任何调
用会关闭IMAGE SECTION的HANDLE,而现在,该HANDLE被关闭了.删除文件就解除了文件对
应的一个句柄.
2.由于UnmapViewOfFile解除了另外一个对应IMAGE的HANDLE,而且解除了IMAGE在内存的
映射.所以,后面的任何代码都不可以引用IMAGE映射地址内的任何代码.否则就OS会报错.
而现在的代码在UnmapViewOfFile后则刚好没有引用到任何IMAGE内的代码.
3.在ExitProcess之前,EXE文件就被删除了.也就是说,进程尚在,而主线程所在的EXE文件
已经没了.(WINNT/9X都保护这些被映射到内存的WIN32 IMAGE不被删除.)
一开始,不明白这段话:当返回到DeleteFile时,看到了ExitProcess的地址
后来想起WinAPI的call convention是__stdcall,特点是参数从右向左入栈,
而且由callee维护stack frame, 感觉是C和Pascal的混血儿,这样就迎刃而解了.
这段代码在C编译器的眼皮底下构造如此巧妙的调用序列
再次崇拜一把Gary Nebbett