Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2012, 19:50   #1
owl1n
Пользователь
 
Регистрация: 01.04.2012
Сообщений: 34
Восклицание Присоединение DLL к стороннему процессу.

Как реализовать такое стандартными средствами C#? Давно мучаю себя таким вопросом. Гуглил - не помогло.
owl1n вне форума Ответить с цитированием
Старый 02.04.2012, 20:19   #2
owl1n
Пользователь
 
Регистрация: 01.04.2012
Сообщений: 34
По умолчанию

Я так думаю, я и здесь ответа не найду? Ладно. Придется кодить на Си.
owl1n вне форума Ответить с цитированием
Старый 06.04.2012, 07:13   #3
ProX_Alex
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 29
По умолчанию

ну как бы полустандартными методами

Код:
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;

namespace DLLInjector1
{

    public partial class Main : Form
    {
        public Main()
        {
            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;
        }

 
}
ProX_Alex вне форума Ответить с цитированием
Старый 06.04.2012, 07:13   #4
ProX_Alex
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 29
По умолчанию

продолжение


Код:
       private void button1_Click(object sender, EventArgs e)
        {
            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");
                }
            }
        }

        private void comboBox1_Click(object sender, EventArgs e)
        {
            comboBox1.Items.Clear();
            foreach (Process clsProcess in Process.GetProcesses())
            {
                comboBox1.Items.Add(clsProcess.ProcessName);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "DLL (*.dll)|*.dll" +
"|All files (*.*)|*.*";
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = openFileDialog1.FileName;
            }
        }
    }
ProX_Alex вне форума Ответить с цитированием
Старый 06.04.2012, 18:25   #5
owl1n
Пользователь
 
Регистрация: 01.04.2012
Сообщений: 34
По умолчанию

Спасибо. Возьму на заметку

Добавлю: не работает выбор процесса в ComboBox'е.

Последний раз редактировалось owl1n; 06.04.2012 в 18:58.
owl1n вне форума Ответить с цитированием
Старый 06.04.2012, 21:53   #6
ProX_Alex
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 29
По умолчанию

Цитата:
Сообщение от owl1n Посмотреть сообщение
Спасибо. Возьму на заметку

Добавлю: не работает выбор процесса в ComboBox'е.

win7 x64 со всеми обновлениями работает.
ProX_Alex вне форума Ответить с цитированием
Старый 07.04.2012, 14:19   #7
owl1n
Пользователь
 
Регистрация: 01.04.2012
Сообщений: 34
По умолчанию

у меня win7 x32, тоже со всеми обновами и т.д. Просто нету никаких процессов в списке.
owl1n вне форума Ответить с цитированием
Старый 07.04.2012, 15:34   #8
ProX_Alex
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 29
По умолчанию

Попробуй бинарник
http://www.programmersforum.ru/attac...1&d=1333798462
Вложения
Тип файла: rar DLLInjector1.rar (5.4 Кб, 30 просмотров)
ProX_Alex вне форума Ответить с цитированием
Старый 07.04.2012, 19:34   #9
owl1n
Пользователь
 
Регистрация: 01.04.2012
Сообщений: 34
По умолчанию

Бинарник работает.
owl1n вне форума Ответить с цитированием
Старый 07.04.2012, 20:36   #10
ProX_Alex
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 29
По умолчанию

Цитата:
Сообщение от owl1n Посмотреть сообщение
Бинарник работает.
ну значит скопипастили что то не так =)
ProX_Alex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отправка команды стороннему консольному приложению xxx-z-xxx C# (си шарп) 5 16.02.2012 18:23
Список DLL подключенных к процессу Horus92 Win Api 9 01.07.2010 09:32
присоединение и замена столбика hitch1 SQL, базы данных 5 29.11.2009 12:39
Присоединение 2 компов Lis000iq Компьютерное железо 6 05.11.2009 14:08
штоусе dll к процессу и работа с ней Mixasik Общие вопросы Delphi 4 06.06.2009 19:07