dll注入-简单main

dll injection - simple main

本文关键字:main 简单 注入 dll      更新时间:2023-10-16

我正在字符串中将dll注入到.exe中,我编写了这个简单的main,但我的文件没有创建。我用cpp代码注入它,但我不认为注入器是问题所在。

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;
}

注射器代码:

#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似乎没有被注入,或者他不会写,我没有将注入器作为根启动

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

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

因此,您的Process32First/Next((迭代器太简单了,它会拾取它首先找到的Chrome.exe的任何实例。它很可能是一个沙盒实例,不会让你搞砸它。你只能注入用户启动的实例,只显示UI的实例。这通常是这种黑客攻击的有用性结束的地方,在这种情况下没有什么有趣的事情可以处理。