简单的dll注入到指定进程

// 让指定的进程加载DLL 
//进程ID    动态库名称
BOOL LoadDll(DWORD dwProcessId, LPSTR lpszDllName)
{
    HANDLE	hProcess = NULL;
    HANDLE	hThread = NULL;
    PSTR	pszDllFile = NULL;
    // 打开进程
    hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
    if (hProcess == NULL)
    {
        printf("打开进程 %d 失败!\n\n", dwProcessId);
        return FALSE;
    }
    printf("打开进程 %d 成功!\n\n", dwProcessId);

    // 分配远程空间
    int cch = 1 + strlen(lpszDllName);
    pszDllFile = (PSTR)VirtualAllocEx(hProcess,
        NULL,
        cch,
        MEM_COMMIT,
        PAGE_READWRITE);
    if (pszDllFile == NULL)
        return FALSE;
    printf("分配远程空间成功!\n\n");

    // 把DLL的名字变量地址写入到远程空间中
    if ((WriteProcessMemory(hProcess,
        (PVOID)pszDllFile,
        (PVOID)lpszDllName,
        cch,
        NULL)) == FALSE)
    {
        return FALSE;
    }
    printf("写远程内存成功!\n\n");

    // 获取远程进程地址空间中LoadLibrary函数的地址
    PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleA("kernel32"), "LoadLibraryA");
    //因为在同一个系统中,这这LoadLibraryA地址是一样的,这下面这种都可行
    //PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)LoadLibraryA;
    if (pfnThreadRtn == NULL)
        return FALSE;
    printf("获取LoadLibrary函数地址成功!\n\n");

    // 创建远程线程
    hThread = CreateRemoteThread(hProcess,
        NULL,
        0,
        pfnThreadRtn,
        (PVOID)pszDllFile,
        0,
        NULL);
    if (hThread == NULL)
        return FALSE;
    printf("创建远程线程成功!\n\n");
    // 等待远程线程执行结束,并非必要
    //system("pause");
    WaitForSingleObject(hThread, INFINITE);

    VirtualFreeEx(hProcess, (PVOID)pszDllFile, 0, MEM_RELEASE);
    CloseHandle(hThread);
    CloseHandle(hProcess);

    return TRUE;
}


//将需要实现的代码写入dllmain中的DLL_PROCESS_ATTACH

备注:简单的动态库注入实现,只做学习参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值