简单DLL注入

简单的dll注入:DLL注入就是将一个DLL放进某个进程的地址空间里,让它成为那个进程的一部分

dll注入的步骤:

  1. 附加目标进程
  2. 在目标进程中申请一个空间
  3. 把dll的路径写入到目标进程的内存空间
  4. 创建一个远程线程,让目标进程调用句柄
  5. 释放空间

 

注入dll的代码:

复制代码
#include "stdlib.h"
#include <tchar.h>
#include <Windows.h>
#include <direct.h>

//注入dll函数的实现
bool Inject(DWORD dwId, //目标进程PID
    WCHAR *szPath)//DLL路径
{
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,//获取进程权限
                                FALSE,//表示所得的进程是否可以被继承
                                dwId);//被打开进程的PID
    
    //执行成功分配内存单元的首地址,不成功就为NULL
    LPVOID pRemoteAddress = VirtualAllocEx(hProcess,//目标句柄
                                            NULL,//保留页面的内存地址,一般NULL自动分配
                                            1,//预分配的内存大小,字节单位
                                            MEM_COMMIT,//为特定的页面区域分配内存中或磁盘的页面文件中的物理存储
                                            PAGE_READWRITE);//区域可被应用程序读写
    


    DWORD dwWriteSize = 0;
    WriteProcessMemory(hProcess,//OpenProcess返回来的句柄
                        pRemoteAddress, //准备写入的内存地址
                        szPath, wcslen(szPath)*2+2, //要写入的字节数
                        &dwWriteSize);    //返回值,返回写入的字节


    HANDLE hThread = CreateRemoteThread(hProcess, //该远程线程属进程的句柄
                                        NULL, //一个指向SECURITY_ATTRIBUTES结构体的指针,该结构体指定线程的安全属性
                                        0, //线程栈初始化大小,如果为0,那么使用系统默认的大小
                                        (LPTHREAD_START_ROUTINE)LoadLibrary, //在远程进程地址空间中,该线程的起始位置
                                        pRemoteAddress, //传给线程函数的参数(刚才在内存中写入的东西)
                                        NULL, //控制线程创建标志,NULL表示线程正在运行
                                        NULL);//指向接收线程标识符的变量指针,如果为NULL,则不返回标识符
                                        //返回线程句柄

    WaitForSingleObject(hThread, -1);//当句柄所指定的线程有信号的时候,才会返回
    VirtualFreeEx(hProcess,//目标进程句柄
        pRemoteAddress,//只想要释放的空间
        1, //虚拟内存空间的字节数
        MEM_COMMIT);//MEM_COMMIT仅标示内存空间不可用
    return 0;
}

int _tmain(int argc, _TCHAR *argv[])
{
    wchar_t szPath[] = L"D:\\myhack.dll"; //要注入的dll
    
    DWORD dwId = 0;
    HWND hCalc = FindWindow(NULL,L"QQ");
   if(hCalc == NULL)
    {
        MessageBox(NULL,L"获取窗口句柄失败!",L"提示",MB_OK);
    }


    DWORD dwPid = 0;

    DWORD dwRub = GetWindowThreadProcessId(hCalc, &dwPid);
    if(dwPid == NULL)
    {
        MessageBox(NULL,L"获取目标进程pid失败!",L"提示",MB_OK);
    }

    Inject(dwPid, szPath);  //注入dll函数
    //system("pause");
    return 0;
}
View Code
复制代码

 

基本dll编写代码:

复制代码
#include <Windows.h>

BOOL APIENTRY DllMain(HMODULE hModule,
                      DWORD ul_reason_for_call,  //调用DllMain时赋值为DLL_PROCESS_ATTACH
                      LPVOID lpReservd)
{
    switch(ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:  
            MessageBoxA(NULL,"hello word!","你好呀!",MB_OK|MB_TOPMOST);
            break;
    }
    return TRUE;
}
View Code
复制代码

 

posted @   菜鸡拾光  阅读(193)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示