Есть инжектор на c#, он написан с помощью импортированных из c++ функций и EAT hook. Вообще нет идей почему это не работает. Ошибок не выдает, но и не инжектит. Идентичный инжектор на c++ использующий идентичные функции инжектит без проблем. Уже неделю ломаю голову. Предположение: у clr нет прав на такие действия или он не может их выполнить или в каких-то версиях .net framework это запретили или c# не способен на такие действия даже используя импортированные функции(что скорее всего бред т.к. я успешно читал и писал в память используя импортированные функции из C++).
Вот код инжектора:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using static injEctHelper.imports;
using injEctHelper;
using System.ComponentModel;
namespace injEctHelper
{
class injector
{
// privileges
const int PROCESS_CREATE_THREAD = 0x0002;
const int PROCESS_QUERY_INFORMATION = 0x0400;
const int PROCESS_VM_OPERATION = 0x0008;
const int PROCESS_VM_WRITE = 0x0020;
const int PROCESS_VM_READ = 0x0010;
public Process proc;
public IntPtr pHandle;
public IntPtr Libaddr;
// used for memory allocation
const uint MEM_COMMIT = 0x00001000;
const uint MEM_RESERVE = 0x00002000;
const uint PAGE_READWRITE = 4;
public injector(string proc_name)
{
proc = Process.GetProcessesByName(proc_name)[0];
Console.WriteLine("pId: " + proc.Id);
pHandle = OpenProcess(ProcessAccessFlags.PROCESS_ALL_ACCESS, false, (uint)proc.Id);
Console.WriteLine("Proc handle: " + pHandle.ToString());
int ErrorCode;
IntPtr? libaddr = GetProcessProcAddress(pHandle, (uint)proc.Id,
"Kernel32.dll", "LoadLibraryA",out ErrorCode);
Libaddr = (IntPtr)libaddr;
}
public void Injector(string dll)
{
try
{
IntPtr allocMem = VirtualAllocEx(pHandle, IntPtr.Zero, (uint)(dll.Length + 1), AllocationType.MEM_COMMIT, MemoryProtection.PAGE_READWRITE);
IntPtr bytesWritten;
WriteProcessMemory(pHandle, allocMem, Encoding.ASCII.GetBytes(dll), dll.Length + 1, out bytesWritten);
IntPtr bytete;
IntPtr success = CreateRemoteThread(pHandle, IntPtr.Zero, 0, Libaddr, allocMem, 0, out bytete);
if (success == IntPtr.Zero)
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
}
catch
{
throw new Win32Exception(Marshal.GetLastWin32Error());
}
}
}
}
И чтоб не нагружать пост вот код EAT hook(это на самом деле слегка переписанная функция GetProcAdress с оригинальной функцией кстати тоже пробовал, но и там результат не утешительный) https://pastebin.com/3VYkY4bZ
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости