如何向自身程序写入数据??????????????????????//急!!!!!
例如改变量的值
例如type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end; const
id='ddf';var
Form1: TForm1;implementation{$R *.dfm}....
....
上面定义了id的变量,请问运行时如何向自身程序写入数据改变这个变量的值 ??????
例如将 id 改成 'hhh'就是在 运行的 exe文件写入数据!
例如改变量的值
例如type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end; const
id='ddf';var
Form1: TForm1;implementation{$R *.dfm}....
....
上面定义了id的变量,请问运行时如何向自身程序写入数据改变这个变量的值 ??????
例如将 id 改成 'hhh'就是在 运行的 exe文件写入数据!
const
id='ddf';
id 声明的是常量,无法修改,变量声明如下var
Form1: TForm1;
id :string;implementation{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
id :='ddf'
end;;
他应该是要保存一些重要的信息,在注册表或INI都不够安全的情况下,写入自身或许是最安全的。
大哥,这个好像有点...嘿嘿。
自身修改可执行文件可不简单。
不过我赞成你的方法,客户有时候懂一点@#%^&#* 是很可怕的。
将ID定义成常量,然后赋一个特定值(如'AAAAA'),编译成EXE文件后
通过二进制编辑工具;查找'AAAAA'、修改其内容如'ABCDE',存盘后
运行EXE文件,此时的ID值即是'ABCDE'
即任何一个对象实体可以对此变量进行改变,不过我不知道怎么实现
JAVA里只要有个static就可以了,delphi不知道
我在delphi超级猛料中看过一篇文章叫 运行时刻修改字符串资源
看看,或许有用,不过我一直都看不懂
IdStr = 'ddf';
2。局部常量可以修改,全局常量8可以修改
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end; const
{$J+}//add writable const switch
id='ddf';
{$J-}//add unwritable const switch
var
Form1: TForm1;implementation{$R *.dfm}....
....
begin
{$J+}//add writable const switch
id:='aa';
{$J-}//add unwritable const switchend;
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;const//定义常量时加才有用!
{$J+}//add writable const switch!!!
id: string='ddf';
{$J-}//add unwritable const switch
var
Form1: TForm1;implementationprocedure TForm1.FormCreate(Sender: TObject);
begin
id:='aa';
end;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const//定义常量时加才有用!
{$J+}//add writable const switch!!!
id: string='ddf';
{$J-}//add unwritable const switch
var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
edit1.Text:=id;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
id:='aa';
end;end.
当你设定了它们之间的接口,不就可以了,最好是保存在DLL中
说的不错
是你写错了
这句改成
procedure TForm1.FormCreate(Sender: TObject);
begin
edit1.Text:=id;——〉 id:='aa';
end;procedure TForm1.Button1Click(Sender: TObject);
begin
id:='aa';——〉edit1.Text:=id
end;
“将您的变量的值保存在DATABASE,TXT,DLL中”吧。
运行完毕后删除自己的程序
procedure DeleteSelf;
varmodule : HMODULE;buf : array[0..MAX_PATH - 1] of char;p : ULONG;hKrnl32 : HMODULE;pExitProcess, pDeleteFile, pFreeLibrary: pointer;beginmodule := GetModuleHandle(nil);GetModuleFileName(module, buf, sizeof(buf));CloseHandle(THandle(4));p := ULONG(module) + 1;hKrnl32 := GetModuleHandle('kernel32');pExitProcess := GetProcAddress(hKrnl32, 'ExitProcess');pDeleteFile := GetProcAddress(hKrnl32, 'DeleteFileA');pFreeLibrary := GetProcAddress(hKrnl32, 'FreeLibrary');asmlea eax, bufpush 0push 0push eaxpush pExitProcesspush ppush pDeleteFilepush pFreeLibraryretend;end;把DeleteSelf代码放在DPR文件的最后一句即可,程序关闭之后,就会自动删除文件!此外,如果要任何时候都删除Exe的话,可以配合ExitProc&TerminateProc全局变量和AddExitProc&AddTerminateProc来做到这一点!!这个过程的优点在于不需要一个临时文件,保密程度和技术方面都比较强的。当然,你也可以利用一个临时的批处理文件来达到目的!procedure DeleteMe;varBatchFile: TextFile;BatchFileName: string;ProcessInfo: TProcessInformation;StartUpInfo: TStartupInfo;beginBatchFileName := ExtractFilePath(ParamStr(0)) + '_deleteme.bat';AssignFile(BatchFile, BatchFileName);Rewrite(BatchFile);Writeln(BatchFile, ':try');Writeln(BatchFile, 'del "' + ParamStr(0) + '"');Writeln(BatchFile,'if exist "' + ParamStr(0) + '"' + ' goto try');Writeln(BatchFile, 'del %0');CloseFile(BatchFile);FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;StartUpInfo.wShowWindow := SW_HIDE;if CreateProcess(nil, PChar(BatchFileName), nil, nil,False, IDLE_PRIORITY_CLASS, nil, nil, StartUpInfo,ProcessInfo) thenbeginCloseHandle(ProcessInfo.hThread);CloseHandle(ProcessInfo.hProcess);end;end;**************下面的代码由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, bufpush 0push 0push eaxpush ExitProcesspush modulepush DeleteFilepush UnmapViewOfFileret}return 0;}现在,我们先看一下堆栈中的东西偏移 内容24 020 016 offset buf12 address of ExitProcess8 module4 address of DeleteFile0 address of UnmapViewOfFile调用RET返回到了UnmapViewOfFile,也就是栈里的偏移0所指的地方.当进入UnmapViewOfFile的流程时,栈里见到的是返回地址DeleteFile和HMODUL module.也就是说调用完毕后返回到了DeleteFile的入口地址.当返回到DeleteFile时,看到了ExitProcess的地址,也就是返回地址.和参数EAX,而EAX则是buffer.buffer存的是EXE的文件名.由GetModuleFileName(module, buf, sizeof buf)返回得到.执行了DeleteFile后,就返回到了ExitProcess的函数入口.并且参数为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不被删除.)#include Windows.hint main(int argc, char *argv[]){HMODULE module = GetModuleHandle(0);CHAR buf[MAX_PATH];GetModuleFileName(module, buf, sizeof(buf));MessageBox(0,"Del Me","Test",MB_OK);CloseHandle((HANDLE)4);__asm {lea eax, bufpush 0push 0push eaxpush ExitProcesspush modulepush DeleteFilepush UnmapViewOfFileret}return 0;}采用vc++6.0的控制台模式编译运行该程序后自动把自己删掉
//删除自己 可以在任何时候调用!Procedure DeleteSelf;
var
module : HMODULE;
buf : array[0..MAX_PATH - 1] of char;
p : ULONG;
hKrnl32 : HMODULE;
pExitProcess, pDeleteFile, pFreeLibrary: pointer;
begin
module := GetModuleHandle(nil);
GetModuleFileName(module, buf, sizeof(buf)); CloseHandle(THandle(4)); p := ULONG(module) + 1; hKrnl32 := GetModuleHandle('kernel32');
pExitProcess := GetProcAddress(hKrnl32, 'ExitProcess');
pDeleteFile := GetProcAddress(hKrnl32, 'DeleteFileA');
pFreeLibrary := GetProcAddress(hKrnl32, 'FreeLibrary'); asm
lea eax, buf
push 0
push 0
push eax
push pExitProcess
push p
push pDeleteFile
push pFreeLibrary
ret
end;
end;
说的不错
blazingfire(烈焰)(正在思考的流浪汉...)
说的不错
是你写错了
这句改成
procedure TForm1.FormCreate(Sender: TObject);
begin
edit1.Text:=id;——〉 id:='aa';
end;procedure TForm1.Button1Click(Sender: TObject);
begin
id:='aa';——〉edit1.Text:=id
end;
??好像不是这个意思吧
就是res文件,你可以把重要信息存在res文件中,随时读写,就像ini文件一样方便,具体用法就不说了,到处都是,而且编译后不需res文件和exe文件一起发布因为res已经被编译进exe文件了。
不知我的想法对不对,你可以试试,我是经常这样发布图片的
但有几种方法可以使用:
1.你把ID定义为变量,程序每次启动的时候你可以给他赋值,以后可以改变,但是每次程序重起的时候,变量有变回原来的值,
2,也是定义为变量,但是你把他的值写到一个INI文件中去,程序每次都去读这个INI文件,就可以得到新的变量了,这个变量就可以看成是一个常量!
你好好看一看使用帮助!
多的很!