可执行文件的自修改问题!200分,等候回答!(200分)

  • 主题发起人 主题发起人 zwjChina
  • 开始时间 开始时间
Z

zwjChina

Unregistered / Unconfirmed
GUEST, unregistred user!
如何让程序自己在运行时修改自己???
 
我也很想知道,帮你提一下
 
我也想知道
 
问题不清楚,修改是指哪方面?
 
不太明白你的意思,你看看下面代码事不是你要的
在Windows NT中覆盖或删除正在使用的文件
这个函数就是<> MoveFileEx <>
这个函数充许我们对一个指定的文件或文件夹重命名. 但当我们指定它的dwFlags参数为MOVEFILE_DELAY_UNTIL_REBOOT(只能用于Windows NT 4/2000)后, 它就将改写注册表,在Windows重新启动后此文件就将被覆盖或删除.
用法:
MoveFileEx(ExistingFN, NewFN, MOVEFILE_REPLACE_EXISTING or
MOVEFILE_DELAY_UNTIL_REBOOT
说明:
参数ExistingFN 指向一个以空字符结尾的字符串,此字符串即是待改变的文件或文件夹。
参数NewFN 也是一个指向另一个空字符结尾的字符串,不同的是它表明的是新的文件或文件夹的名称。
标志MOVEFILE_REPLACE_EXISTING 告诉函数如果ExistingFN所指的文件或文件夹已经存在则覆盖它。如果NewFN指向nil,则 ExistingFN 所指的文件或文件夹就将被删除。
举例:
* 覆盖一个使用中的文件:
MoveFileEx('c:/winnt/system32/kernel32.dll', 'd:/winnt.bak/system32/kernel32.dll',
MOVEFILE_REPLACE_EXISTING or MOVEFILE_DELAY_UNTIL_REBOOT
* 删除一个使用中的文件:
MoveFileEx('c:/winnt/system32/kernel32.dll', nil,
MOVEFILE_REPLACE_EXISTING or MOVEFILE_DELAY_UNTIL_REBOOT
 
我想知道的是例如有程序,c:/test.exe
运行c:/test.exe,而test.exe会把c:/test.exe的内容改掉,例如在c:/test.exe的中增加
运行次数记数或者其他信息等。
 
naughtboy,首先,谢谢你的帮助。
当然我也知道一些执行文件自删除的例子,甚至包括使用批处理来删除自己的方法。
但是我想知道的不是删除,而是修改!谢谢。
 
创建副本
修改副本
创建批处理
执行批处理
退出。
批处理把副本覆盖该可执行文件
比处理删除副本
批处理退出
 
关注一下,这个对我来说也很得要,以前有一种方法,可以被金山毒霸查为病毒;

所以接下来还请高手高手高高手出招
 
来自:wr960204, 时间:2002-12-10 9:43:00, ID:1498122
创建副本
修改副本
创建批处理
执行批处理
退出。
批处理把副本覆盖该可执行文件
比处理删除副本
批处理退出

同意
 
需要了解Windows的PE保护模式的格式
比较简单阿
http://formats.myrice.com/tech/else/exewin.htm

/*
* $Header: D:/c_kram/nt_info/RCS/versinfo.h,v 1.2 1998/04/14 15:41:46 LUEVELSMEYER Exp $
*
* checked in by $Author: LUEVELSMEYER $
* checked in at $Date: 1998/04/14 15:41:46 $
*
* History:
* $Log: versinfo.h,v $
* Revision 1.2 1998/04/14 15:41:46 LUEVELSMEYER
* added comments
*
* Revision 1.1 1997/06/05 11:23:42 LUEVELSMEYER
* Initial revision
*
*
*/


extern void print_version_info(char * progname);
/* dumps version info, if it is in the file */





#include <windows.h>

#include <malloc.h>
#include <stdio.h>


/*
* $Header: D:/c_kram/nt_info/RCS/versinfo.c,v 1.2 1998/04/14 15:41:46 LUEVELSMEYER Exp $
*
* checked in by $Author: LUEVELSMEYER $
* checked in at $Date: 1998/04/14 15:41:46 $
*
* History:
* $Log: versinfo.c,v $
* Revision 1.2 1998/04/14 15:41:46 LUEVELSMEYER
* added comments
*
* Revision 1.1 1997/06/05 11:23:42 LUEVELSMEYER
* Initial revision
*
*
*/

#pragma off(unreferenced)
static const char RCSHeader[] = "$Id: versinfo.c,v 1.2 1998/04/14 15:41:46 LUEVELSMEYER Exp $";
#pragma on(unreferenced)



#include "versinfo.h"

static void ShowStrings(void * const info, const DWORD lang)
{
#define ARRAY_LEN(Array) (sizeof(Array) / sizeof(Array[0]))
char *stringnames[] = { "Comments",
"CompanyName",
"FileDescription",
"FileVersion",
"InternalName",
"LegalCopyright",
"LegalTrademarks",
"OriginalFilename",
"PrivateBuild",
"ProductName",
"ProductVersion",
"SpecialBuild"
};

int i;

for (i = 0; i < ARRAY_LEN(stringnames); i++)
{ char query[500];
LPSTR value;
UINT len;

sprintf(query,"//StringFileInfo//%04x%04x//%s",LOWORD(lang), HIWORD(lang),stringnames);
if (!VerQueryValue(info, query,&value, &len) || !len) continue;
CharToOem(value,value);
printf(" %-16s: %s/n", stringnames,value);
}

#undef ARRAY_LEN
}


void print_version_info(char * progname)
{
DWORD dummy,infosize;

if(!(infosize = GetFileVersionInfoSize(progname,&dummy))) { puts("(no version info)"); return; }
else { void *info = malloc(infosize);
VS_FIXEDFILEINFO *fixed_info;
UINT fixed_len;

if(!info) { puts("(error on malloc"); return; }

GetFileVersionInfo(progname,0,infosize,info);
VerQueryValue(info,"//",&fixed_info,&fixed_len);

/* File Version */
printf("File Version: %d.%d.%d.%d/n",
HIWORD(fixed_info->dwFileVersionMS),
LOWORD(fixed_info->dwFileVersionMS),
HIWORD(fixed_info->dwFileVersionLS),
LOWORD(fixed_info->dwFileVersionLS));

/* Product Version */
printf("Product Version: %d.%d.%d.%d/n",
HIWORD(fixed_info->dwProductVersionMS),
LOWORD(fixed_info->dwProductVersionMS),
HIWORD(fixed_info->dwProductVersionLS),
LOWORD(fixed_info->dwProductVersionLS));

{ /* File Flags */
DWORD flags = fixed_info->dwFileFlags & fixed_info->dwFileFlagsMask;
fputs("Flags: ",stdout);
if (!flags) fputs("(none)",stdout);
if (flags & VS_FF_DEBUG) fputs("Debug ",stdout);
if (flags & VS_FF_PRERELEASE) fputs("Prerelease ",stdout);
if (flags & VS_FF_PATCHED) fputs("Patched ",stdout);
if (flags & VS_FF_PRIVATEBUILD) fputs("PrivateBuild ",stdout);
if (flags & VS_FF_INFOINFERRED) fputs("InfoInferred ",stdout);
if (flags & VS_FF_SPECIALBUILD) fputs("SpecialBuild ",stdout);
putchar('/n');
}

{ /* File OS. */
fputs("OS: ",stdout);
switch(LOWORD(fixed_info->dwFileOS))
{ case VOS__WINDOWS16: fputs("16-Bit Windows",stdout); break;
case VOS__PM16: fputs("16-Bit Presentation Manager",stdout); break;
case VOS__PM32: fputs("32-Bit Presentation Manager",stdout); break;
case VOS__WINDOWS32: fputs("Win32",stdout); break;
default: fputs("(unknown)",stdout); break;
}
fputs(" on ",stdout);
switch(MAKELONG(0,HIWORD(fixed_info->dwFileOS)))
{ case VOS_DOS: puts("MS-DOS"); break;
case VOS_OS216: puts("16-Bit OS/2"); break;
case VOS_OS232: puts("32-Bit OS/2"); break;
case VOS_NT: puts("NT"); break;
default: puts("(unknown)"); break;
}
}

/* file type */
fputs("Type: ",stdout);
switch(fixed_info->dwFileType) { case VFT_APP: puts("Exe"); break;
case VFT_DLL: puts("DLL"); break;
case VFT_DRV: switch(fixed_info->dwFileSubtype) { case VFT2_DRV_COMM: puts("Treiber (seriell)"); break;
case VFT2_DRV_PRINTER: puts("Treiber (Drucker)"); break;
case VFT2_DRV_KEYBOARD: puts("Treiber (Tastatur)"); break;
case VFT2_DRV_LANGUAGE: puts("Treiber (Sprache)"); break;
case VFT2_DRV_DISPLAY: puts("Treiber (Bildschirm)"); break;
case VFT2_DRV_MOUSE: puts("Treiber (Maus)"); break;
case VFT2_DRV_NETWORK: puts("Treiber (Netzwerk)"); break;
case VFT2_DRV_SYSTEM: puts("Treiber (System)"); break;
case VFT2_DRV_INSTALLABLE: puts("Treiber (installierbar)"); break;
case VFT2_DRV_SOUND: puts("Treiber (Klang)"); break;
case VFT2_UNKNOWN:
default: puts("Treiber (unbekannt)"); break;
}

break;
case VFT_FONT: switch(fixed_info->dwFileSubtype) { case VFT2_FONT_RASTER: puts("Zeichensatz (Raster)"); break;
case VFT2_FONT_VECTOR: puts("Zeichensatz (Vektor)"); break;
case VFT2_FONT_TRUETYPE: puts("Zeichensatz (TrueType)"); break;
case VFT2_UNKNOWN:
default: puts("Zeichensatz (unbekannt)"); break;
}

break;

case VFT_VXD: printf("virtuelles Ger鋞 (VxD), device id == %ld/n",fixed_info->dwFileSubtype); break;
case VFT_STATIC_LIB: puts("static Lib");break;
case VFT_UNKNOWN:
default: puts("(unknown)");break;
}


/* languages and strings */
{ LPDWORD langs;
UINT len, i;
char buffer[MAX_PATH];

VerQueryValue(info, "//VarFileInfo//Translation",&langs, &len);

for (i = 0; i<len; i += sizeof(*langs), langs++)
{ /* Get the string name for the language number. */
VerLanguageName(LOWORD(*langs), buffer, sizeof(buffer));
fputs("- ",stdout);puts(buffer);
ShowStrings(info, *langs);
}
}

free(info);

}
}
 
to老人家, 非常感谢您的代码。不过知其然而不知其所以然也没用。

不知道你您那里有没有资料,或者相关资料的下载连接,可以告诉我吗?
当然我指的资料是关于“需要了解Windows的PE保护模式的格式”
是怎么突破这种保护的。
EMail:zwjchina163@163.com

再次感谢您。
 
直接改自己不可能,一运行就锁定了
 
自己修改自己很难作到!
但你可以利用一些外部的参数或变量什么的!比如环境变量, 文件,可执行程序等.
 
老人家
那个只是查看版本信息用的,不能改!
 
我也面临这个问题,请大家多多指教
 
自已修改自己的话,不太可能。如果你要做个象杀毒软件一样的在线升级,
就可以做个简单的升级程序,运行此文件,升级其它文件。
 
后退
顶部