Есть инжектор на 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
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Собрал библиотеки из фреймворка для тестирования GoogleMock gmocklib, подключил к проекту, но при сборке получаю ошибку:
В стандарте IEEE754 дробные числа представляются следующим образом:
Существует у меня функция, которая создает логКак бы я не крутился - файл создается в папке, где запустили программу
Почему центр фигуры смещается в сторону при увеличении значения радиуса?