zoukankan      html  css  js  c++  java
  • (学习记录)代码注入之远程线程篇

    #include "stdafx.h"
    #include <windows.h>
    #include <tlhelp32.h>
    int Pid;
    int EnableDebugPriv(const char * name)
    {
        HANDLE hToken;
        TOKEN_PRIVILEGES tp;
        LUID luid;
        //打开进程令牌环
        OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken);
        //获得进程本地唯一ID
        LookupPrivilegeValueA(NULL, name, &luid) ;
         
        tp.PrivilegeCount = 1;
        tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
        tp.Privileges[0].Luid = luid;
        //调整权限
        AdjustTokenPrivileges(hToken, 0, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
        return 0;
    }
    
    //*****************************************************************************************************************************
    
    BOOL InjectDll(const char *DllFullPath, const DWORD dwRemoteProcessId)
    {
        HANDLE hRemoteProcess;
        EnableDebugPriv(SE_DEBUG_NAME);
        //打开远程线程
        hRemoteProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, dwRemoteProcessId );
    
        char *pszLibFileRemote;
    
        //使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名空间
        pszLibFileRemote = (char *) VirtualAllocEx( hRemoteProcess, NULL, lstrlenA(DllFullPath)+1, MEM_COMMIT, PAGE_READWRITE);
    
    
        //使用WriteProcessMemory函数将DLL的路径名写入到远程进程的内存空间
        WriteProcessMemory(hRemoteProcess, pszLibFileRemote, (void *) DllFullPath, lstrlenA(DllFullPath)+1, NULL);
    
    //##############################################################################
        //计算LoadLibraryA的入口地址
        PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)
                GetProcAddress(GetModuleHandle(TEXT("Kernel32")), "LoadLibraryA");
        //(关于GetModuleHandle函数和GetProcAddress函数)
    
        //启动远程线程LoadLibraryA,通过远程线程调用创建新的线程
        HANDLE hRemoteThread;
        if( (hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0, pfnStartAddr, pszLibFileRemote, 0, NULL) ) == NULL)
        {
           printf("注入线程失败!");
            return FALSE;
        }
        CloseHandle(hRemoteProcess);
        CloseHandle(hRemoteThread);
    
        return TRUE;
    }
    
    //*****************************************************************************************************************************
    
    DWORD GetProcessID(char *FileName)
    {
        HANDLE hProcess;
        PROCESSENTRY32 pe;
        BOOL bRet;
        hProcess=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        bRet=::Process32First(hProcess,&pe);
        while(bRet)
        {
            if (strcmp(pe.szExeFile,FileName) == 0)
            {
                Pid = pe.th32ProcessID;
                return Pid;
            }else
            {
                bRet = Process32Next(hProcess,&pe);
            }
        }
        return 0;
    }
    
    int main(int argc,char* argv[])
    {
        if (argc < 2)
        {
            printf("[-]:%s Injection_file_name
    ",argv[0]);
            return 0;
        }
        int id = GetProcessID(argv[1]);
        //printf("%s
    ",argv[1]);
        InjectDll("c:\programdata\test.dll", id) ;//这个数字是你想注入的进程的ID号
        return 0;
    }
  • 相关阅读:
    C++如何调用父类中的方法
    关于QStandardItemMode的资料
    Qt的信号和槽的使用方法练习
    Redirecting Standard I/O to Windows Console
    C++头文件的工作原理
    《深入浅出MFC》第七章 简单而完整:MFC骨干程序
    《深入浅出MFC》第六章 MFC程序的生死因果
    《深入浅出MFC》第五章 总观Application Framework
    《深入浅出MFC》第四章 Visual C++集成开发环境
    nexus使用记录
  • 原文地址:https://www.cnblogs.com/killbit/p/4221507.html
Copyright © 2011-2022 走看看