Injector на C#

Сообщения
262
Реакции
213
Всем привет, сегодня я расскажу как создать Injector dll на C#.
Что нам нужно:

1. Компилятор кода, я использую MVS 2008.
2. Мозг, прямые руки, точные действия по гайду.
И так, поехали...

1. Создаём проэкт, версия .net framework не важна, кидаем на форму:
2 лабела, 1 текст бокс с ReadOnly = true, 2 баттона, 1 комбо бокс, 1 OpenFileDialog.

2. На кнопку "...", для выбора dll, ставим код:
Код:
openFileDialog1.Filter = "DLL (*.dll)|*.dll" +
"|All files (*.*)|*.*";
           if (openFileDialog1.ShowDialog() == DialogResult.OK)
           {
               textBox1.Text = openFileDialog1.FileName; //Придаём значение ТекстБокс1 значение пути нашего пути к dll
           }
3. Теперь заменяем все используемые Referenc-ы на эти:

Код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Threading;
4. После

Код:
public ИмяВашейФормы()
       {
           InitializeComponent();
       }
Ставим код:
Код:
[DllImport("kernel32")]
       public static extern IntPtr CreateRemoteThread(
         IntPtr hProcess,
         IntPtr lpThreadAttributes,
         uint dwStackSize,
         UIntPtr lpStartAddress,
         IntPtr lpParameter,
         uint dwCreationFlags,
         out IntPtr lpThreadId
       );

       [DllImport("kernel32.dll")]
       public static extern IntPtr OpenProcess(
           UInt32 dwDesiredAccess,
           Int32 bInheritHandle,
           Int32 dwProcessId
           );

       [DllImport("kernel32.dll")]
       public static extern Int32 CloseHandle(
       IntPtr hObject
       );

       [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
       static extern bool VirtualFreeEx(
           IntPtr hProcess,
           IntPtr lpAddress,
           UIntPtr dwSize,
           uint dwFreeType
           );

       [DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true)]
       public static extern UIntPtr GetProcAddress(
           IntPtr hModule,
           string procName
           );

       [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
       static extern IntPtr VirtualAllocEx(
           IntPtr hProcess,
           IntPtr lpAddress,
           uint dwSize,
           uint flAllocationType,
           uint flProtect
           );

       [DllImport("kernel32.dll")]
       static extern bool WriteProcessMemory(
           IntPtr hProcess,
           IntPtr lpBaseAddress,
           string lpBuffer,
           UIntPtr nSize,
           out IntPtr lpNumberOfBytesWritten
       );

       [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
       public static extern IntPtr GetModuleHandle(
           string lpModuleName
           );

       [DllImport("kernel32", SetLastError = true, ExactSpelling = true)]
       internal static extern Int32 WaitForSingleObject(
           IntPtr handle,
           Int32 milliseconds
           );

       public Int32 GetProcessId(String proc)
       {
           Process[] ProcList;
           ProcList = Process.GetProcessesByName(proc);
           return ProcList[0].Id;
       }
Сразу после этого кода ставим этот:
Код:
public void InjectDLL(IntPtr hProcess, String strDLLName)
       {
           IntPtr bytesout;
           Int32 LenWrite = strDLLName.Length + 1;
           IntPtr AllocMem = (IntPtr)VirtualAllocEx(hProcess, (IntPtr)null, (uint)LenWrite, 0x1000, 0x40);
           WriteProcessMemory(hProcess, AllocMem, strDLLName, (UIntPtr)LenWrite, out bytesout);
           UIntPtr Injector = (UIntPtr)GetProcAddress( GetModuleHandle("kernel32.dll"), "LoadLibraryA");
           
           if (Injector == null)
           {
               MessageBox.Show(" Injecto Error! \n ");
               return;
           }
           IntPtr hThread = (IntPtr)CreateRemoteThread(hProcess, (IntPtr)null, 0, Injector, AllocMem, 0, out bytesout);
           if ( hThread == null )
           {
               MessageBox.Show("Thread injection Failed");
               return;
           }
           int Result = WaitForSingleObject(hThread, 10 * 1000);
           if (Result == 0x00000080L || Result == 0x00000102L || Result == 0xFFFFFFFF)
           {
               MessageBox.Show("Thread 2 inject failed");
               if (hThread != null)
               {
                   CloseHandle(hThread);
               }
               return;
           }
           Thread.Sleep(1000);
           VirtualFreeEx(hProcess, AllocMem, (UIntPtr)0, 0x8000);
           if (hThread != null)
           {
               CloseHandle(hThread);
           }
           return;
       }
4. Теперь на эвент "Click" comboBox1

Поставим код:
Код:
comboBox1.Items.Clear();
           foreach (Process clsProcess in Process.GetProcesses())
           {
               comboBox1.Items.Add(clsProcess.ProcessName);
           }
5. На буттон "Inject", ставим код:
Код:
String strDLLName = textBox1.Text;
           String strProcessName = comboBox1.SelectedItem.ToString();
           
           Int32 ProcID = GetProcessId(strProcessName);
           if (ProcID >= 0)
           {
               IntPtr hProcess = (IntPtr)OpenProcess(0x1F0FFF, 1,ProcID);
               if (hProcess == null)
               {
                   MessageBox.Show("FAIL");
                   return;
               }
               else
               {
                   InjectDLL(hProcess, strDLLName);
                   MessageBox.Show("TRUE");
               }
           }
 
kaspersky keys
Верх