DuplicateHandle

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#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;
}

from:http://www.cnblogs.com/staring-hxs/p/3576927.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值