zoukankan      html  css  js  c++  java
  • 远程注入代码

    1.复制代码的编写原则:

    1.   不能有全局变量
    2.   不能使用常量字符串
    3.   不能使用系统调用
    4.   不能嵌套调用其他函数

     

      1 // 远程代码注入.cpp : 定义控制台应用程序的入口点。
      2 //
      3 
      4 #include "stdafx.h"
      5 #include <windows.h>
      6 //自己定义个结构体,方面后面参数使用
      7 /************************************************************************/
      8 /* 远程线程实现CreateFile                                                                     */
      9 /************************************************************************/
     10 typedef struct 
     11 {
     12 
     13     DWORD dwCreateAPIAddr;                //Createfile函数的地址
     14     LPCTSTR lpFileName;                    //下面都是CreateFile所需要用到的参数
     15     DWORD dwDesiredAccess;
     16     DWORD dwShareMode;
     17     LPSECURITY_ATTRIBUTES lpSecurityAttributes;
     18     DWORD dwCreationDisposition;
     19     DWORD dwFlagsAndAttributes;
     20     HANDLE hTemplateFile;
     21 }CREATEFILE_PARAM;
     22 
     23 //定义一个函数指针
     24 
     25 typedef HANDLE(WINAPI* PFN_CreateFile)
     26 (LPCTSTR lpFileName,
     27     DWORD dwDesiredAccess,
     28     DWORD dwShareMode,
     29     LPSECURITY_ATTRIBUTES lpSecurityAttributes,
     30     DWORD dwCreationDisposition,
     31     DWORD dwFlagsAndAttributes,
     32     HANDLE hTemplateFile);
     33 
     34 
     35 
     36 
     37 //编写要复制到目标进程的函数 2 
     38 DWORD _stdcall CreateFileThreadProc(LPVOID lparam)
     39 {
     40     CREATEFILE_PARAM* Gcreate = (CREATEFILE_PARAM*)lparam;
     41     PFN_CreateFile pfnCreateFile;
     42     pfnCreateFile =(PFN_CreateFile) Gcreate->dwCreateAPIAddr;
     43     //creatFile结构体全部参数 1
     44     pfnCreateFile(Gcreate->lpFileName, Gcreate->dwDesiredAccess, Gcreate->dwShareMode,
     45         Gcreate->lpSecurityAttributes, Gcreate->dwCreationDisposition, Gcreate->dwFlagsAndAttributes,
     46         Gcreate->hTemplateFile);
     47     
     48     return 0; 
     49 
     50 }
     51 
     52 //远程创建文件
     53 BOOL RemotCreateFile(DWORD dwProcessID, char* szFilePathName)
     54 {
     55     BOOL bRet;
     56     DWORD dwThread;
     57     HANDLE hProcess;
     58     HANDLE hThread;
     59     DWORD dwThreadFunSize;
     60     CREATEFILE_PARAM GCreateFile;
     61     LPVOID lpFilePathName;
     62     LPVOID lpRemotThreadAddr;
     63     LPVOID lpFileParamAddr;
     64     DWORD dwFunAddr;
     65     HMODULE hModule;
     66     
     67 
     68     bRet = 0;
     69     hProcess = 0;
     70     dwThreadFunSize = 0x400;
     71     //1.获取进程的句柄
     72     hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
     73     if (hProcess == NULL)
     74     {
     75         OutputDebugString("OpenProcessError!
    ");
     76         return FALSE;
     77     }
     78     //2.分配3段内存:存储参数,线程函数,文件名
     79 
     80     //2.1 用来存储文件名,//+1是要计算到结尾处
     81     lpFilePathName = VirtualAllocEx(hProcess, NULL, strlen(szFilePathName)+1, MEM_COMMIT, PAGE_READWRITE);//在指定的进程中分配内存
     82     
     83     //2.2 用来存储线程函数
     84     lpRemotThreadAddr = VirtualAllocEx(hProcess, NULL, dwThreadFunSize, MEM_COMMIT, PAGE_READWRITE);//在指定的进程中分配内存
     85 
     86     //2.3 用来存储文件参数
     87     lpFileParamAddr = VirtualAllocEx(hProcess, NULL, sizeof(CREATEFILE_PARAM), MEM_COMMIT, PAGE_READWRITE);//在指定的进程中分配内存
     88 
     89 
     90     //3. 初始化CreateFile参数
     91     GCreateFile.dwDesiredAccess = GENERIC_READ | GENERIC_WRITE;
     92     GCreateFile.dwShareMode = 0;
     93     GCreateFile.lpSecurityAttributes = NULL;
     94     GCreateFile.dwCreationDisposition = OPEN_ALWAYS;
     95     GCreateFile.dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL;
     96     GCreateFile.hTemplateFile = NULL;
     97     
     98     //4.获取CreateFile的地址
     99     /*因为每个进程中的LoadLibrary函数都在Kernel32,dll中,而且此dll的物理页是共享的,所以
    100     我们进程中获得的LoadLibrary地址和别的进程都是一样的*/
    101     hModule = GetModuleHandle("kernel32.dll");
    102     GCreateFile.dwCreateAPIAddr = (DWORD)GetProcAddress(hModule, "CreateFileA");
    103     FreeLibrary(hModule);
    104 
    105     //5.初始化CreatFile文件名
    106     GCreateFile.lpFileName = (LPCTSTR)lpFilePathName;
    107 
    108     //6.修改线程函数起始地址
    109     dwFunAddr = (DWORD)CreateFileThreadProc;
    110     
    111     //间接跳
    112     if (*((BYTE*)dwFunAddr) == 0xE9)
    113     {
    114         dwFunAddr = dwFunAddr + 5 + *(DWORD*)(dwFunAddr + 1);
    115     }
    116 
    117     //7.开始复制
    118     //7.1 拷贝文件名
    119     WriteProcessMemory(hProcess, lpFilePathName, szFilePathName, strlen(szFilePathName) + 1, 0);
    120 
    121     //7.2 拷贝线程函数
    122     WriteProcessMemory(hProcess, lpRemotThreadAddr, (LPVOID)dwFunAddr, dwThreadFunSize, 0);
    123 
    124     //7.3拷贝参数
    125     WriteProcessMemory(hProcess, lpFileParamAddr, &GCreateFile, sizeof(CREATEFILE_PARAM), 0);
    126 
    127 
    128     //8.创建远程线程
    129 
    130     hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpRemotThreadAddr, lpFileParamAddr, 0, &dwThread);//lpAllocAddr传给线程函数的参数.因为dll名字分配在内存中
    131     if (hThread == NULL)
    132     {
    133         OutputDebugString("CreateRemoteThread Error!
    ");
    134         CloseHandle(hProcess);
    135         CloseHandle(hModule);
    136         return FALSE;
    137     }
    138     //9.关闭资源
    139     CloseHandle(hProcess);
    140     CloseHandle(hThread);
    141     CloseHandle(hModule);
    142     return TRUE;
    143 
    144 }
    145 
    146 
    147 int main()
    148 {
    149     RemotCreateFile(PID, "文件名");150     return 0;
    151 }

    请勿转载,仅供学习使用!!!!!!

  • 相关阅读:
    整除15问题
    软件工程基础Proposal提议
    对在大学阶段软件工程实践的一些想法
    运行web项目端口占用问题
    Day_1
    error C3615: constexpr 函数 "QAlgorithmsPrivate::qt_builtin_ctz" 不会生成常数表达式
    Qt应用程序的打包
    将html代码部署到阿里云服务器,并进行域名解析,以及在部署过程中遇到的问题和解决方法
    linux部署html代码到linux服务器,并进行域名解析
    运行sudo apt-get install nginx时报错有几个软件包无法下载,要不运行 apt-get update 或者加上 --fix-missing 的选项再试试?解决
  • 原文地址:https://www.cnblogs.com/hanhandaren/p/11156120.html
Copyright © 2011-2022 走看看