Anonymous
Как запустить функцию экспорта DLL, внедрив ее в удаленный процесс (копируя содержимое dll, а не путь)
Сообщение
Anonymous » 14 май 2024, 23:57
Я написал код DLL и инжектор (скопируйте путь к dll) для удаленного процесса, и все работает нормально. Сейчас попробую перепрошить инжектор. Я копирую содержимое dll в память целевого процесса вместо пути. Удаленный процесс завершается в CreateRemoteThread. В качестве начального адреса я передаю указатель = ddl_base_address + offset_to_my_function. Как я могу запустить функцию dll в удаленном процессе?
Инжектор:
Код: Выделить всё
int FullDllLoad(int processId)
{
DWORD dwBytesRead;
DWORD lastErr = GetLastError();
DWORD_PTR offset = GetFunctionOffset(DLL_PATH, MY_FUNC_NAME);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId);
HANDLE hFile = CreateFileW(DLL_PATH.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD dllFileLength = GetFileSize(hFile, NULL);
LPVOID baseAddress = VirtualAllocEx(hProcess, nullptr, dllFileLength, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
LPVOID lpBuffer = HeapAlloc(GetProcessHeap(), 0, dllFileLength);
ReadFile(hFile, lpBuffer, dllFileLength, &dwBytesRead, NULL);
BOOL isSucceeded = WriteProcessMemory(hProcess, baseAddress, lpBuffer, dllFileLength, NULL);
LPTHREAD_START_ROUTINE pRemoteFunc = (LPTHREAD_START_ROUTINE)((ULONG_PTR)baseAddress + offset);
// Remote process crushes here
HANDLE hThread = CreateRemoteThread(hProcess, nullptr, NULL, (LPTHREAD_START_ROUTINE)pRemoteFunc, baseAddress, NULL, nullptr);
WaitForSingleObject(hThread, INFINITE);
VirtualFreeEx(hProcess, baseAddress, 0, MEM_RELEASE);
CloseHandle(hThread);
CloseHandle(hProcess);
return 0;
}
DLL:
Код: Выделить всё
#include "pch.h"
#include
#include
#include
#include
#pragma comment(lib, "mscoree.lib")
using namespace std;
extern "C" __declspec(dllexport) HRESULT MyFunc(_In_ LPCTSTR lpCommand)
{
//...
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Можно ли вызвать MyFunc, используя метод, показанный на картинке?
Подробнее здесь:
https://stackoverflow.com/questions/784 ... ss-copying
1715720252
Anonymous
Я написал код DLL и инжектор (скопируйте путь к dll) для удаленного процесса, и все работает нормально. Сейчас попробую перепрошить инжектор. Я копирую содержимое dll в память целевого процесса вместо пути. Удаленный процесс завершается в CreateRemoteThread. В качестве начального адреса я передаю указатель = ddl_base_address + offset_to_my_function. Как я могу запустить функцию dll в удаленном процессе? Инжектор: [code]int FullDllLoad(int processId) { DWORD dwBytesRead; DWORD lastErr = GetLastError(); DWORD_PTR offset = GetFunctionOffset(DLL_PATH, MY_FUNC_NAME); HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId); HANDLE hFile = CreateFileW(DLL_PATH.c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); DWORD dllFileLength = GetFileSize(hFile, NULL); LPVOID baseAddress = VirtualAllocEx(hProcess, nullptr, dllFileLength, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); LPVOID lpBuffer = HeapAlloc(GetProcessHeap(), 0, dllFileLength); ReadFile(hFile, lpBuffer, dllFileLength, &dwBytesRead, NULL); BOOL isSucceeded = WriteProcessMemory(hProcess, baseAddress, lpBuffer, dllFileLength, NULL); LPTHREAD_START_ROUTINE pRemoteFunc = (LPTHREAD_START_ROUTINE)((ULONG_PTR)baseAddress + offset); // Remote process crushes here HANDLE hThread = CreateRemoteThread(hProcess, nullptr, NULL, (LPTHREAD_START_ROUTINE)pRemoteFunc, baseAddress, NULL, nullptr); WaitForSingleObject(hThread, INFINITE); VirtualFreeEx(hProcess, baseAddress, 0, MEM_RELEASE); CloseHandle(hThread); CloseHandle(hProcess); return 0; } [/code] DLL: [code]#include "pch.h" #include #include #include #include #pragma comment(lib, "mscoree.lib") using namespace std; extern "C" __declspec(dllexport) HRESULT MyFunc(_In_ LPCTSTR lpCommand) { //... } BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } [/code] [b]Можно ли вызвать MyFunc, используя метод, показанный на картинке?[/b] [img]https://i.sstatic.net/2Q1U2M6N.png[/img] Подробнее здесь: [url]https://stackoverflow.com/questions/78480340/how-to-run-a-dll-export-function-by-injecting-it-into-a-remote-process-copying[/url]