I've been revisiting my old codes and projects, and here's what I've managed to put together for a mini dll Injector for testing purposes.
Download = Tool

Source Code , Debug in Visual Studio
PHP Code:
Option Strict On
Option Explicit On
Imports System.Runtime.InteropServices
Public Class Form1
Const MEM_COMMIT As Integer = &H1000
Const PAGE_READWRITE As Integer = &H4
Const PROCESS_CREATE_THREAD As Integer = &H2
Const PROCESS_VM_OPERATION As Integer = &H8
Const PROCESS_VM_READ As Integer = &H10
Const PROCESS_VM_WRITE As Integer = &H20
<DllImport("kernel32.dll", SetLastError:=True, CallingConvention:=CallingConvention.Winapi)> _
Public Shared Function OpenProcess(ByVal dwDesiredAccess As UInteger, <MarshalAs(UnmanagedType.Bool)> _
ByVal bInheritHandle As Boolean, ByVal dwProcessId As Integer) As System.IntPtr
End Function
<DllImport("kernel32.dll", SetLastError:=True, CallingConvention:=CallingConvention.Winapi)> _
Public Shared Function WriteProcessMemory(ByVal hProcess As System.IntPtr, ByVal lpBaseAddress As System.IntPtr, _
ByVal lpBuffer As String, ByVal nSize As Int32, <Out()> ByRef lpNumberOfBytesWritten As Int32) As _
<MarshalAs(UnmanagedType.Bool)> Boolean
End Function
<DllImport("kernel32.dll", SetLastError:=True, CallingConvention:=CallingConvention.Winapi)> _
Public Shared Function VirtualAllocEx(ByVal hProcess As IntPtr, ByVal lpAddress As IntPtr, _
ByVal dwSize As Integer, ByVal flAllocationType As UInteger, _
ByVal flProtect As UInteger) As IntPtr
End Function
<DllImport("kernel32.dll", SetLastError:=True, CallingConvention:=CallingConvention.Winapi)> _
Public Shared Function GetModuleHandle(ByVal lpModuleName As String) As IntPtr
End Function
<DllImport("kernel32.dll", SetLastError:=True, CallingConvention:=CallingConvention.Winapi)> _
Public Shared Function GetProcAddress(ByVal hModule As IntPtr, ByVal lpProcName As String) As IntPtr
End Function
<DllImport("kernel32.dll", SetLastError:=True, CallingConvention:=CallingConvention.Winapi)> _
Public Shared Function CreateRemoteThread(ByVal hProcess As IntPtr, ByVal lpThreadAttributes As Integer, _
ByVal dwStackSize As UInteger, ByVal lpStartAddress As IntPtr, ByVal lpParameter As IntPtr, _
ByVal dwCreationFlags As UInteger, ByRef lpThreadId As IntPtr) As IntPtr
End Function
<DllImport("kernel32.dll", SetLastError:=True, CharSet:=CharSet.Unicode, EntryPoint:="LoadLibraryA")> _
Public Shared Function LoadLibrary(ByVal lpFileName As String) As IntPtr
End Function
Friend WithEvents OZ As New Timer
Const TargetName As String = "WarRock"
Dim ExeName As String = IO.Path.GetFileNameWithoutExtension(Application.Ex ecutablePath)
Private Sub InnjectionMethods_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.TopMost = True
OZ.Interval = 25
If IO.File.Exists(Application.StartupPath & "\" + ExeName + ".dll") Then
Me.Label1.Text = "...Warten auf WarRock.exe"
OZ.Start()
Else
Me.Label1.Text = ">" + ExeName
Me.Label2.Text = ".dll Nicht Gefunden !"
End If
End Sub
Private Sub OZs(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OZ.Tick
Dim Target As Process() = Process.GetProcessesByName(TargetName)
If Target.Length <> 0 Then
Me.Label2.Text = ">WarRock Is Running"
OZ.Stop()
InjectToProcess()
End If
End Sub
Sub InjectToProcess()
Dim ExeName As String = IO.Path.GetFileNameWithoutExtension(Application.Ex ecutablePath)
Dim Target As Process() = Process.GetProcessesByName(TargetName)
Dim pHandle As IntPtr = OpenProcess(PROCESS_CREATE_THREAD Or PROCESS_VM_OPERATION Or PROCESS_VM_WRITE, False, Target(0).Id)
If (pHandle = IntPtr.Zero) Then
Label2.Text = "<Failed To Open Processs!"
Else
Dim pszLibFileRemote As String = Application.StartupPath & "\" + ExeName + ".dll"
Dim pfnStartAddr As IntPtr = GetProcAddress(GetModuleHandle("Kernel32"), "LoadLibraryA")
Dim TargetBufferSize As Integer = Int(1 + Len(pszLibFileRemote))
Dim LoadLibParamAdr As IntPtr = VirtualAllocEx(pHandle, IntPtr.Zero, TargetBufferSize, MEM_COMMIT, PAGE_READWRITE)
If (LoadLibParamAdr = IntPtr.Zero) Then
Label2.Text = "<Failed To Allocate Memory!"
Else
Dim Rtn As Boolean = WriteProcessMemory(pHandle, LoadLibParamAdr, pszLibFileRemote, TargetBufferSize, 0)
If Rtn = False Then
Label2.Text = "<Failed To Write Memory!"
Else
Dim lpThreadId As IntPtr
CreateRemoteThread(pHandle, 0, 0, pfnStartAddr, LoadLibParamAdr, 0, lpThreadId)
If (lpThreadId = IntPtr.Zero) Then
Label2.Text = "<Failed To Create Thread!"
Else
Label2.Text = "<Dll Injected Succefully!"
End If
Me.Close()
End If
End If
End If
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Me.BackColor = Color.Red
Me.TransparencyKey = Me.BackColor
Me.Hide()
End Sub
End Class






