求几个结束“结束进程” 的api

liangdezhi 2011-09-20 11:47:42
taskkill命令ntsd命令行无法结束的进程

我下载了一个“冰刃”进程程序,可以结束它

请问我要写一个要用到那几个api呢?谢谢。。。。。。。。。
...全文
617 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangdezhi 2011-09-22
  • 打赏
  • 举报
回复
非常感谢大家。。。。。。。。
cczlp 2011-09-21
  • 打赏
  • 举报
回复
办法挺多的, 还可以FreeLibrary, UnmapviewOfFile, 进程内存清0等
李_军 2011-09-21
  • 打赏
  • 举报
回复
提升权限结束进程(2011-05-25 22:13:06)转载标签: 杂谈

1、进程相当于系统提供的一个平台,它可以包括一个或多个线程,如IE是个进程,
打开多个网页是它的多个线程,把IE进程Kill掉即可关闭多个打开网页的线程。
2、98和NT不一样。98下可以用CreateToolhelp32Snapshot函数Process32First和
Process32Next来枚举当前所有进程的进程ID(先调用函数CreateToolhelp32Snapshot)
NT下用EnumProcesses函数来枚举。2000是支持CreateToolhelp32Snapshot函数的。
得到进程ID后就可以用OpenProcess函数得到句柄了,在NT和2000下要通过安全检测。
3、EnumProcess 也可以得到系统中的进程列表
杀掉本地进程其实很简单,取得进程ID后,调用OpenProcess函数打开进程句柄,然
后调用TerminateProcess函数就可以杀掉进程了。有些情况下并不能直接打开进程句柄,
例如WINLOGON等系统进程,因为权限不够。这个时候我们就得先提升自己的进程的权限了。
提升权限过程也不复杂,先调用GetCurrentProcess函数取得当前进程的句柄,然后调用
OpenProcessToken打开当前进程的访问令牌,接着调用LookupPrivilegeValue函数取得你
想提升的权限的值,最后调用AdjustTokenPrivileges函数给当前进程的访问令牌增加权限
就可以了。一般有了SeDebugPrivilege特权后,就可以杀掉除Idle外的所有进程了。


1.OpenProcessToken
要对一个任意进程(包括系统安全进程和服务进程)进行指定了写相关的访问权的OpenProcess操作,只要当前进程具有SeDeDebug权限就可以了。要是一个用户是Administrator或是被给予了相应的权限,就可以具有该权限。可是,就算我们用Administrator帐号对一个系统安全进程执行OpenProcess(PROCESS_ALL_ACCESS,FALSE, dwProcessID)还是会遇到“访问拒绝”的错误。什么原因呢?原来在默认的情况下进程的一些访问权限是没有被置为可用状态(即Enabled)的,所以我们要做的首先是使这些权限可用。与此相关的一些API函数有OpenProcessToken、LookupPrivilegevalue、AdjustTokenPrivileges。我们要修改一个进程的访问令牌,首先要获得进程访问令牌的句柄,这可以通过OpenProcessToken得到,函数的原型如下:
BOOL OpenProcessToken(
HANDLE ProcessHandle, //要修改访问权限的进程句柄
DWORD DesiredAccess, //指定你要进行的操作类型
PHANDLE TokenHandle //返回的访问令牌指针
);
成功返回非0;
参数说明:
第一参数是要修改访问权限的进程句柄;
第三个参数就是返回的访问令牌指针;
第二个参数指定你要进行的操作类型,如要修改令牌我们要指定第二个参数为TOKEN_ADJUST_PRIVILEGES(其它一些参数可参考Platform SDK)。通过这个函数我们就可以得到当前进程的访问令牌的句柄(指定函数的第一个参数为GetCurrentProcess()就可以了)。接着我们可以调用AdjustTokenPrivileges对这个访问令牌进行修改。
包含头文件Winbase.h

2.LookupPrivilegeValue
获取当前系统上,指定权限名字的唯一标志(LUID),函数原形如下:
BOOL LookupPrivilegeValue(
LPCTSTR lpSystemName,
LPCTSTR lpName,
PLUID lpLuid
);
成功返回非0;
参数说明:
lpSystemName
[in]传入参数,字符传指针;指定需要获取权限的操作系统名字,如果传入null,那么将在本地系统上查询指定权限名的LUID;
lpName
[in]传入参数,字符串指针;指定需要查询LUID的权限名字,可以系统中定义了的权限产量(如SE_SECURITY_NAME),也可以是一个自己定义的字符串(如"SeSecurityPrivilege");
lpLuid
[out]传出参数,字符串指针; 传出权限名字指定的LUID;
包含头文件Winbase.h

3.AdjustTokenPrivileges
根据指定的权限令牌,置进程的权限为可用或不可用;
函数原型:
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle,
BOOL DisableAllPrivileges,
PTOKEN_PRIVILEGES NewState,
DWORD BufferLength,
PTOKEN_PRIVILEGES PreviousState,
PDWORD ReturnLength
);
参数说明:
TokenHandle
[in]包含需要修改权限的令牌句柄.这个参速需要有TOKEN_ADJUST_PRIVILEGES权限.如果参数PreviousState=NULL,那么句柄已应该拥有TOKEN_QUERY权限.
DisableAllPrivileges
[in]是否置所有的权限为不可用状态.如果值=TRUE,使所有的权限不可用,并且忽略NewState参数.如果为FALSE,那么该函数将修改这些权限为NewState参数所指的状态.
NewState
[in]指向一个描述权限属性的TOKEN_PRIVILEGES结构数组.如果DisableAllPrivileges=FALSE,那么AdjustTokenPrivileges将使数组中指向的属性为可用,不可用状态或者删除.
系统中定义的三个常量SE_PRIVILEGE_ENABLED,SE_PRIVILEGE_ENABLED,SE_PRIVILEGE_REMOVED.
Windows XP/2000/NT中,不能删除权限
BufferLength
[in] 以字节为单位指定了PreviousState所指缓冲buffer的长度,如果PreviousState参数为NULL,那么BufferLength可以被置为0.
PreviousState
[out] 传输AdjustTokenPrivileges参作将修改的属性的修改前状态,可以被置为NULL;
ReturnLength
[out] 返回PreviousState请求字节长度,如果PreviousState=NULL,这个参数可以为NULL;
包含头文件Winbase.h

4.OpenProcessToken ,LookupPrivilegeValue,AdjustTokenPrivileges引用举例
BOOL EnableDebugPrivilege(BOOL fEnable) {
BOOL fOk = FALSE; // Assume function fails
HANDLE hToken;
//以修改选项,获取当前进程的令牌环
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
{
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
//获取debug权限的luid
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
//将权限属性置为可用
tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
//修改权限
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
fOk = (GetLastError() == ERROR_SUCCESS);
CloseHandle(hToken);
}
return(fOk);
}




//结束进程

#include<windows.h>
#include<process.h>
#include<string.h>
#include<Tlhelp32.h>

DWORD GetProcessIdFromName(char * name)
{
PROCESSENTRY32 pe;
DWORD id = 0;

HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pe.dwSize = sizeof(PROCESSENTRY32);
if( !Process32First(hSnapshot,&pe)) return 0;
do
{
pe.dwSize = sizeof(PROCESSENTRY32);
if( Process32Next(hSnapshot,&pe)==FALSE ) break;
if(strcmp(pe.szExeFile,name) == 0)
{
id = pe.th32ProcessID;
break;
}
} while(TRUE);
CloseHandle(hSnapshot);
return id;
}

int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)

{
////////////////////////////////////////////////////////////////////// 提升权限为SE_DEBUG_NAME
HANDLE hToken;
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hToken))
{
LUID luid;
if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid))
{
TOKEN_PRIVILEGES TokenPrivileges;
TokenPrivileges.PrivilegeCount = 1;
TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
TokenPrivileges.Privileges[0].Luid = luid;
AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, 0, NULL, NULL);
}
CloseHandle(hToken);
}
///////////////////////////////////////////////////////////////////////

DWORD pid=GetProcessIdFromName("WINLOGON.EXE"); //结束WINLOGO.EXE进程
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0, pid);
TerminateProcess(hProcess, 0);
return 0;
}
bdmh 2011-09-21
  • 打赏
  • 举报
回复
带Process的api,自己查吧
luozhongzhu 2011-09-21
  • 打赏
  • 举报
回复
ExitProcess
TerminateProcess

不过这种强制结束线程的方法一般不推荐用,会导致一些资源泄露。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧