Управляемый 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