Вызов функции из внедренной DLL - PullRequest
2 голосов
/ 02 ноября 2010


Прежде всего, я хотел бы сказать, что я не пытаюсь взломать игру.Я на самом деле работаю в компании, процесс которой я пытаюсь внедрить.:)
Я хотел бы знать, как вызвать функцию из уже внедренной DLL.
Итак, я успешно внедрил и загрузил свою DLL в целевой объект с помощью CreateRemoteThread ().Ниже вы можете увидеть фрагмент инъекции:

private static bool Inject(Process pToBeInjected, string sDllPath,out string sError, out IntPtr hwnd, out IntPtr hLibModule)
    { 
        IntPtr zeroPtr = (IntPtr)0;
        hLibModule = zeroPtr;

        IntPtr hProcess = NativeUtils.OpenProcess(
            (0x2 | 0x8 | 0x10 | 0x20 | 0x400), //create thread, query info, operation ,write, and read 
            1,
            (uint)pToBeInjected.Id);

        hwnd = hProcess;
        IntPtr loadLibH = NativeUtils.GetProcAddress( NativeUtils.GetModuleHandle("kernel32.dll"),"LoadLibraryA");

        IntPtr dllAddress = NativeUtils.VirtualAllocEx(
            hProcess,
            (IntPtr)null,
            (IntPtr)sDllPath.Length, //520 bytes should be enough 
            (uint)NativeUtils.AllocationType.Commit |
            (uint)NativeUtils.AllocationType.Reserve,
            (uint)NativeUtils.MemoryProtection.ExecuteReadWrite);

    byte[] bytes = CalcBytes(sDllPath);
        IntPtr ipTmp = IntPtr.Zero;

        NativeUtils.WriteProcessMemory(
            hProcess,
            dllAddress,
            bytes,
            (uint)bytes.Length,
            out ipTmp);


        IntPtr hThread = NativeUtils.CreateRemoteThread(
            hProcess,
            (IntPtr)null,
            (IntPtr)0,
            loadLibH, //handle to LoabLibrary function
            dllAddress,//Address of the dll in remote process
            0,
            (IntPtr)null);

        uint retV= NativeUtils.WaitForSingleObject(hThread, NativeUtils.INFINITE_WAIT);
        bool exitR = NativeUtils.GetExitCodeThread(hThread, out hLibModule);
        return true;
    }

Примечание: проверка ошибок и освобождение ресурсов были удалены для краткости, но будьте уверены, я проверяю все указатели и освобождаю свои ресурсы.
После функциивыше, у меня есть ненулевой дескриптор модуля к моей DLL, возвращенный LoadLibrary через hLibModule, что означает, что DLL была загружена правильно.
Моя DLL - это библиотека классов C #, предназначенная для отображения окна сообщения (для тестирования),Я попытался протестировать функцию и всплывающее окно с сообщением.Это выглядит так:

 public class Class1
    {
        public static void ThreadFunc(IntPtr param ) 
        {       
        IntPtr libPtr = LoadLibrary("user32.dll");

            MessageBox(IntPtr.Zero, "I'm ALIVE!!!!", "InjectedDll", 0);

        }
        [DllImport("kernel32", SetLastError = true)]
        public static extern IntPtr LoadLibrary(string lpFileName);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern int MessageBox(IntPtr hWnd, String text, String caption, int options);

} 

Я компилирую его из Visual Studio, и DLL появляется в папке Debug.Затем я передаю полный путь моей DLL к инжектору.
После внедрения в целевой процесс я не знаю, как вызвать мой ThreadFunc из внедренной DLL, поэтому он никогда не выполняется.
Я не могуиспользуйте GetProcAddress(hLibModule,"ThreadFunc"), поскольку я вне процесса, поэтому ответ должен лежать в том, чтобы как-то вызвать CreateRemoteThread ().Кроме того, я прочитал, что DllMain больше не разрешен для DLL-библиотек .NET, поэтому я также не могу получить бесплатное выполнение таким способом.
Кто-нибудь знает, как вызвать функцию из внедренной DLL?
Спасибозаблаговременно.

1 Ответ

2 голосов
/ 02 ноября 2010

Ну, у вас уже есть поток, работающий внутри этого процесса.Вы заставляете это делать что-то скучное, он загружает только DLL.Это работает совершенно случайно, LoadLibrary просто приходится исправлять сигнатуру функции.

Это может сделать намного больше.Однако лучше, чтобы это был неуправляемый код, так же как и LoadLibrary (), вы не можете рассчитывать на любой управляемый код, работающий должным образом.Это занимает много работы, вам нужно загрузить и инициализировать CLR и сказать ему загрузить и выполнить сборку, которую вы хотите запустить.И нет, вы не можете загрузить CLR в DllMain ().

Ключевые слова для поиска: CorBindToRuntimeEx () и ICLRRuntimeHost :: ExecuteInAppDomain ().Это мелкие вещи, чтобы начать, но я видел, как это было сделано.Требуются навыки COM и C ++ и щедрая помощь на удачу.

...