C# инжектор не инжектит dll на c++

229
14 января 2018, 05:24

Есть инжектор на 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

READ ALSO
GoogleMock: ошибка MTd_StaticDebug при сборке проекта

GoogleMock: ошибка MTd_StaticDebug при сборке проекта

Собрал библиотеки из фреймворка для тестирования GoogleMock gmocklib, подключил к проекту, но при сборке получаю ошибку:

270
Перевод дробного числа в IEEE754

Перевод дробного числа в IEEE754

В стандарте IEEE754 дробные числа представляются следующим образом:

257
Как запустить программу в другой папке? - C++

Как запустить программу в другой папке? - C++

Существует у меня функция, которая создает логКак бы я не крутился - файл создается в папке, где запустили программу

217
Центр фигуры смещается в сторону при увеличении

Центр фигуры смещается в сторону при увеличении

Почему центр фигуры смещается в сторону при увеличении значения радиуса?

187