zoukankan      html  css  js  c++  java
  • XP/Win7通用的CreateRemoteThread类

    Inject.h

    #pragma once
    typedef DWORD (WINAPI *PFNTCREATETHREADEX)
    ( 
     PHANDLE                 ThreadHandle,    
     ACCESS_MASK             DesiredAccess,    
     LPVOID                  ObjectAttributes,    
     HANDLE                  ProcessHandle,    
     LPTHREAD_START_ROUTINE  lpStartAddress,    
     LPVOID                  lpParameter,    
     BOOL                    CreateSuspended,    
     DWORD                   dwStackSize,    
     DWORD                   dw1, 
     DWORD                   dw2, 
     LPVOID                  Unknown 
    );
    
    BOOL InjectDll(DWORD dwPID, char *szDllName);

    Inject.cpp

    #include "StdAfx.h"
    #include "stdio.h"
    #include "tchar.h"
    #include "Inject.h"
    #include <Windows.h>
    
    BOOL IsVistaOrLater()
    {
        OSVERSIONINFO osvi;
        ZeroMemory(&osvi, sizeof(OSVERSIONINFO));
        osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
        GetVersionEx(&osvi);
        if( osvi.dwMajorVersion >= 6 )
            return TRUE;
        return FALSE;
    }
    
    BOOL MyCreateRemoteThread(HANDLE hProcess, LPTHREAD_START_ROUTINE pThreadProc, LPVOID pRemoteBuf)
    {
        HANDLE      hThread = NULL;
        FARPROC     pFunc = NULL;
        if( IsVistaOrLater() )    // Vista, 7, Server2008
        {
            pFunc = GetProcAddress(GetModuleHandle("ntdll.dll"), "NtCreateThreadEx");
            if( pFunc == NULL )
            {
                return FALSE;
            }
            ((PFNTCREATETHREADEX)pFunc)(&hThread,
                                        0x1FFFFF,
                                        NULL,
                                        hProcess,
                                        pThreadProc,
                                        pRemoteBuf,
                                        FALSE,
                                        NULL,
                                        NULL,
                                        NULL,
                                        NULL);
            if( hThread == NULL )
            {
                //printf("MyCreateRemoteThread() : NtCreateThreadEx() 调用失败!错误代码: [%d]/n", GetLastError());
                return FALSE;
            }
        }
        else                    // 2000, XP, Server2003
        {
            hThread = CreateRemoteThread(hProcess, 
                                         NULL, 
                                         0, 
                                         pThreadProc, 
                                         pRemoteBuf, 
                                         0, 
                                         NULL);
            if( hThread == NULL )
            {
                //printf("MyCreateRemoteThread() : CreateRemoteThread() 调用失败!错误代码: [%d]/n", GetLastError());
                return FALSE;
            }
        }
        if( WAIT_FAILED == WaitForSingleObject(hThread, INFINITE) )
        {
            //printf("MyCreateRemoteThread() : WaitForSingleObject() 调用失败!错误代码: [%d]/n", GetLastError());
            return FALSE;
        }
        return TRUE;
    }
    
    BOOL InjectDll(DWORD dwPID, char *szDllName)
    {
        HANDLE hProcess = NULL;
        LPVOID pRemoteBuf = NULL;
        FARPROC pThreadProc = NULL;
        char szAppPath[MAX_PATH]; 
        GetModuleFileName(NULL, szAppPath, MAX_PATH);
        (strrchr(szAppPath, '\'))[1] = 0;
        strcat(szAppPath,szDllName);
        DWORD dwBufSize = strlen(szAppPath)+1;
        if ( !(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)) )
        {
            //printf("[错误] OpenProcess(%d) 调用失败!错误代码: [%d]/n", dwPID, GetLastError());
            return FALSE;
        }
        pRemoteBuf = VirtualAllocEx(hProcess, NULL, dwBufSize, 
                                    MEM_COMMIT, PAGE_READWRITE);
        WriteProcessMemory(hProcess, pRemoteBuf, (LPVOID)szAppPath, 
                           dwBufSize, NULL);
        pThreadProc = GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");
        if( !MyCreateRemoteThread(hProcess, (LPTHREAD_START_ROUTINE)pThreadProc, pRemoteBuf) )
        {
            //printf("[错误] CreateRemoteThread() 调用失败!错误代码: [%d]/n", GetLastError());
            return FALSE;
        }
        VirtualFreeEx(hProcess, pRemoteBuf, 0, MEM_RELEASE);
        CloseHandle(hProcess);
        return TRUE;
    }
  • 相关阅读:
    redis缓存分页数据ID
    Kafka学习之(六)搭建kafka集群
    高并发下,php使用uniqid函数生成唯一标识符的四种方案(本博客也有雪花算法的方式,在【算法组】)
    Kafka学习之(五)搭建kafka集群之Zookeeper集群搭建
    Centos 更改系统时间
    Js删除字符串中的指定字符串
    Jquery 给Js动态新添加的元素 绑定的点击事件
    PHP 常用的header头部定义汇总
    来了解一下Ajax是什么?Ajax的原理?Ajax与传统Web比较?Ajax的优缺点?Ajax的Post与Get比较
    phpstorm常用快捷键(自备不全)
  • 原文地址:https://www.cnblogs.com/pugna/p/3724397.html
Copyright © 2011-2022 走看看