加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – DLL注入记事本

发布时间:2020-12-16 07:21:46 所属栏目:百科 来源:网络整理
导读:我想在记事本中出现一个消息框,所以我找到了一个简单的dll注入示例.注入器本身不是我的,似乎工作正常(获取进程的id,创建一个远程线程,获取dll文件的绝对路径).我认为,问题在于dll的实现.这些项目在没有任何警告的情况下编译,但未达到预期的结果.你能看看并帮
我想在记事本中出现一个消息框,所以我找到了一个简单的dll注入示例.注入器本身不是我的,似乎工作正常(获取进程的id,创建一个远程线程,获取dll文件的绝对路径).我认为,问题在于dll的实现.这些项目在没有任何警告的情况下编译,但未达到预期的结果.你能看看并帮助我理解这个问题吗? (我已将dll的发布版本放在注入器项目文件夹中)

dllmain.cpp:

// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"

#include "dll.h"
#include <windows.h>

#include <stdio.h>
#include <stdlib.h>

DLLEXPORT void mess() {
    MessageBoxA(NULL,"HELLO THERE","From Notepad",NULL);
}
BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
{
    case DLL_PROCESS_ATTACH: mess(); break;
    case DLL_THREAD_ATTACH: mess(); break;
    case DLL_THREAD_DETACH: mess(); break;
    case DLL_PROCESS_DETACH: mess(); break;
}
return TRUE;
}

dll.h:

#ifndef _DLL_H_
#define _DLL_H_

# define DLLEXPORT __declspec (dllexport)

# define DLLIMPORT __declspec (dllimport)

DLLEXPORT void mess(void);
#endif

和inject.cpp作为参考,它包含一个找到所需进程id的函数,一个创建远程线程的函数和一个main:

#include "stdafx.h"
#include <windows.h> 
#include <tlhelp32.h> 
#include <shlwapi.h> 
#include <conio.h> 
#include <stdio.h>
#include <iostream>
using namespace std;
#define WIN32_LEAN_AND_MEAN 
#define CREATE_THREAD_ACCESS (PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ)
DWORD GetProcessId(IN PCHAR szExeName)

{
    DWORD dwRet = 0;
    DWORD dwCount = 0;

    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

    if (hSnapshot != INVALID_HANDLE_VALUE)
    {
        PROCESSENTRY32 pe = { 0 };
        pe.dwSize = sizeof(PROCESSENTRY32);

        BOOL bRet = Process32First(hSnapshot,&pe);

        while (bRet)
        {
            if (!strcmp( szExeName,pe.szExeFile))
            {
                dwCount++;
                dwRet = pe.th32ProcessID;
            }
            bRet = Process32Next(hSnapshot,&pe);
        }

        if (dwCount > 1)
            dwRet = 0xFFFFFFFF;

        CloseHandle(hSnapshot);
    }

    return dwRet;
}

BOOL CreateRemoteThreadInject(DWORD ID,const char * dll)
{
    HANDLE Process;

    LPVOID Memory;

    LPVOID LoadLibrary;

    if (!ID) return false;

    Process = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_VM_OPERATION,FALSE,ID);

    LoadLibrary = (LPVOID)GetProcAddress(GetModuleHandle("kernel32.dll"),"LoadLibraryA");

    Memory = (LPVOID)VirtualAllocEx(Process,NULL,strlen(dll) + 1,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE);

    WriteProcessMemory(Process,(LPVOID)Memory,dll,NULL);

    CreateRemoteThread(Process,(LPTHREAD_START_ROUTINE)LoadLibrary,NULL);

    CloseHandle(Process);

    VirtualFreeEx(Process,MEM_RELEASE);

    return true;
}

int main()
{
    char dll[MAX_PATH] ;

    GetFullPathName("testdll.dll",MAX_PATH,NULL);

    DWORD ID = GetProcessId("notepad.exe");

    if (!CreateRemoteThreadInject(ID,dll)) cout<<"failure";

    else cout << "success";

    return 0;
}

谢谢.

解决方法

小心x64 x86二进制文件

在Windows 7/8/10上,notepad.exe是一个64位进程,所以你需要编译你的DLL& x64中的喷油器

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读