DuplicateHandle
功能:将一个进程内的伪句柄,转化为可以用来进程间通信的实句柄
BOOL DuplicateHandle(
HANDLE hSourceProcessHandle,
HANDLE hSourceHandle,
HANDLE hTargetProcessHandle,
LPHANDLE lpTargetHandle,
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwOptions
);
第一个参数是当前的源进程句柄,
第二参数是当前的资源句柄,
第三个是目标进程的句柄,
第四个是你要得到的目的句柄,这里应该是一个变量,使用指针,DuplicateHandle函数会将得到的句柄设置到这个参数上,
第五个是访问的方式,
第六个参数是得到的句柄能不能被得到的其的进程的子进程继承。
如果第七个参数是DUPLICATE_SAME_ACCESS flag标志,那么这个参数将被忽略,
1. DuplicateHandle获得一个进程句柄表中的一个记录项,然后在另一个进程的句柄表中创建这个记录项的一个副本。 2. DuplicateHandle 中dwOptions参数可以指定DUPLICATE_SAME_ACCESS和DUPLICATE_CLOSE_SOURCE标志。如果指定DUPLICATE_SAME_ACCESS标志将希望目标句柄拥有与源进程的句柄一样的访问掩码。如果指定DUPLICATE_CLOSE_SOURCE标志,会关闭源进程的句柄。使用这个标志,内核对象计数不会受到影响。 3. DuplicateHandle 函数与继承一样,目标进程并不知道它现在能访问一个新的内核对象,所以源进程以某种方式通知目标进程。与继承不一样的是,源进程不能使用命令行参数或更改目标进程的环境变量。 4. 可以利用DuplicateHandle修改内核对象的访问权限 5.绝对不能使用CloseHandle函数关闭通过phTargetHandle参数返回的句柄。
将11.exe中的线程句柄复制,通过22.exe输出复制的句柄,结束11.exe中的线程
例子:22.exe
#include <iostream> #include <windows.h> #include <stdlib.h> #include <process.h> using namespace std; int main (void) { HANDLE hRecv; cout << "请输入复制过来的句柄 : "<< endl; cin >> hRecv; TerminateThread(hRecv, 0); system("pause"); return 0; }
例子:11.exe
#include <iostream> #include <windows.h> #include <process.h> #include <TlHelp32.h> using namespace std; unsigned __stdcall thread (void * lpPragma); HANDLE GetProcessHandle(LPCTSTR szName); int main (void) { HANDLE hThread; hThread = (HANDLE)_beginthreadex(NULL, 0, thread, NULL, 0, NULL); cout << "my thread handle: " << hThread << endl; HANDLE hTarget; //你是不是想说这里的hThread与调用DuplicateHandle相关? if (DuplicateHandle (GetCurrentProcess(), hThread , GetProcessHandle(L"22.exe"), &hTarget, 0, FALSE, DUPLICATE_SAME_ACCESS ) ) cout << "句柄复制成功, 其句柄值为:" << hTarget << endl; cin.get(); return 0; } unsigned __stdcall thread (void * lpPragma) { while (1) { Sleep (500); cout << "terminal me" << endl; } return 0; } HANDLE GetProcessHandle(LPCTSTR szName) { HANDLE hSanpshot; hSanpshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if ( INVALID_HANDLE_VALUE == hSanpshot ) { return NULL; } PROCESSENTRY32 pe; BOOL bOk; pe.dwSize = sizeof(pe); bOk = Process32First (hSanpshot, &pe); if (!bOk) return NULL; do { if ( !wcscmp (pe.szExeFile, szName) ) { return OpenProcess (PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID); } bOk = Process32Next (hSanpshot, &pe); }while (bOk); return NULL; }