提升Debug权限与创建结束JOB对象来结束进程

 

2008729

提升Debug权限与创建结束JOB对象来结束进程

这种结束进程的方式 对一些ring0下的保护软件不起作用 只是做下学习记录

分二步:第一步 提升系统Debug权限

////////////////////////////////提升权限函数 ////////////////////////////////////////////////////////////////////////////////////////////////////

uses

windows;

function SetSysPrivilege(TypePrivilege : Pchar):longbool;

implementation

function SetSysPrivilege(TypePrivilege :Pchar):longbool;

var

hToken : Cardinal;//定义令牌句柄

r1 : cardinal;

nst : TOKEN_PRIVILEGES; //定义令牌结构变量

begin

OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);

//得到进程令牌句柄 , 第一参数是要修改访问权限的进程句柄;第三个参数就是返回的访问令牌指针;

//第二个参数指定你要进行的操作类型,如要修改令牌我们要指定第二个参数为TOKEN_ADJUST_PRIVILEGES

if LookupPrivilegeValue(nil, TypePrivilege, nst.Privileges[0].LUid) then

//查找特权值 ,也就是说得到一个特定权限的Luid, 它必须与一个特权相对应

begin

nst.PrivilegeCount := 1; //设置令牌结构数组元素个数

nst.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;//设置特权为ENABLED

AdjustTokenPrivileges(hToken,false,nst,0,nil,r1); //修改令牌特权

result := true;

end

else result := false;

closeHandle(hToken); //关闭句柄防止内存泄漏

end;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

第二步:创建进程快照并循环列举进程 得到进程ID以便openprocess对进程操作

/////////////////////////////////////////////列举结束进程 ////////////////////////////////////////////////////////////////////////////////////////////

uses

TLHelp32,windows,JobObject,Dialogs,ntdllfun;

procedure stopofProcess(processName : String);

implementation

procedure stopofProcess(processName : String);

var

processID : Cardinal;

hJJob : THandle;

hPProcess : THandle;

jinchengJIEGOU : TProcessEntry32;

Loop : BOOL;

jinchengkuaizhao : THandle;

begin

jinchengkuaizhao := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);

                                                      //创建进程快照

jinchengJIEGOU.dwSize := sizeof(jinchengJIEGOU);//初始化进程结构体大小

Loop := process32First(jinchengkuaizhao,jinchengJIEGOU);//得到系统中第一个进程

//做循环列举

while Loop do

begin

processID := jinchengJIEGOU.th32ProcessID;//将进程ID付给变量

if processName = jinchengJIEGOU.szExeFile then //结束指定进程判断 then

begin

hpprocess := openprocess(PROCESS_ALL_ACCESS, False, processID);

ZwTerminateProcess(hpprocess,1); //结束进程

end;

Loop := process32Next(jinchengkuaizhao,jinchengJIEGOU);//得到系统下一个进程

最终退出循环

end;

end;

 

//////////////////////////////////////调用的JOB单元 //////////////////////////////////////////////////////////////////////////////////////

unit JobObject;

interface

uses

windows;

Function CreateJobObject(lpJobAttributes :

            PSecurityAttributes;

            lpName : PAnsiChar) : THandle; StdCall;

            External Kernel32 Name 'CreateJobObjectA';

Function AssignProcessToJobObject(

     hJob : THANDLE ;

     hProcess: THANDLE ):BOOL; stdcall; external Kernel32 Name 'AssignProcessToJobObject';

 

Function TerminateJobObject(hJob: THandle; uExitCode : UINT):BOOL; stdcall; external Kernel32 Name 'TerminateJobObject';

implementation

end.

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

 

 

 

 

 

 

调用的二级动态链接库NTDLL.DLL里的APi(这里还不怎么会用对SSDT研究的不够,继续努力ing

///////////////////////////////////////////////////////调用NTDLL.DLLAPI单元 ////////////////////////////////////////////////////////////

unit ntdllfun;

interface

uses

windows;

function ZwOpenProcess(dwDesiredAccess : DWORD; bInheritHandle:BOOL;

wProcessId :DWORD):Thandle;stdcall; external 'ntdll.dll' Name 'ZwOpenProcess';

function ZwTerminateProcess(ProcessHandle:Thandle;ExitStatus:DWORD):DWORD;stdcall;

external 'ntdll.dll' Name 'ZwTerminateProcess';

implementation

end.

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

这些方法可以结束系统进程比如winlogon.exe,svchost.exe

 

posted on 2010-06-20 01:15  龌龊龙  阅读(349)  评论(0编辑  收藏  举报

导航