PDA

Просмотр полной версии : [Статья] Инжектор Dll(C# + C++)


крайслер
21.08.2013, 22:32
Знаю что тем по Инжекторы куча, но они в своем роде однотипные. Предлагаю вариант совместного использования C#(оболочка) и С++(модуль dll)....

C#(оболочка программы)

Проект WInForm:

Добавляем:

using System.Runtime.InteropServices;
using System.Management;
using System.IO;
Так же нужно включить ссылку System.Management: ПКМ по проекту - Добавить ссылку - NET и ищем в списке System.Management - OK.

Понадобится:
- listView
- contextMenuStrip
- openFileDialog

Размещаем на форме listView и настраиваем:
- FullRowSelect = true (выделятся будет вся строка, а не одна ячейка)
- GridLines = true (разделение линиями)
- View = Details
- заходим в коллекцию Сolumns и добавляем два зоголовка: "Имя процесса" и "pID".

Далее переходим в Свойства -> События и подписываемя на событие MouseUp(двойной клик на строчке)
В обработчике MouseUp привязываем наш contextMenuStrip:


ListView listView = sender as ListView;
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
ListViewItem item = listView.GetItemAt(e.X, e.Y);
if (item != null)
{
item.Selected = true;
contextMenuStrip1.Show(listView, e.Location);
}
}

Теперь при клике ПКМ, в поле listView, выскочит контекстное меню.

Заполним listView списком процессов. Для этого напишем такую "функцию":


//Получаем имена процессов и их pID
void refResh()
{
listView1.Items.Clear();
ManagementObjectSearcher FindprocessEum = new ManagementObjectSearcher("SELECT * FROM Win32_Process");
ListViewItem add_item;
foreach (ManagementObject process in FindprocessEum.Get())
{
add_item = new ListViewItem(process["Name"].ToString());
add_item.SubItems.AddRange(new string[] { process["ProcessId"].ToString() });
listView1.Items.Add(add_item);
}
}

Отработаем ее при запуске программы.Для этого допишем под иницализацией refResh();


.......................
public Form1()
{
InitializeComponent();
refResh();

}
.....................


Теперь "подключим" наш модуль.
Указываем импорт:


[DllImport("InjectModule.dll", CharSet = CharSet.Auto)]
public static extern void StartInject([In][MarshalAs(UnmanagedType.LPStr)]string PROC_NAME, [In][MarshalAs(UnmanagedType.LPStr)]string PatchDll);


Добавляем к контекстному меню пункты: "Обновить", "DllInject","Выход".

Двойной клик по "Обновить", пишем:

refResh();

Теперь по нажатию на этот пункт список процессов обновится.


Двойной клик по "Выход", пишем:

Application.Exit();



Двойной клик по "DllInject", пишем:

if (File.Exists("InjectModule.dll"))//проверяем есть ли файл
{
openFileDialog1.Title = "Выберете DLL";
openFileDialog1.FileName = "";
openFileDialog1.Filter = "DLL (*.dll)|*.dll";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
StartInject(listView1.SelectedItems[0].SubItems[0].Text, openFileDialog1.FileName);
}
}
else
{
MessageBox.Show("InjectModule.dll не найден!", "Error");
}




Исходный код основного класса модуля ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
Исходный код проекта ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
ВТ сделать не могу, так как ГГГ-модем "посылает"....

=TONIK=
22.08.2013, 00:24
Я что то не пойму,в чем отличие от того что если инжектор будет написан просто на c# или просто на c++ вроде разницы нет на чем он написан,или все же есть :question: проповедуй мне пожалуйста всю информацию:goplol:

Sinyss
22.08.2013, 01:42
Я что то не пойму,в чем отличие от того что если инжектор будет написан просто на c# или просто на c++ вроде разницы нет на чем он написан,или все же есть проповедуй мне пожалуйста всю информацию
Плюсы для этого... более приспособлены, что ли...

крайслер
22.08.2013, 08:03
Я что то не пойму,в чем отличие от того что если инжектор будет написан просто на c# или просто на c++ вроде разницы нет на чем он написан,или все же есть :question: проповедуй мне пожалуйста всю информацию:goplol:

Координального различия в работе практически нету... отличается только способ реализации....

Serpol(1)
27.10.2013, 14:06
Если мне память не изменяет, PerX написан на VB.