c++ - dll 注入(inject) - 简单的主要

标签 c++ winapi dll

我正在尝试将一个 dll 注入(inject)一个 .exe,我编写了这个简单的主程序,但我的文件没有创建。 我用 cpp 代码注入(inject)它,但我认为注入(inject)器不是问题所在。

DWORD WINAPI Main_thread( LPVOID lpParam)
{
  std::ofstream myfile;
  myfile.open ("C:\\Users\\root\\Desktop\\example.txt");
  myfile << "success" << std::endl;
  myfile.close();
  return S_OK;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  _reason, LPVOID lpReserved)
{
  if (_reason == DLL_PROCESS_ATTACH)
     CreateThread(0, 0x1000, &Main_thread, 0, 0, NULL);
  return true;
}

注入(inject)器代码:

#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>

using namespace std;
bool InjectDLL(DWORD ProcessID);

char dllPath[250] = "C:\\Users\\root\\Desktop\\testdll\\bin\\Debug\\testdll.dll";
char ProcessName[] = "chrome.exe";
typedef HINSTANCE (*fpLoadLibrary)(char*);

int main()
{
DWORD processId = NULL;
PROCESSENTRY32 pe32 = {sizeof(PROCESSENTRY32)};
HANDLE hProcSnap;
hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(Process32First(hProcSnap, &pe32))
{
    do{
         if(!strcmp(pe32.szExeFile, ProcessName))
        {
            processId = pe32.th32ProcessID;
            break;
        }
    }while(Process32Next(hProcSnap, &pe32));
}
if (!InjectDLL(processId))
        cout << "DLL failed to inject" << endl;
}

bool InjectDLL(DWORD ProcessID)
{
HANDLE hProc;
LPVOID paramAddr;
HINSTANCE hDll = LoadLibrary("KERNEL32");
fpLoadLibrary LoadLibraryAddr = (fpLoadLibrary)GetProcAddress(hDll, "LoadLibraryA");
hProc = OpenProcess (PROCESS_ALL_ACCESS, false, ProcessID);
paramAddr = VirtualAllocEx(hProc, 0, strlen(dllPath)+1, MEM_COMMIT, PAGE_READWRITE);
bool memoryWritten = WriteProcessMemory(hProc, paramAddr, dllPath, strlen(dllPath)+1, NULL);
CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)LoadLibraryAddr, paramAddr, 0, 0);
CloseHandle(hProc);
return memoryWritten;
}

dll好像没有注入(inject)或者写不出来, 我没有以 root 身份启动注入(inject)器

最佳答案

您可以从任务管理器诊断您的问题,添加 PID 列。或者使用 SysInternals 的 Process Explorer。您会看到 Chrome.exe 启动了许多它自己的实例。主要的只显示 UI,不参与浏览网页。您会看到其他的,一个对应您在浏览器中打开的每个选项卡。

那些其他实例很特殊,它们在沙箱 中运行加载项和脚本代码。旨在使 Chrome 对可能导致浏览器崩溃或挂起的网页或脚本具有弹性。但特别是在删除所有权限的运行时环境中运行代码,这样它就不会弄乱用户的机器。就像您尝试编写的那种代码。

所以你的 Process32First/Next() 迭代器太简单了,它会选择它首先找到的任何 Chrome.exe 实例。它很可能是一个沙盒,不会让你弄乱它的那种。您只能注入(inject)用户启动的实例,即只显示 UI 的实例。这通常是这种黑客攻击的用处所在,在这种情况下没有什么有趣的事情可以搞砸。

关于c++ - dll 注入(inject) - 简单的主要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15053418/

相关文章:

C++ 是否必须在构造函数中初始化公共(public)实例成员变量?

c++ - ISampleGrabberFilter 一次一帧

windows - SW_MAXIMIZED 和无法最大化的应用

c++ - 是否可以编写 C++ .dll 库来导出在命名空间和类中编写的方法?

c++ - 我可以在 C 程序中使用 C++ 模板库吗?

c++ - 使用 MPI 进行 Clang 静态分析

visual-studio-2010 - 如何编译使用 boost 库的 DLL?

c# - Windows 64 位地址空间

c++ - 显示占用 8 个字节的 int

c++ - 使用 OpenGL 渲染到 Win32 窗口的一部分