Управляемый Dll Injection без C/C++ или сборки

Как внедрить управляемую dll в удаленный процесс с использованием VB/C# без использования начальной загрузки C/C++ dll или любой пещеры кода, написанной на ассемблере.

1 ответ

Dll Export требуется для экспорта функции как нативный код

Классический Механизм:

Ниже приведена процедура классической инъекции DLL:

  • Создать C/C++ Dll
  • Пишите Dll Path к удаленному процессу
  • Создайте удаленный поток в LoadLibraryA вместе с аргументом в виде пути Dll
  • Dll Entry point будет вызываться на этом этапе

Ссылка: код проекта статьи

Метод Codecave:

С помощью этого метода вы можете пропустить C/C++ Dll, но требует базовых знаний сборки

  • Создать код-пещеру во время выполнения в виде байтового массива и записать в другой процесс, или написать процедуру сборки (например, функцию) и скомпилировать ее как двоичный код, который загрузит сборку.net
  • Напиши свой код другому процессу
  • Создайте удаленный поток, и ваша сборка.net может быть загружена

Ссылка: код с примером[Срок действия исходной ссылки истек, поэтому кешированная версия Google]

Современный путь:

Этот метод очень прост в использовании и не требует знаний C / C++ или Assembly, ниже приведена процедура

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

Пример:

Вот твой длл код

Public Module Library

    <DllExport>
    Public Function Entry(Argument As String)
        MessageBox.Show("Injected With Argument: " + Argument)
        Return 0 'Success
    End Function

End Module

Вот пример кода внедрения, это всего лишь прототип, TODO: реализовать собственные функции и использовать их для методов расширения, используемых ниже

Public Module Program

    Public Sub Inject(Proc As Process, dll As String)
        Dim K32 = GetModuleHandle("kernel32")
        Dim LLA_Proc = GetProcAddress(K32, "LoadLibraryA")
        'TODO: extension method of process WriteMemory(Byte())
        Dim lns = Proc.WriteMemory(Encoding.ASCII.GetBytes("C:\FAKE-PATH\Inject.dll"))
        'TODO: extension method of process RemoteCallWait(IntPtr, Arg)
        Dim z = Proc.RemoteCallWait(LLA_Proc, lns)  'Calls method and waits for exit and returns exit code
        'Z should not be zero, otherwise injection is incomplete

        Dim XPTR = GetPtr("C:\FAKE-PATH\Inject.dll", "Entry")
        ''TODO: extension method of process WriteMemory(Byte())
        Dim Loc = Proc.WriteMemory(Encoding.Default.GetBytes("hello world"))
        'TODO: extension method of process RemoteCallWait(IntPtr, Arg)
        z = Proc.RemoteCallWait(XPTR, Loc)
        'Z should be 0 now
    End Sub

    Private Function GetPtr(LibraryName As String, FuncName As String) As IntPtr
        Return CULng(GetProcAddress(LoadLibrary(LibraryName), FuncName))
    End Function

End Module
Другие вопросы по тегам