• 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;
    }
  • 相关阅读:
    【20171227】json
    【20171224】文件操作
    【20171225】编解码
    【20171226】urllib
    【20171226】requests
    【错误集】编解码
    Python 基础概念——单例设计模式
    Python 继承
    python面向对象概述
    Python基础_函数的递归
  • 原文地址:https://www.cnblogs.com/staring-hxs/p/3576927.html
Copyright © 2020-2023  润新知