高手留意!高分送出 程序运行后给自身可执行文件写入一个字符串变量,如何做??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 太复杂,我记得DOS 的时候程序文件有一段可以自己改写,不知道还有没有更简单的办法,其实这个初衷是想程序自己收集计算机的硬件资料,然后写到程序本身,用于防拷贝,也不知道有没有其他更简单适用的方拷贝的办法! 简单的方法只有这样子,先创建一个备份文件,然后你的程序把东西写到备份里,接着生成一个.BAT文件,.BAT文件的功能就是删掉你原来的程序并且启动备份程序。在你程序退出的时候启动.BAT,.BAT是可以将你的程序删掉的。现在很多程序自杀就是这样做的。 楼主的意思是想要防止盗版,因此想将全局唯一信息(每台机子的标识)写入.exe文件中,那么完全不用将信息加入进.exe文件,而应该预先留出一块空间,以后再填写那块空间。不可以运行时给自己写信息,因为.exe文件被系统用FILE_SHARE_READ的标志打开,禁止改写其内容。而且楼主只是想将唯一信息写入.exe,即只需写入一次(以后每次执行都是在同一台机子上)。所以应该再编一个小程序,在安装程序中调用,以将全局唯一信息写入已安装到客户机子上的.exe。至于在.exe中预留空间,可以创建一个节(section),将一个表示全局唯一信息的结构的全局实例放到这个节中,再在辅助程序中利用SDK提供的帮助函数即可很方便的修改这个节的内容了,现举个辅助程序的例子供楼主参考:#include <windows.h>#include <Imagehlp.h>#include <iostream>struct TEMPSTRUCT{ float a; ULONG b; float c;}; // 楼主应将这里替换成表示全局唯一信息的结构////下面这一段用于生成节,楼主应将其放在主程序中/////////////////这里只是例子,真正的辅助程序中应该去掉此段///////////////#pragma section( "Private", read )__declspec( allocate( "Private" ) ) TEMPSTRUCT g_Temp;/////////////////////////////////////////////////////////////#pragma comment( lib, "Imagehlp.lib" )int main(){ std::cout << g_Temp.a << " " << g_Temp.b << " " << g_Temp.c << std::endl; LOADED_IMAGE image;// 这里的c:\a.exe楼主在实际的辅助程序中应通过安装程序转成主程序的路径名 if( !::MapAndLoad( "a.exe", "C:\\", &image, FALSE, FALSE ) ) return -1; for( ULONG i = 0; i < image.NumberOfSections; ++i ) if( !::lstrcmp( reinterpret_cast< LPSTR >( image.Sections[ i ].Name ), "Private" ) ) { TEMPSTRUCT *pTemp = reinterpret_cast< TEMPSTRUCT* >( image.MappedAddress + image.Sections[ i ].PointerToRawData ); // 这里应使用楼主自定的全局唯一信息生成函数来将生成的信息写入.exe pTemp->a = 0.345f; pTemp->b = 234; pTemp->c = 43.43f; break; } DWORD header = 0, file = 0; ::MapFileAndCheckSum( "C:\\a.exe", &header, &file ); image.FileHeader->OptionalHeader.CheckSum = file; ::UnMapAndLoad( &image ); return 0;}将编译生成后的.exe考到C:\下,重命名为a.exe,再运行未重命名前的.exe,再运行a.exe即可看见a.exe已经被修改。至于上面所用到的函数及结构,楼主可参考MSDN。不过此小技若用于防盗版,那等于没有 求救:VC+USB数据采集卡:程序出现错误,wincore.cpp debug Assertion Failed 991 书上这段代码是不是有问题呀 请问winodws控制台程序怎么嵌入到窗体程序中啊,我用的是VS2008 VC中使用滚动条拖拽失败,解决不了? 帮顶有分,如何备份处于内存中的Bitmap? ths 不够会加 ***诚交有志青年,共同创业*** 求教,想到的一个奇怪的小问题! 请教如下的代码为什么不可以发送电子邮件 RichEdit控件 追加新行 怎样自动设定屏幕的分辨率和刷新频率 关于CharLower? 高分求WIN32 SDK 中文 手册!
其实这个初衷是想程序自己收集计算机的硬件资料,然后写到程序本身,用于防拷贝,
也不知道有没有其他更简单适用的方拷贝的办法!
#include <Imagehlp.h>
#include <iostream>struct TEMPSTRUCT
{
float a;
ULONG b;
float c;
}; // 楼主应将这里替换成表示全局唯一信息的结构////下面这一段用于生成节,楼主应将其放在主程序中/////////////
////这里只是例子,真正的辅助程序中应该去掉此段///////////////
#pragma section( "Private", read )
__declspec( allocate( "Private" ) ) TEMPSTRUCT g_Temp;
/////////////////////////////////////////////////////////////#pragma comment( lib, "Imagehlp.lib" )int main()
{
std::cout << g_Temp.a << " " << g_Temp.b << " " << g_Temp.c << std::endl; LOADED_IMAGE image;
// 这里的c:\a.exe楼主在实际的辅助程序中应通过安装程序转成主程序的路径名
if( !::MapAndLoad( "a.exe",
"C:\\",
&image,
FALSE,
FALSE ) )
return -1; for( ULONG i = 0; i < image.NumberOfSections; ++i )
if( !::lstrcmp( reinterpret_cast< LPSTR >( image.Sections[ i ].Name ),
"Private" ) )
{
TEMPSTRUCT *pTemp = reinterpret_cast< TEMPSTRUCT* >(
image.MappedAddress + image.Sections[ i ].PointerToRawData ); // 这里应使用楼主自定的全局唯一信息生成函数来将生成的信息写入.exe
pTemp->a = 0.345f;
pTemp->b = 234;
pTemp->c = 43.43f;
break;
} DWORD header = 0, file = 0;
::MapFileAndCheckSum( "C:\\a.exe", &header, &file );
image.FileHeader->OptionalHeader.CheckSum = file;
::UnMapAndLoad( &image ); return 0;
}将编译生成后的.exe考到C:\下,重命名为a.exe,再运行未重命名前的.exe,再运行a.exe即可看见a.exe已经被修改。
至于上面所用到的函数及结构,楼主可参考MSDN。不过此小技若用于防盗版,那等于没有