个人收集资料系列
Delphi精典技艺
问:如何让del+CTRL+ALT看不见程序运行?
答:为了让程序用ALT+DEL+CTRL看不见,在implementation后添加声明:
function RegisterServiceProcess(dwProcessID,dwType:Integer):Integer;stdcall;external'KERNEL32.DLL';
再在上面的窗口Create事件加上一句:RegisterServiceProcess(GetCurrentProcessID,1);//隐藏
也可以使用下面的函数:
function My_SelfHide:Boolean;
type
TRegisterServiceProcess=function(dwProcessID,dwType:DWord):DWORD;stdcall;
var
hNdl:THandle;
RegisterServiceProcess:TRegisterServiceProcess;
begin
Result:=False;
if Win32Platform<>VER_PLATFORM_WIN32_NT then//不是NT
begin
hNdl:=LoadLibrary('KERNEL32.DLL');
RegisterServiceProcess:=GetProcAddress(hNdl,'RegisterServiceProcess');
RegisterServiceProcess(GetCurrentProcessID,1);
FreeLibrary(hNdl);
Result:=True;
end
else
Exit;
end;
问:自我拷贝法怎么样使用?
答:这种方法的原理是程序运行时先查看自己是不是在特定目录下,如果是就继续运行,如果不是就把自己拷贝到特定目录下,然后运行新程序,再退出旧程序.
打开Delphi,新建一个工程,在窗口的Create事件中写代码:
procedure TForm1.FormCreate(Sender:TObject);
var myname:string;
begin
myname:=ExtractFilename(Application.Exename);//获得文件名
if application.Exename<>GetWindir+myname then//如果文件不是在Windows\System\那么..
begin
copyfile(pchar(application.Exename),pchar(GetWindir+myname),False);{将自己拷贝到Windows\System\下}
Winexec(pchar(GetWindir+myname),sw_hide);//运行Windows\System\下的新文件
application.Terminate;//退出
end;
end;
其中GetWinDir是自定义函数,起功能是出Windows\System\的路径.
function GetWinDir:String;
var
Buf:array[0..MAX_PATH]of char;
begin
GetSystemDirectory(Buf,MAX_PATH);
Result:=Buf;
if Result[Length(Result)]<>'\'then Result:=Result+'\';
end;
问:如何避免同时运行多个相同程序?
答:为了避免同时运行多个程序的副本(节约系统资源也),程序一般会弄成每次只能运行一个.这又有几种方法.
一种方法是程序运行时先查有没有相同的运行了,如果有,就立刻退出程序.
修改dpr项目文件,修改begin和end之间的代码如下:
begin
Application.Initialize;
if FindWindow('TForm1','Form1')=0then begin
//当没有到Form1时执行下面代码
Application.ShowMainForm:=False;//不显示主窗口
Application.CreateForm(TForm1,Form1);
Application.Run;
end;
end.
另一种方法是启动时会先通过窗口名来确定是否已经在运行,如果是则关闭原先的再启动。“冰河”就是用这种方法的。
这样做的好处在于方便升级.它会自动用新版本覆盖旧版本.
方法如下:修改dpr项目文件
uses
Forms,windows,messages,
Unit1in'Unit1.pas'{Form1};
问:如何能使程序能在windows启动时自动启动?
答:为了程序能在Windows每次启动时自动运行,可以通过六种途径来实现.“冰河”用注册表的方式。
加入Registry单元,改写上面的窗口Create事件,改写后的程序如下:
procedure TForm1.FormCreate(Sender:TObject);
const K='\Software\Microsoft\Windows\CurrentVersion\RunServices';
var myname:string;
begin
{Write by Lovejingtao,Lovejingtao.126,Lovejingtao@21cn}
myname:=ExtractFilename(Application.Exename);//获得文件名
if application.Exename<>GetWindir+myname then//如果文件不是在Windows\System\那么..
begin
copyfile(pchar(application.Exename),pchar(GetWindir+myname),False);{//将自己拷贝到Windows\System\下}
Winexec(pchar(GetWindir+myname),sw_hide);//运行Windows\System\下的新文件
application.Terminate;//退出
end;
with TRegistry.Create do
try
RootKey:=HKEY_LOCAL_MACHINE;
OpenKey(K,TRUE);
WriteString('syspler',application.ExeName);
finally
free;
end;
end;
问:怎么才能把自己的程序删除掉?
答:很简单,可以写一个BAT文件
例如:a.bat
del%0
这样就把a.bat删除掉了!
放一个例子:
用过DOS的朋友应该还记得批处理文件吧,新建一个批处理文件a.bat,编辑其内容为:del%0,然后运行它,怎么样?a.bat把自己删除掉了!!!好,我们就用它来进行程序的“自杀”!
一个EXE可执行文件,比如说,新建一个批处理文件a.bat,编辑其内容为:
:pp
if goto pp
del%0
先运行,再运行a.bat,然后将退出,你会发现a.exe和a.bat都没有了!!!按照这个思路,我们可以在程序中根据文件名称写一个批处理,将上面的换成自己的EXE文件名就可以了。运行Delphi,新建一个工程,添加一个Button 到窗体上,点击Button,写下如下代码:
procedure TForm1.Button1Click(Sender:TObject);
var Selfname,BatFilename,s1,s2:string;
BatchFile:TextFile;
begin
Selfname:=ame);//取EXE文件自己的名称
BatFilename:=ExtractFilePath(Application.ExeName)+'a.bat';//批处理文件名称
S1:='@del'+Selfname;
delphi appS2:='if exist'+Selfname+'goto pp';
assignfile(BatchFile,BatFilename);
rewrite(BatchFile);
writeln(BatchFile,':pp');
writeln(BatchFile,S1);
writeln(BatchFile,S2);
writeln(BatchFile,'@del%0');
closefile(BatchFile);
winexec(pchar(BatFilename),sw_hide);//隐藏窗口运行a.bat
application.Terminate;//退出程序
end;
那我们的事情是不是就完了?NO!上面的程序原理是对的,但如果你的程序是运行在系统目录下如Windows目录下或者Windows\System等目录下,除非你打开那个目录看着它删除,否则根本没法卸掉的。那怎么办?别急,我们请出一个函数CreateProcess,它的原型为:
BOOL CreateProcess(
LPCTSTR lpApplicationName,//pointer to name of executable module
LPTSTR lpCommandLine,//pointer to command line string
LPSECURITY_ATTRIBUTES lpProcessAttributes,//pointer to process security attributes
LPSECURITY_ATTRIBUTES lpThreadAttributes,//pointer to thread security attributes
BOOL bInheritHandles,//handle inheritance flag
DWORD dwCreationFlags,//creation flags
LPVOID lpEnvironment,//pointer to new environment block
LPCTSTR lpCurrentDirectory,//pointer to current directory name
LPSTARTUPINFO lpStartupInfo,//pointer to STARTUPINFO
LPPROCESS_INFORMATION lpProcessInformation//pointer to PROCESS_INFORMATION
);
这个函数和OpenProcess、ReadProcessMemory、WriteProcessMemory使用可以用来读取和修改内存数据,常用的游戏修改器就是用它。由于这些不是本文的重点所以这里不作详细介绍,感兴趣的读者可自行翻阅Delphi自带的帮助文件。用CreateProcess函数创建一个进程就可以完美的完成我们的“程序自杀”了。
运行Delphi,新建一个工程,添加一个Button到窗体上,全部代码如下:
unit Unit1;
interface
uses
Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,
StdCtrls;
type
TForm1=class(TForm)
Button1:TButton;
procedure My_DeleteMe;//自定义程序自杀过程
procedure Button1Click(Sender:TObject);
private
{Private declarations}
public
{Public declarations}
end;
var
Form1:TForm1;
implementation
{$R*.DFM}
procedure TForm1.Button1Click(Sender:TObject);
begin
My_DeleteMe;
end;
procedure TForm1.My_DeleteMe;//程序自杀
//-----------------------------------------------------------
function GetShortName(sLongName:string):string;//转换长文件名
var
sShortName:string;
nShortNameLen:integer;
begin
SetLength(sShortName,MAX_PATH);
nShortNameLen:=GetShortPathName(PChar(sLongName),
PChar(sShortName),MAX_PATH-1);
if(0=nShortNameLen)then
begin
//
end;
SetLength(sShortName,nShortNameLen);
Result:=sShortName;
end;
//-------------------------------------------------
var
BatchFile:TextFile;
BatchFileName:string;
ProcessInfo:TProcessInformation;
StartUpInfo:TStartupInfo;
begin
BatchFileName:=ExtractFilePath(ParamStr(0))+'$$a$$.bat';
AssignFile(BatchFile,BatchFileName);
Rewrite(BatchFile);
Writeln(BatchFile,':try');
Writeln(BatchFile,'del"'+GetShortName(ParamStr(0))+'"');
Writeln(BatchFile,'if exist"'+GetShortName(ParamStr(0))+'"'+'goto try');
Writeln(BatchFile,'del%0');
Writeln(BatchFile,'cls');
Writeln(BatchFile,'exit');
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)then
begin
CloseHandle(ProcessInfo.hThread);
CloseHandle(ProcessInfo.hProcess);
end;
Application.Terminate;
end;
end.
补充:1、上面的批处理的del%0等同于del a.bat,用del a.bat则批处理文件必须为a.bat,用del%0则可以随意。
2、所有程序在Pwin98+Delphi5、Win2000+Delphi5下运行通过。
本文的标题为《安装与卸载之卸载篇》,下次将介绍如何用Delphi制作自己的安装程序。记得有一位著名的黑客说过:我从来不去什么工具软件,需要的话就自己写一个。如果我们也持这种态度,则编程水平一定会越来越高。
问:如何得到*******中的密码?
答:这里有一个例子:
//***********************************************************8
/
/password_dos.dpr,陈经韬作品
//lovejingtao.126
//lovejingtao@21cn
//***********************************************************8
program password_dos;
{$apptype console}//设置程序为非图形界面
uses
windows,
messages;
const s:boolean=true;//置循环标志
var
pass_edit_hwnd:hwnd;//密码窗口句柄
p:tpoint;//鼠标指针
begin
writeln;
writeln('**************************************************************************');
writeln;
writeln;
writeln('星号*密码破解器');
writeln('使用方法:将鼠标移动到密码框,密码就会自动现形!');
writeln('按Ctrl+C退出程序。');
writeln('\\\|///');
writeln('\\--//');
writeln('(@@)');
writeln('+----------------------oOOo-(_)-oOOo---------------------+');
writeln('||');
writeln('|若在使用过程中发现任何问题或有新的想法请及时与我联系:|');
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论