Как подготовить программу для DLL Injection?

205
11 марта 2018, 20:22

Есть программа, которая по нажатию на пробел рисует 10 красных квадратов на активном окне. При компиляции из Visual Studio все отрабатывает нормально. Появляется форма, я жму на пробел, на форме рисуются квадраты. Сохраняю проект в dll.

Теперь я хочу закинуть эту библиотеку в другой процесс. Через Cheat Engine делаю инъекцию в internet explorer. Она проходит успешно. Через visual studio проверял, dll занята процессом эксплорера. Однако формы никакой нету и при нажатии на пробел никакие квадраты не рисуются. Собственно что надо сделать, чтобы так работало?

Код прикладываю, сильно не пинайте, первый раз с C# столкнулся, постарался подробно прокомментировать, что я там делаю.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace BotTest
{
    public partial class Form1 : Form
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool CloseHandle(IntPtr hObject);
        [DllImport("kernel32.dll")]
        internal static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
        [DllImport("user32.dll")]
        public static extern IntPtr GetForegroundWindow();
        [StructLayout(LayoutKind.Sequential)]
        public struct RECT
        {
            public int Left;
            public int Top;
            public int Right;
            public int Bottom;
        }
        public Form1()
        {
            InitializeComponent();
        }

        private void DrawTest(IntPtr hwnd, IntPtr handle) //Функция для рисования квадратов
        {
            Random rand = new Random(); //Переменная для создания случайных значений
            int x, y; //Координаты будущих квадратов
            GetWindowRect(hwnd, out RECT rc); //Получение размеров окна
            for (int i = 1; i<=10; i++)
            {
                Graphics newGraphics = Graphics.FromHwnd(hwnd); //Задаем отрисовку в окне, которое прилетело с параметров
                x = rand.Next(rc.Right - rc.Left - 25); //Делаем случайные координаты
                y = rand.Next(rc.Bottom - rc.Top - 25);
                newGraphics.DrawRectangle(new Pen(Color.Red, 40), x, y, 25, 25); //Рисуем квадрат. Толщина больше половины стороны, значит закрасится полностью
                newGraphics.Dispose();
            }
        }
        private void button1_Click(object sender, EventArgs e) //При нажатии на эту кнопку будет рисоваться 10 квадратов
        {
            try
            {
                int pID = Process.GetCurrentProcess().Id; //Берем номер процесса, не понадобится
                string pName = Process.GetProcessById(pID).ProcessName; //Берем имя процесса, тоже не нужно
                IntPtr hwnd = GetForegroundWindow(); //Берем номер окна, по нему определем в каком окне рисовать
                IntPtr handle = OpenProcess(0x001F0FFF, false, pID); //Берем ссылку на номер окна, тоже не нужно
                CloseHandle(handle);
                DrawTest(hwnd, handle); //Рисуем квадраты по hwnd, через handle не заработало
            }
            catch (Exception)
            {
                MessageBox.Show("Error button1");
            }
        }
        private void button2_Click(object sender, EventArgs e) //Кнопка для закрытия текущего процесса
        {
            try
            {
                int pID = Process.GetCurrentProcess().Id; //Берем номер процесса
                Process prc = Process.GetProcessById(pID); //По номеру создаем для него переменную
                prc.Kill(); //И убиваем
            }
            catch(Exception)
            {
                MessageBox.Show("Error button2");
            }
        }
        private void button1_KeyDown(object sender, KeyEventArgs e) //При нажатии на пробел вызывается 1-ая кнопка
        {
            if (e.KeyCode == Keys.Space)
            {
                button1_Click(sender, e);
            }
        }
    }
}
READ ALSO
Как отобразить xml документ в с#

Как отобразить xml документ в с#

Добрый деньСтолкнулась с проблемой создания "своего" языка для вёрстки

179
Бит маски CreateParams для TextBox

Бит маски CreateParams для TextBox

Имею модифицированный TextBox под отображение IP адресаВ некоторых формах нужно делать его неактивным и только для чтения

176
Unity2D как просчитать траекторию прыжка

Unity2D как просчитать траекторию прыжка

Нужно просчитать траекторию движения персонажа после прыжка, чтобы именно к концу его движения заспавнить платформу, вообще ума не приложу...

151