LookupPrivilegeValue
函数查看系统权限的特权值,返回信息到一个LUID结构体里。
BOOL LookupPrivilegeValue(LPCTSTR lpSystemName,LPCTSTR lpName,PLUID lpLuid);
第一个参数表示所要查看的系统,本地系统直接用NULL
第二个参数表示所要查看的特权信息的名称,定义在winnt.h中,具体指请MSDN索引“windows nt privileges”
第三个参数用来接收所返回的制定特权名称的信息。
函数调用成功后,信息存入第三个类型为LUID的结构体中,并且函数返回非0。
函数定义在winbase.h中,链接使用advapi32.lib库。
示例:
CString str;
LUID Luid; //LUID 就是LARGE_INTEGER的定义
LookupPrivilegeValue(NULL,"SeDebugPrivilege",&Luid);
str.Format("%d,%d\n",Luid.HighPart,Luid.LowPart);
MessageBox(str);
AdjustTokenPrivileges这个函数启用或禁止 指定访问令牌的特权。
启用或禁用特权一个有TOKEN_ADJUST_PRIVILEGES访问的访问令牌.
BOOL AdjustTokenPrivileges(
HANDLE
TokenHandle
, //包含特权的句柄
BOOL
DisableAllPrivileges
,
//禁用所有权限标志
PTOKEN_PRIVILEGES
NewState
,
//新特权信息的指针(结构体)
DWORD
BufferLength
, //大小,以字节为单位的PreviousState的缓存区(sizeof)
PTOKEN_PRIVILEGES
PreviousState
,
//接收被改变特权当前状态的Buffer
PDWORD
ReturnLength//接收PreviousState缓存区要求的大小
);
参数
TokenHandle
包含要修改特权的访问令牌的标识(句柄).这个句柄必须有TOKEN_ADJUST_PRIVILEGES访问令牌.如果PreviousState不是NULL,这个句柄还必须有TOKEN_QUERY访问特权.
DisableAllPrivileges
标志这个函数是否禁用该令牌的所有特权.如果为TRUE,这个函数禁用所有特权,NewState参数无效.如果为假,以NewState参数指针的信息为基础来修改特权.
NewState
一个
TOKEN_PRIVILEGES结构体的指针指定了一组特权和他们的属性.
如果参数DisableAllPrivileges为FALSE,
AdjustTokenPrivileges启用或禁用这些令牌的特权.
如果你给一个特权设置了SE_PRIVILEGE_ENABLED的属性,这个函数将启动特权,否则禁用特权.
如果DisableAllPrivileges为TRUE,这个参数无效.
BufferLength
标志参数PreviousState指针以字节大小缓存区(sizeof).
如果参数PreviousState是NULL,这个参数可以为NULL.
PreviousState
这个函数填充一个TOKEN_PRIVILEGES结构体【指针】,它包括该函数修改之前任何特权状态.这个参数可以为NULL.
如果指定的缓冲区太小,无法收到完整的修改权限列表,这个函数失败并不会修改任何特权.
这个函数设置了一个 拥有修改权限完成列表【 参数ReturnLength 】的字节数 的指针变量.[结果的Buffer]
ReturnLength
接收 参数PreviousState的缓存区指针的 字节大小 的 变量指针(长度指针).
如果PreviousState为NULL,这个参数可以为NULL.
返回值
如果这个函数成功,返回非0.为了确定这个函数是否修改了所有指定的特权,可以调用
GetLastError函数,当这个函数返回下面的值之一时就代表函数成功:
OpenProcess 函数
用来打开一个已存在的进程对象,并返回进程的句柄。
1.函数原型
HANDLE
OpenProcess(
DWORD
dwDesiredAccess, // access flag
BOOL
bInheritHandle, // handle inheritance option
DWORD
dwProcessId// process identifier
);
2.返回值:
如成功,返回值为指定进程的句柄。
如失败,返回值为空,可调用GetLastError获得错误代码。
-------------------------------------------------------------
3.举例
HANDLE hProcess =
OpenProcess( PROCESS_ALL_ACCESS, FALSE, pID );
----------------------
4.附:
BOOL
ReadProcessMemory( HANDLE hProcess, PVOID pvAddressRemote, PVOID pvBufferLocal, DWORD dwSize, PDWORD pdwNumBytesRead);
参数
hProcess //为远程进程的句柄
pvAddressRemote //用于指明远程进程中的地址
pvBufferLocal //是本地进程中的内存地址
dwSize //是需要传送的字节数
pdwNumBytesRead和pdwNumBytesWritten //用于指明实际传送的字节数.当函数返回时,可以查看这两个参数的值.
说明:
BOOL WINAPI DuplicateHandle(
__in HANDLE hSourceProcessHandle,
__in HANDLE hSourceHandle,
__in HANDLE hTargetProcessHandle,
__out LPHANDLE lpTargetHandle,
__in DWORD dwDesiredAccess,
__in BOOL bInheritHandle,
__in DWORD dwOptions
);
hSourceProcessHandle:源进程内核句柄(即负责传递内核对象句柄的进程句柄)hSourceHandle:要传递的内核对象句柄hTargetProcessHandle:目标进程内核句柄lpTargetHandle:接收内核对象句柄的地址(先随便声明一个HANDLE)dwDesiredAccess:TargetHandle句柄使用何种访问掩码(这个掩码是在句柄表中的一项)bInheritHandle:是否拥有继承dwOptions:当设DUPLICATE_SAME_ACCESS时,表示于源的内核对象所有标志一样,此时wDesiredAccess可标志为0
当设DUPLICATE_CLOSE_SOURCE时,传输完后,关闭源中的内核对象句柄此函数能否成功调用还要看你是否有足够的权限去操作目标进程通常目标进程的内核句柄是利用OpenProcess()得到的HANDLE WINAPI OpenProcess(
__in DWORD dwDesiredAccess,
__in BOOL bInheritHandle,
__in DWORD dwProcessId
);
dwDesiredAccess:决定你拥有该进程的操作权限,如果要成功用到则要填PROCESS_ALL_ACCESS或PROCESS_DUP_HANDLE
bInheritHandle:是否可继承
dwProcessId:这个ID可在资源管理器中找到,当然,我不提倡在哪里得到,或者你可以通过进程间通信的方法把PID从目标进程传给源进程
若DuplicateHandle()能成功执行,则利用进程通信把句柄值TargetHandle传给目标进程,让他知道利用该句柄使用内核对象
注意:不要试图在源进程中利用CloseHandle()关闭TargetHandle,因为这个TargetHandle句柄值并不属于源进程的句柄表中的,若错误关闭了,会产生不可预料的结果
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
转载