delphi如何结束杀软进程?如瑞星(300分)

  • 主题发起人 主题发起人 zhxdiannao
  • 开始时间 开始时间
Z

zhxdiannao

Unregistered / Unconfirmed
GUEST, unregistred user!
请问用delphi如何编写能结束杀软进程的东西?主要是用来对付单位的瑞星和定时关机软件,现在能结束一般程序了,但是我的卡巴的avp.exe结束不了。
参照网上代码,我照猫画虎写的程序如下所示:
本人没有恶意应用目的,现在用一个叫做“killer 2.0”(作者 暗眼)的软件,
只能每次手工填入
ravcopy.exe|ravmon.exe|ravmond.exe|ravstud.exe|ravtask.exe|rsaupd.exe|rstray.exe
这一大串文件列表(瑞星真他吗的变态!),若要生成针对瑞星的专门程序,得花200元买他的完整功能板,因此才想自己写一个程序,请帮助我kill瑞星!
~~~~~~~~~~~~~~~~~~~~~
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,Tlhelp32, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
{$R *.dfm}

//根据进程名称来杀死进程是用以下函数:
function KillTask(ExeFileName: string): Integer;
const
PROCESS_TERMINATE = $0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
Result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

while Integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(
OpenProcess(PROCESS_TERMINATE,BOOL(0),FProcessEntry32.th32ProcessID),0));
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;

//但是对于服务程序,它会提示"拒绝访问".其实只要程序拥有Debug权限即可:

function EnablePrivilege(hToken: Cardinal; PrivName: string; bEnable: Boolean): Boolean;
var
TP: TOKEN_PRIVILEGES;
Dummy: Cardinal;
begin
TP.PrivilegeCount := 1;
LookupPrivilegeValue(nil, pchar(PrivName), TP.Privileges[0].Luid);
if bEnable then
TP.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else TP.Privileges[0].Attributes := 0;
AdjustTokenPrivileges(hToken, False, TP, SizeOf(TP), nil, Dummy);
Result := GetLastError = ERROR_SUCCESS;
end;

function EnableDebugPrivilege: Boolean;
var
hToken: Cardinal;
begin
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES, hToken);
result:=EnablePrivilege(hToken, 'SeDebugPrivilege', True);
CloseHandle(hToken);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
EnableDebugPrivilege;//提升权限
KillTask(edit1.Text);//关闭该服务程序.
end;

end.

~~~~~~~~~~~~~~~~~~~~~~~
是不是软件提升权限还不够?​
 
因为杀软有防非法终止能力。以前看过一篇文章 说建立一个作业 把杀软的进程加入到作业中 然后终止作业。作业中的进程也会随之全部终止。可以试试
CreateJob
 
ntsd -c q -p PID
只有System、SMSS.EXE和CSRSS.EXE不能杀。前两个是纯内核态的,最后那个是Win32子

系统,ntsd本身需要它。ntsd从2000开始就是系统自带的用户态调试工具。被调试器附

着(attach)的进程会随调试器一起退出,所以可以用来在命令行下终止进程。使用ntsd

自动就获得了debug权限,从而能杀掉大部分的进程。ntsd会新开一个调试窗口,本来在

纯命令行下无法控制,但如果只是简单的命令,比如退出(q),用-c参数从命令行传递就

行了。NtsdNtsd 按照惯例也向软件开发人员提供。只有系统开发人员使用此命令。有关

详细信息,请参阅 NTSD 中所附的帮助文件。用法:开个cmd.exe窗口,输入:
ntsd -c q -p PID
把最后那个PID,改成你要终止的进程的ID。

我在任务管理器里查出瑞星相关进程的PID,然后建了一个cmd文件
ntsd -c q -p 896
ntsd -c q -p 1608
ntsd -c q -p 764
运行它倒是可以结束瑞星的进程,但是每次开机后的PID是不一样的。
或许可以这样变通一下:
按照瑞星的文件名自己写程序查出它的PID后,
再即时生成一个cmd文件如下:
ntsd -c q -p ???
ntsd -c q -p ???
ntsd -c q -p ???

再自动运行这个cmd文件。
呵呵,看看相关资料再说,
我没权限结束你,系统程序ntsd还没有?
 
顶一个,学习。
 
你停止瑞星服务看看...
 
用icesword什么都能杀,而且免费,免安装。非常好用。
 
楼上的大哥真是大器晚成啊
虽然这个问题真的很难解决 但是你也不能打非所问......
 
电脑报做过测试,icesword并不能杀全部的杀毒软件,只有半数左右可以,其它的都会自动恢复。
 
地质灾害 应当看的就是这篇
Code Language : C

#include "stdafx.h"

#include

#include

#include

#include

#include

#pragma comment(lib,"Kernel32.lib")

#include



int main(int argc, char* argv[])

{

BOOL res=FALSE;

HANDLE hjob=CreateJobObject(NULL,TEXT("killrav")); //建立job对象,命名为killrav



HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,0,atoi(argv[1]));//打开进程



if (hProcess==NULL) //打开失败



{

printf("/t/t OpenProcessError!please Look up your Privilege first ^_^/n");



return 0;

}



AssignProcessToJobObject(hjob,hProcess);//将进程和对象关联起来



res=TerminateJobObject(hjob,0);//结束对象

if (res==FALSE) printf("/t/t Sorry ,can't kill the process you want /n");



else

printf("/t/t Ok ,Now you can check if the process still exists /n");



return 0;

}
本篇文章来源于 黑客领域 原文链接:http://www.hackfield.com/article/sort010/info-2696.html
 
有些是不容易结束的.搞不清楚他们是怎么做的.
 
用驱动,然后hook SSDT(系统服务描述符表)里的相关进程操作函数。
瑞星应该也是hook了这里的函数,所以你的终止进程操作都被它过滤了。

从网上找找 dddk.pas 估计对你有帮助
 
多人接受答案了。
 
后退
顶部