提升Debug权限与创建结束JOB对象来结束进程
2008年7月29日
提升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.DLL里API单元 ////////////////////////////////////////////////////////////
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