Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/47: Рейтинг темы: голосов - 47, средняя оценка - 4.89
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437

Инжектор dll

13.08.2018, 16:34. Показов 8838. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, помогите пожалуйста с инжектором.
Суть такая инжектор инжектит dll в игру, но сама dll не работает мне нужно чтобы dll начала работать в процессе , а не просто сидела в памяти игры как это сделать?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.IO;
using System.Reflection;
 
namespace alphabotcsharp
{
    public class Injection
    {
        [DllImport("kernel32.dll")]
        public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
 
        [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr GetModuleHandle(string lpModuleName);
 
        [DllImport("kernel32", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
        static extern IntPtr 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", SetLastError = true)]
        static extern bool WriteProcessMemory(IntPtr hProcess,
            IntPtr lpBaseAddress,
            byte[] lpBuffer,
            uint nSize,
            out UIntPtr lpNumberOfBytesWritten);
 
        [DllImport("kernel32.dll")]
        static extern IntPtr CreateRemoteThread(IntPtr hProcess,
            IntPtr lpThreadAttributes,
            uint dwStackSize,
            IntPtr lpStartAddress,
            IntPtr lpParameter,
            uint dwCreationFlags,
            IntPtr lpThreadId);
 
        // privileges
        const int PROCESS_CREATE_THREAD = 0x0002;
        const int PROCESS_QUERY_INFORMATION = 0x0400;
        const int PROCESS_VM_OPERATION = 0x0008;
        const int PROCESS_VM_WRITE = 0x0020;
        const int PROCESS_VM_READ = 0x0010;
 
        // used for memory allocation
        const uint MEM_COMMIT = 0x00001000;
        const uint MEM_RESERVE = 0x00002000;
        const uint PAGE_READWRITE = 4;
 
        public static bool isInjected = false;
        [DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool IsWow64Process(
            [In] IntPtr hProcess,
            [Out] out bool wow64Process
        );
 
        static bool is64BitProcess = (IntPtr.Size == 8);
        static bool is64BitOperatingSystem = is64BitProcess || InternalCheckIsWow64();
 
        public static int inject(string dllPath, Process tProcess)
        {
            Process targetProcess = tProcess;
            string dllName = dllPath;
            IntPtr procHandle = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_VM_WRITE | PROCESS_VM_READ, false, targetProcess.Id);
            IntPtr loadLibraryAddr = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
            IntPtr allocMemAddress = VirtualAllocEx(procHandle, IntPtr.Zero, (uint)((dllName.Length + 1) * Marshal.SizeOf(typeof(char))), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
            UIntPtr bytesWritten;
            WriteProcessMemory(procHandle, allocMemAddress, Encoding.Default.GetBytes(dllName), (uint)((dllName.Length + 1) * Marshal.SizeOf(typeof(char))), out bytesWritten);
            CreateRemoteThread(procHandle, IntPtr.Zero, 0, loadLibraryAddr, allocMemAddress, 0, IntPtr.Zero);
            return 0;
        }
 
        public static void Execute()
        {
            string rawDLL = String.Empty;
            if (is64BitOperatingSystem)
            {
                rawDLL = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "dfScriptLite.dll");
            }
            else
            {
                rawDLL = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "dfScriptLite.dll");
            }
            // Execution of injection
            Process proc = Process.GetProcessesByName("rust")[0];
            Injection.inject(rawDLL, proc);
            isInjected = true;
        }
        public static Boolean isInjectedAlready()
        {
            if (isInjected)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
        public static bool InternalCheckIsWow64()
        {
            if ((Environment.OSVersion.Version.Major == 5 && Environment.OSVersion.Version.Minor >= 1) ||
                Environment.OSVersion.Version.Major >= 6)
            {
                using (Process p = Process.GetCurrentProcess())
                {
                    bool retVal;
                    if (!IsWow64Process(p.Handle, out retVal))
                    {
                        return false;
                    }
                    return retVal;
                }
            }
            else
            {
                return false;
            }
        }
    }
 
    public class Program
    {
        public static void Main()
        {
            Injection.Execute();
        }
    }
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.08.2018, 16:34
Ответы с готовыми решениями:

Как создать инжектор Dll в exe
Хочу сделать такой инжэктор: Помогите.... Скачайте, расмотрите, И помогите... Пожалуйста!!

Как при создании своей dll подключить туда сторонние dll
Здравствуйте, я работаю в связке C# - Oracle. Если коротко, то вопрос звучит так: "Как при создании своей dll подключить туда сторонние...

Как вложить в одну dll еще несколько скомпилированных dll
Всем привет, подскажите пожалуйста, как в проект библиотеки классов вложить еще несколько других dll вместе со своими конфигами, чтобы...

7
95 / 74 / 27
Регистрация: 13.08.2018
Сообщений: 203
13.08.2018, 18:22
А dll на с++ или с#. И что dll там делать должна если не секрет ?
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437
13.08.2018, 20:18  [ТС]
maximka777, dll на c#, она вызывает окно с функциями спид хака аима и т.д
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
13.08.2018, 22:15
pafka1997, у ваш инжектор неполный.
Следующее что надо сделать это узнать виртуальный адресс нужной вам функции из этой dll в чужом процессе, и вызвать CreateRemoteThread с указанием адреса этой функции.
0
23 / 20 / 1
Регистрация: 15.06.2018
Сообщений: 437
13.08.2018, 22:37  [ТС]
nicolas2008, а как узнать адрес? Можно пожалуйста поподробней т.к относительно недавно всем занимаюсь. Спасибо.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
14.08.2018, 00:10
Я могу рассказать вкратце о самом простом, но не самом изящном способе.
BaseAddress dll в чужом процессе получить легко, а вот смещение указывающее на нужную функцию - нет.
Способ основывается на том факте, что для любого процесса смещение функции относительно BaseAddress будет одинаковым.

1. Загружаем dll в текущий процесс (да, это обязательно) с помощью LoadLibrary или GetModuleHandle.
2. С помощью класса Process ищем эту dll по имени и получаем BaseAddress (Process.GetCurrentProcess().GetModules( ).Where(...).Single().BaseAddress.
3. Тем же способом, найдя чужой процесс например по id получаем BaseAddress этой dll в чужом процессе. (Process.GetProcessById(...) дальше то же самое).
4. С помощью GetProcAddress получаем адресс функции в текущем процессе (localProcAddress).
5. Вычисляем смещение функции относительно базового адреса: offset = localProcAddress - localBaseAddress.
6. Вычисляем адресс в чужом процесс: remoteProcAddress = remoteBaseAddress + offset.
7. Готово! Теперь вызываем CreateRemoteThread для чужого процесса указав найденный адресс в качестве функции для выполнения.
8. Не забываем освободить весь этот unmanaged треш.
0
95 / 74 / 27
Регистрация: 13.08.2018
Сообщений: 203
14.08.2018, 05:00
Цитата Сообщение от pafka1997 Посмотреть сообщение
maximka777, dll на c#, она вызывает окно с функциями спид хака аима и т.д
Загрузка управляемой библиотеки в чужой процесс задачка не простая, есть готовые решения типа этого. С начало грузиться dll на с++, а из неё уже подгружается dll на с#. Так что как я понимаю без с++ тут не обойтись.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
14.08.2018, 11:59
Цитата Сообщение от maximka777 Посмотреть сообщение
С начало грузиться dll на с++, а из неё уже подгружается dll на с#. Так что как я понимаю без с++ тут не обойтись.
Необязательно на с++. Просто в dll должна быть экспортируемая функция для возможности её вызова из unmanaged кода.
На чистом c# такое не сделать, а на MSIL можно.
Для с# есть расширения которые позволяют экспортировать managed функцию. (https://github.com/3F/DllExport)
У меня где то было даже самописное решение на c# + MSIL.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.08.2018, 11:59
Помогаю со студенческими работами здесь

Зачем к dll прилагаются файлы: .dll.config, .pdb, .xml
Здравствуйте, Я начал изучать OpenGL 3.3 в C# с помощью OpenTK. Работаю в VS2015 на Window 10 и тестирую запуск на Winows XP. Собираю...

Дизассемблирование DLL, правка кода и компиляция его в DLL
ни разу не писал на c#, не пользовался monodeveloperом. сделано следующее: 1. дизассемблировал библиотеку name.dll, использовал...

Spell Checker ошибка: Word cannot find the spelling file mssp3RU.dll or mssp232.dll for Russian (Russia).
object nothing = Missing.Value; Pitayus ispolzivat Spell Checker Word-a tolko vot chto poluchayu v otvet Word cannot find...

Изменение данных в .dll посредством другой .dll
В одной .dll есть функция, в которой вызывается другая функция с некоторыми локальными (по отношению к первой функции) переменными: ...

Реализация SetFileValidData из импорта DLL kernel32.dll
Подскажите, в каком классе определен тип данных HANDLE используемый в функции библиотеки kernel32.dll, в противном случае нельзя...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru