简单DLL注入

时间:2022-03-21
本文章向大家介绍简单DLL注入,主要包括简单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

原文地址:https://www.cnblogs.com/flagby/p/16037156.html