EXE文件运行时,如何修改它自身,就象很多软件的限次使用那样,是怎么实现的?能够给出简单代码吗?

zcy_beijing 2002-05-22 09:15:41
谢谢!
...全文
370 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
net2free 2002-05-23
  • 打赏
  • 举报
回复
在Nt/2k可以修自己,但在9x我还不行。
weiliangma 2002-05-23
  • 打赏
  • 举报
回复
HANDLE BeginUpdateResource(
LPCTSTR pFileName, // executable file name
0A BOOL bDeleteExistingResources // deletion option
);

HRSRC FindResource(
HMODULE hModule, // module handle
LPCTSTR lpName, // resource name
LPCTSTR lpType // resource type
);

BOOL UpdateResource(
HANDLE hUpdate, // update-file handle
LPCTSTR lpType, // resource type
LPCTSTR lpName, // resource name
WORD wLanguage, // language identifier
LPVOID lpData, // resource data
DWORD cbData // length of resource data
);

BOOL EndUpdateResource(
HANDLE hUpdate, // update-file handle
BOOL fDiscard // write option
);
sx_enter 2002-05-23
  • 打赏
  • 举报
回复
我认为写注册表就行了,中国有句古话:不怕贼偷,就怕贼惦记着.要是给一般用户,不想破解,写注册表也就够了.要是被人惦记上了,用softice winasm或是别的什么高级的工具研究,你怎么也跑不了!别说咱们,连ms不也是!所以说,还不如用个简单的,咱也不费时.你要是能弄个破不了的,把技术卖给ms吧!
DingBoy 2002-05-22
  • 打赏
  • 举报
回复
那不如写注册表?!
zcy_beijing 2002-05-22
  • 打赏
  • 举报
回复
对于加密要求不是很高的程序,我觉得用修改资源的方法比较好,但是在EXE程序中可以用FindResource()把资源找到,可以判断出使用的次数,但是如何把修改后的值写回去呢?
wmrwinhap 2002-05-22
  • 打赏
  • 举报
回复
Windows下正在运行的程序怎么可以直接修改呢? 楼上的做法当然行不通。

不过……如果运行的不是程序本身,而是程序的一个副本,则修改它的原文件就实现啦。

怎么运行副本?程序首先将自己复制一个临时文件(正运行的程序是不可修改但可复制的),然后以一特殊命令行参数调用CreateProcess或ShellExecute启动该临时文件,然后原文件退出。也就是说,程序判断是以特殊命令行参数启动时,修改原文件并继续执行;无特殊命令行启动时,以特殊命令行参数启动副本临时文件后退出。

程序怎么检测命令行参数,相信你是知道的。

怎么样,结贴给分吧。

kenwhale 2002-05-22
  • 打赏
  • 举报
回复
这怎么可能??当前运行的文件会受到系统的保护,根本不能修改。有一种方法就是启动程序时,复制自身到一个临时文件,然后启动那个临时文件,关闭自身,然后在那个后来启动的进程中修改文件内容。不过像开始那位说的那样直接在文件末尾改也不行吧??那样会破坏文件格式,很可能就不能运行了。除非你对pe格式很熟悉。不过我想了想可以采用修改相应的程序中的资源的办法到是一个不错的办法。

----另:这样的限制次数很麻烦,而且如果用户每次使用前拷贝一份备份。实际上这种限制也就没有什么意义了。
ShallonXu 2002-05-22
  • 打赏
  • 举报
回复
我就是在Windows下做的,我做的比这个复杂多了
不要什么好象行不通,你把fopen方式换成CreateFile方式,这里提供的是一种思路

dahua 2002-05-22
  • 打赏
  • 举报
回复
那在windows下该如何做呢?
学习
sx_enter 2002-05-22
  • 打赏
  • 举报
回复
对.好像行不通
mountlin 2002-05-22
  • 打赏
  • 举报
回复
这种做法在windows下恐怕行不通
ShallonXu 2002-05-22
  • 打赏
  • 举报
回复
首先你通过一个程序加上次数这个结构在你的exe文件结尾
然后你在exe文件中你自己取本文件的结尾的这个次数结构,也可以修改
这种做法我做过的

比如你的exe文件为 hello.exe

加上次数限制的hello.exe文件做法
struct Encry
{
int nTimes;
};

Encry encry;
encry.nTimes = 100;
FILE *fp;
fp = fopen("hello.exe", rw);
fseek(0, SEEK_END);
fwrite(&encry, sizeof(Encry), 1, fp);
fclose(fp);

这样就好了

然后你在hello.exe这个程序的开头加上几条判断是否过期的限制
main(int argc, char *argv[])
{
...
Encry encry;
FILE fp;
fp = fopen("hello.exe", rw);
fseek(-sizeof(Encry), SEEK_END); // 也可以根据文件长度 - sizeof(Encry)从文件开头偏移
fread(&encry, sizeof(Encry), 1, fp);
fclose(fp);
if(encry.nTime < 1)
return;

在这里你可以修改次数,代码略
...

}

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧