-
-
[求助]问个关于ZwClose的问题
-
发表于:
2009-2-15 15:34
5465
-
我没有进r0,只是在r3下用ntdll.dll的导出函数——ZwClose而已。代码如下:
#include "stdafx.h"
#include "sss.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
typedef LONG NTSTATUS;
#define STATUS_SUCCESS ((NTSTATUS)0x00000000L)
#define OBJ_CASE_INSENSITIVE 0x00000040L
#define OBJ_KERNEL_HANDLE 0x00000200L
#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)
// 唯一的应用程序对象
CWinApp theApp;
using namespace std;
typedef NTSTATUS (__stdcall *pZwClose)(IN HANDLE Handle);
BOOL EnableDebugPrivilge(LPCSTR lpName, BOOL fEnable)
{
HANDLE hObject;
LUID Luid;
TOKEN_PRIVILEGES NewStatus;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hObject))
return FALSE;
if (LookupPrivilegeValue(NULL, lpName, &Luid))
{
NewStatus.Privileges[0].Luid = Luid;
NewStatus.PrivilegeCount = 1;
NewStatus.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0;
AdjustTokenPrivileges(hObject, FALSE, &NewStatus, 0, 0, 0);
CloseHandle(hObject);
return TRUE;
}
return FALSE;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("错误: MFC 初始化失败\n"));
nRetCode = 1;
}
else
{
// TODO: 在此处为应用程序的行为编写代码。
EnableDebugPrivilge(SE_DEBUG_NAME,TRUE);
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS, FALSE, 3668);
HMODULE hModule=LoadLibrary("ntdll.dll");
pZwClose ZwClose=(pZwClose)GetProcAddress(hModule,"ZwClose");
ZwClose(hProcess);
cout<<GetLastError();
}
return nRetCode;
}
3668是我在任务管理器里看到的PID,放进来OpenProcess为什么不可以?总是得不到进程的伪句柄,难道函数类型不能混用?我在其他的程序里没用到Zw*函数的定义的话,可以顺利地OpenProcess得到句柄的。
我是新手,能不能帮我解答下?
[培训]科锐逆向工程师培训第53期2025年7月8日开班!