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

    1.远程注入流程:

      在进程A中创建远程线程,将线程函数指向为LoadLibrary();

    具体实现步骤:

    1. 在进程A中分配空间,存储“A.DLL”
    2. 获取LoadLibrary函数的地址
    3. 创建远程线程,执行LoadLibrary();
      1 // 远程线程注入.cpp : 定义控制台应用程序的入口点。
      2 //
      3 
      4 
      5 #include "stdafx.h"
      6 #include <windows.h>
      7 
      8 /************************************************************************/
      9 /* 函数功能加载DLL
     10 参数:dwProcessID 要注入进程的ID
     11       szDllpathName加载的Dll路径*/
     12 /************************************************************************/
     13 
     14 BOOL LoadDll(DWORD dwProcessID, char *szDllpathName)
     15 {
     16     BOOL bRet;
     17     HANDLE hProcess;
     18     HANDLE hThread;
     19     DWORD dwLength;
     20     DWORD dwLoadAddr;
     21     LPVOID lpAllocAddr;
     22     DWORD dwThreadID;
     23     HMODULE hModule;
     24 
     25     bRet = 0;
     26     dwLoadAddr = 0;
     27     //1.获取进程的句柄
     28     hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
     29     if (hProcess == NULL)
     30     {
     31         OutputDebugString("OpenProcessError!
    ");
     32         return FALSE;
     33     }
     34     //2.计算DLL路径名字长度,并且要加上0结尾的长度
     35     dwLength = strlen(szDllpathName) + 1;
     36 
     37     //3.在目标进程分配内存
     38     lpAllocAddr = VirtualAllocEx(hProcess, NULL, dwLength, MEM_COMMIT, PAGE_READWRITE);//在指定的进程中分配内存
     39     if (lpAllocAddr == NULL)
     40     {
     41         OutputDebugString("VirtualAllocEx Error!
    ");
     42         CloseHandle(hProcess);
     43         return FALSE;
     44     }
     45 
     46     //4.拷贝DLL路径名字到目标进程的内存
     47     bRet = WriteProcessMemory(hProcess, lpAllocAddr, szDllpathName, dwLength, NULL);
     48     if (bRet == NULL)
     49     {
     50         OutputDebugString("WriteProcessMemory Error!
    ");
     51         CloseHandle(hProcess);
     52         return FALSE;
     53     }
     54 
     55     //5.获取模块地址
     56     /*因为每个进程中的LoadLibrary函数都在Kernel32,dll中,而且此dll的物理页是共享的,所以
     57     我们进程中获得的LoadLibrary地址和别的进程都是一样的*/
     58     hModule = GetModuleHandle("kernel32.dll");
     59     if (!hModule)
     60     {
     61         OutputDebugString("WriteProcessMemory Error!
    ");
     62         CloseHandle(hProcess);
     63         return FALSE;
     64     }
     65 
     66     //6.获取LoadLibraryA的 函数地址
     67     //GetProcAddress是一个计算机函数,功能是检索指定的动态链接库(DLL)中的输出库函数地址。lpProcName参数能够识别DLL中的函数。
     68     dwLoadAddr =(DWORD) GetProcAddress(hModule, "LoadLibraryA");
     69     if (!dwLoadAddr)
     70     {
     71         OutputDebugString("WriteProcessMemory Error!
    ");
     72         CloseHandle(hProcess);
     73         CloseHandle(hModule);
     74         return FALSE;
     75     }
     76 
     77     //7.创建远程线程,加载DLL
     78     hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)dwLoadAddr, lpAllocAddr, 0, NULL);//lpAllocAddr传给线程函数的参数.因为dll名字分配在内存中
     79     if (hThread == NULL)
     80     {
     81         OutputDebugString("CreateRemoteThread Error!
    ");
     82         CloseHandle(hProcess);
     83         CloseHandle(hModule);
     84         return FALSE;
     85     }
     86     //8.关闭资源
     87     CloseHandle(hProcess);
     88     CloseHandle(hThread);
     89     CloseHandle(hModule);
     90     return TRUE;
     91 }
     92 
     93 
     94 
     95 
     96 int main()
     97 {
     98     //LoadDll(进程ID,dll地址);
     99     return 0;
    100 }
  • 相关阅读:
    脚本(js)控制页面输入
    Javascript小技巧(6)
    解析 XML
    防止用户不输入正确用户名,密码登陆
    Javascript小技巧(5)
    自己想了一下为什么在ajax方法里找不到服务器控件
    Javascript小技巧(4)
    C#后台绑事件 和前台js方法
    Community Server专题九:MemberRole之Profile(转载)
    Community Server专题六:Delegates & Events(转载)
  • 原文地址:https://www.cnblogs.com/hanhandaren/p/11147457.html
Copyright © 2011-2022 走看看