PDA

Просмотр полной версии : [Статья] Работа с реестром С#


Skilful
08.04.2012, 18:29
Работа с реестром C#

В данной статье пойдет речь о том, как можно работать с реестром.

Как сделать Автозапуск программы; Как сделать Сохранение параметров программы; Как делать Добавлять и удалять dll’ки из реестра – с#.

Что нам потребуется:

- Microsoft Visual Studio 2010
- Начальные знания c#
- Желание

Как сделать Автозапуск программы (по включению Компьютера):

Шаг 1. Добавляем ссылку на библиотеку (в шапке главного файла формы):
using Microsoft.Win32;

Шаг 2. Теперь создаем 2 действия (Открытие формы и Закрытие)

- Открытие формы:

Двойным щелчком левой кнопки мыши нажимаем на свободное формы.

- Закрытие формы:

После того, как сделали "Открытие формы" ниже вставляем:

private void Form1_Closing(object sender, EventArgs e)
{

}

Теперь открываем файл "Имя формы.Designer.cs" (Чаще всего - это "Form1.Designer.cs")

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Там вы найдете:

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Потом вставляем вот это(сюда [Ссылки могут видеть только зарегистрированные и активированные пользователи] ):

this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this. Form1_Closing);

Это мы создали действие при закрытии формы.

Шаг 3. - Теперь возвращаемся в главный файл Формы 1, (Form1.cs), где мы вставляли пред код.
После этого кода, вставляем вот этот:
void AutoRunForm(bool Run)
{
/* Нам нужно Создать запись в:
* HKEY_CURRENT_USER\Software\Microsoft\Windows\Curre ntVersion\Run
*/
string NameProgram = "Ololosh";//Название должно совпадать с выходным файлом Проекта. !!БЕЗ *.exe
try
{
// Создать запись в реестре
RegistryKey regFirst = Registry.CurrentUser;//Получение адреса HKEY_CURRENT_USER
//Поиск каждого раздела, в итоге должны попасть в \Run, где и запишем нашу программу
RegistryKey regsw = regFirst.OpenSubKey("Software", true);
RegistryKey regmc = regsw.OpenSubKey("Microsoft", true);
RegistryKey regwin = regmc.OpenSubKey("Windows", true);
RegistryKey regcv = regwin.OpenSubKey("CurrentVersion", true);
RegistryKey regrun = regcv.OpenSubKey("Run", true);

if (Run == true)
{
//Создает запись в реестре, в \Run (Запуск программ, по включению Windows)
regrun.SetValue(NameProgram, Application.ExecutablePath, RegistryValueKind.String);

}
else
{
//В случае "занятости" удаляет предыдущую запись
regrun.DeleteValue(NameProgram);
}

//Закрываем
regrun.Close();
regcv.Close();
regwin.Close();
regmc.Close();
regsw.Close();
regFirst.Close();
}
catch
{
ErrorMessage("Автор запуска программы");
}

}

const bool debugState = false;

public static void ErrorMessage(string message)//Служит для определения в каком месте - произошла ошибка. Конечно можно просто использовать MessBox, но мне так удобней
{
if(debugState == true)
MessageBox.Show("Ошибка : " + message);
}

Основные моменты я закомментировал в функции.

Шаг 4. - Теперь кидаем в функцию "Form1_Closing" вот это:
AutoRunForm(true);

т.е Должно получиться вот такое:

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Теперь расскажу как можно записывать настройки в реестр:

Шаг 1. - Делаем (Первые два действия(Шаг 1. и Шаг 2.), из прошлого под гайда, т.е нужно добавить ссылку и сделать действия (закрытия/открытия формы))

Шаг 2. - Теперь в главный файл формы 1(чаще всего "Form1.cs") вставляем вот это:

void SaveOptionsinRegistry()
{
try
{
RegistryKey reg = Registry.CurrentUser;
RegistryKey regsw = reg.OpenSubKey("Software", true);
RegistryKey regprog = regsw.CreateSubKey("MySettingProg");//Название группы

//Я кинул на форму 1 textbox
//У вас будет по другому

//regprog.SetValue("Название",объект, RegistryValueKind.String);
regprog.SetValue("TextBox", textBox1.Text, RegistryValueKind.String);



regsw.Close();
reg.Close();
}
catch
{
ErrorMessage("Записи данных в реестр");
}
}

Шаг 3. - Если вы хотите, что бы данные сохранялись каждый раз, когда программу сохраняли, то делаем ( Шаг 1. из этого под гайда), затем вставляем в действие "Form1_Closing" вот это:
SaveOptionsinRegistry();
Должно получиться вот такое:

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

А если хотите сохранять "по нажатию кнопки", то кидаем на форму кнопку, двойным щелчком правой кнопки мыши щелкаем по ней (создаем действие)
и кидаем в это действие:

SaveOptionsinRegistry();

Шаг 4. - Теперь сделаем загрузку данных.
в файле формы (Form1.cs) вставляем вот это:

void ReadOptionsInRegistry()//Читает сохранения в реестре
{
try
{
RegistryKey reg = Registry.CurrentUser;
RegistryKey regsw = reg.OpenSubKey("Software", false);
RegistryKey regprog = regsw.OpenSubKey("MySettingProg");

if (regprog != null)
{
string str;
str = (string)regprog.GetValue("TextBox");
globalstringtextbox = str;
regprog.Close();
}
regsw.Close();
reg.Close();
}
catch
{
ErrorMessage("Чтения данных из реестра");
}
}

Шаг 5. - Если вы хотите, что бы настройки читались каждый раз при открытии программы, то кидаем следующее (в функцию "Form1_Load"):

ReadOptionsInRegistry();

А если хотите читать настройки "по нажатию кнопки", то кидаем на форму кнопку, двойным щелчком правой кнопки мыши щелкаем по ней (создаем действие)
и кидаем в это действие:

ReadOptionsInRegistry();

Шаг 6. - Обновляем интерфейс.
В главный файл кидаем вот это:

void UpdateForm()
{
textBox1.Text = globalstringtextbox;
}

В "Form1_Load" добавляем:

UpdateForm();

Должно получиться:

[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Как заносить добавлять dll в реестр:

Шаг 1. - Добавляем Импортируемую библиотеку (в шапку файла формы. Form1.cs):

using Microsoft.Win32;

Шаг 2. - вставляем это (чуть ниже public Form1()):

//Используем самый легкий и простой способ определения битность системы
public static int BitnostSistem = IntPtr.Size;//Переменная равная 4 - 32x(битности). А в 64x - 8.
int bit32 = 4;//Windows ... 32(86)x
int bit64 = 8;//Windows ... 64x

Шаг 3. - Кидаем на форму кнопку (button1) , создаем действие нажатия кнопки (щелкаем по ней два раза левой кнопкой мыши). И в открывшемся окне и месте вставляем:

string NameDLL = "Ololosh.dll";//Название dll которую вносить в реестр

if (BitnostSistem == bit32)
{
//Ищем HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
RegistryKey regFirst = Registry.LocalMachine;
RegistryKey regsw = regFirst.OpenSubKey("SOFTWARE", true);
RegistryKey regmc = regsw.OpenSubKey("Microsoft", true);
RegistryKey regwin = regmc.OpenSubKey("Windows NT", true);
RegistryKey regcv = regwin.OpenSubKey("CurrentVersion", true);
RegistryKey regrun = regcv.OpenSubKey("Windows", true);

regrun.SetValue("AppInit_DLLs", NameDLL);
regrun.SetValue("LoadAppInit_DLLs", 1, RegistryValueKind.DWord);
}
if (BitnostSistem == bit64)
{
//Ищем HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ Windows NT\CurrentVersion\Windows
RegistryKey regFirst = Registry.LocalMachine;
RegistryKey regsw = regFirst.OpenSubKey("SOFTWARE", true);
RegistryKey regmc = regsw.OpenSubKey("Wow6432Node", true);
RegistryKey regwin = regmc.OpenSubKey("Microsoft", true);
RegistryKey regcv = regwin.OpenSubKey("Windows NT", true);
RegistryKey regrun = regcv.OpenSubKey("CurrentVersion", true);
RegistryKey rego = regcv.OpenSubKey("Windows", true);

rego.SetValue("AppInit_DLLs", NameDLL);
rego.SetValue("LoadAppInit_DLLs", 1, RegistryValueKind.DWord);
}

Шаг 4. - Если хотите удалить из реестра запись dll, то просто убираем название длл (оставляем пустое поле, Пример - string NameDLL = "";)

Вот в принципе и все, тестовый проект находится во вложении.
Всем удачных тестов, пробуйте, экспериментируйте.

the-boxi
10.04.2012, 00:11
А как очистить данные которые заносил я в реестр?

warl0ck
10.04.2012, 13:14
string NameDLL = "Ololosh.dll";//Название dll которую вносить в реестр

if (BitnostSistem == bit32)
{
//Ищем HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows
RegistryKey regFirst = Registry.LocalMachine;
RegistryKey regsw = regFirst.OpenSubKey("SOFTWARE", true);
RegistryKey regmc = regsw.OpenSubKey("Microsoft", true);
RegistryKey regwin = regmc.OpenSubKey("Windows NT", true);
RegistryKey regcv = regwin.OpenSubKey("CurrentVersion", true);
RegistryKey regrun = regcv.OpenSubKey("Windows", true);

regrun.SetValue("AppInit_DLLs", NameDLL);
regrun.SetValue("LoadAppInit_DLLs", 1, RegistryValueKind.DWord);
}
if (BitnostSistem == bit64)
{
//Ищем HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ Windows NT\CurrentVersion\Windows
RegistryKey regFirst = Registry.LocalMachine;
RegistryKey regsw = regFirst.OpenSubKey("SOFTWARE", true);
RegistryKey regmc = regsw.OpenSubKey("Wow6432Node", true);
RegistryKey regwin = regmc.OpenSubKey("Microsoft", true);
RegistryKey regcv = regwin.OpenSubKey("Windows NT", true);
RegistryKey regrun = regcv.OpenSubKey("CurrentVersion", true);
RegistryKey rego = regcv.OpenSubKey("Windows", true);

rego.SetValue("AppInit_DLLs", NameDLL);
rego.SetValue("LoadAppInit_DLLs", 1, RegistryValueKind.DWord);
}

немного грамматики
string NameDLL = "Ololosh.dll";//Название dll которую вносить в реестр

if (IntPtr.Size == 4) //32x
{
RegistryKey reg = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows");
reg.SetValue("AppInit_DLLs", NameDLL);
reg.SetValue("LoadAppInit_DLLs", 1, RegistryValueKind.DWord);
}
else
{
RegistryKey reg = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Windows");
reg.SetValue("AppInit_DLLs", NameDLL);
reg.SetValue("LoadAppInit_DLLs", 1, RegistryValueKind.DWord);
}

А как очистить данные которые заносил я в реестр?

если ты имеешь ввиду просто убрать название дллки то:
reg.SetValue("AppInit_DLLs", string.Empty);
если удалить ветвь то:
Registry.CurrentUser.DeleteSubKey(@"что удалить");

artemuidak99
13.04.2012, 15:57
А как выгрузить DLL ???

Skilful
13.04.2012, 17:13
А как выгрузить DLL ???
Это немного некорректный вопрос в данной теме.
С помощью реестра не выгрузить dll'ку. Можно только удалить следы из реестра Какой то дллки.
А это можно легко сделать
если ты имеешь ввиду просто убрать название дллки то:
Код:
reg.SetValue("AppInit_DLLs", string.Empty);


зы. Варлок если пожелает, может рассказать (у него в его инжекторе есть данная функция) /problem

artemuidak99
14.04.2012, 01:27
Нуу.. Спроси у варлока пож))) я типо хочу выгрузить файлы фроста

Skilful
14.04.2012, 03:35
хм... разве это можно там увидеть?
Исправь скрин.
В этом виноват i.zhyk.ru , т.к мешает скрины.

Нуу.. Спроси у варлока пож))) я типо хочу выгрузить файлы фроста
И так, во вложении находится архив с файлом.Добавь его в проект.
Там нужно будет изменять имя структуры. (я указал где)
теперь кидаешь на форму кнопку, а в открывшемся окошке вставляешь:MessageBox.Show("");
try
{
string NameDll = ""; //Имя дллки которую хочешь выгружать
IntPtr hOwcHandle = WinApis.GetModuleHandle(NameDll);
if (!hOwcHandle.Equals(IntPtr.Zero))
{
WinApis.FreeLibrary(hOwcHandle);
MessageBox.Show("Длл: " + NameDll + " успешно выгружена");
}
else
{
MessageBox.Show("Длл: " + NameDll + " не найдена");
}
}
catch (System.Exception ex)
{
MessageBox.Show("Ошибка!" + ex.Message);
}

artemuidak99
14.04.2012, 05:54
Вопрос: А WinApis.cs это в проекте как по другому называется :D А то не где нету)))

Добавлено через 2 минуты
Или просто засунуть в проект? Я так сделал))

Добавлено через 1 час 50 минут
Короче!! Я создал новый класс все добавил переименовал и код всунул но когда вкл игру нажимаю выгрузить такую то ДЛЛ то пишет что её не нашёл.... хотя в фросте она есть Добавиь в скайп: Artemuidak С пометкой : С жука

artemuidak99
14.04.2012, 10:02
Значит указал не правильно. будь внимательней.
Все правильно!! Вот например мне нужно выгрузить FrostUpdater.dll
пишет типо не нашёл!!

Skilful
14.04.2012, 11:51
Вопрос: А WinApis.cs это в проекте как по другому называется :D А то не где нету)))

Добавлено через 2 минуты
Или просто засунуть в проект? Я так сделал))

Добавлено через 1 час 50 минут
Короче!! Я создал новый класс все добавил переименовал и код всунул но когда вкл игру нажимаю выгрузить такую то ДЛЛ то пишет что её не нашёл.... хотя в фросте она есть Добавиь в скайп: Artemuidak С пометкой : С жука
Зачем оно вам нужно? Есть отдельные программы, которые выгружают длл из игры.

Поучите немножно простейшее (там, для чего нужны библиотеки, названия, работа с формами и т.д), после этого вы спокойно сможете сделать, то что я написал.

Там ничего сложного нету, главное не накосячить. А объяснить очень трудно..

Но я попытаюсь.. И так, ищешь в гугле "как добавить в проект файлы. Microsoft Visual Studio 2010", после добавляешь файл "WinApis.cs".

Затем открываешь его и изменяешь в самом начале "имявашей" на название проекта.

И запомни, главное не накосячить и все будет ок.

Зы, в скайп никогда не добавляюсь, к тебе тем более.

KeepirTee
14.04.2012, 18:11
Зачем оно вам нужно? Есть отдельные программы, которые выгружают длл из игры.

Поучите немножно простейшее (там, для чего нужны библиотеки, названия, работа с формами и т.д), после этого вы спокойно сможете сделать, то что я написал.

Там ничего сложного нету, главное не накосячить. А объяснить очень трудно..

Но я попытаюсь.. И так, ищешь в гугле "как добавить в проект файлы. Microsoft Visual Studio 2010", после добавляешь файл "WinApis.cs".

Затем открываешь его и изменяешь в самом начале "имявашей" на название проекта.

И запомни, главное не накосячить и все будет ок.

Зы, в скайп никогда не добавляюсь, к тебе тем более.
Невозможно без подключению к процессу выгрузить .dll на C#.
Так как .dll (Он же подключенный модуль) должна где либо хранится, чтобы выгрузить её ты должен "зайти" в это "хранилище /dgs" и от туда её выгрузить. А с пустого места выгрузить .dll, тем более на C# - не реально.

artemuidak99
17.04.2012, 05:13
реально!! Я тебя говорю...

object
17.04.2012, 14:06
artemuidak99, интересно как же Вы выгрузите dll, не указывая откуда выгружать /dgs

крайслер
17.04.2012, 19:35
artemuidak99, интересно как же Вы выгрузите dll, не указывая откуда выгружать
Он наверно посмотрел на "Обход фроста" Скителся с зорге)))) Вот и утверждает....

Я конечно не силен в декомпиляции, но все что есть в якобы обходе Скителса:


Как я понял это функция "Обойти фрост"
this.progressBar1.Value = 10;
this.groupBox3.Enabled = false;
this.progressBar1.Value = 20;
foreach (Process process in Process.GetProcessesByName("PB"))
{
process.Kill();
}
this.progressBar1.Value = 100;
MessageBox.Show(null, "Выгрузка прошла успешно!\nПроцесс Point Blank убит\nМожете заходить в игру!", "====>Успешно<====", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
Application.Exit();


Еще
private void button4_Click(object sender, EventArgs e)
{
foreach (Process process in Process.GetProcessesByName("PointBlank"))
{
process.Kill();
}
foreach (Process process in Process.GetProcessesByName("PB"))
{
process.Kill();
}
this.Text = "Point Blank убит.";
}



this.groupBox3.Enabled = false;
this.Text = "Скорость бот'a Медленно.";
this.timer2.Interval = 0x4e20;
this.groupBox1.Enabled = false;
this.progressBar1.Value = 10;
this.groupBox1.Enabled = false;
this.progressBar1.Value = 20;
this.progressBar1.Value = 30;
this.timer2.Start();
this.progressBar1.Value = 40;

this.groupBox3.Enabled = false;
this.Text = "Скорость бот'a Средне.";
this.timer2.Interval = 0x2710;
this.groupBox1.Enabled = false;
this.progressBar1.Value = 10;
this.groupBox1.Enabled = false;
this.progressBar1.Value = 20;
this.progressBar1.Value = 30;
this.timer2.Start();
this.progressBar1.Value = 40;

this.groupBox1.Enabled = true;
this.label2.Visible = true;
this.radioButton9.Visible = true;
this.radioButton10.Visible = true;
this.label5.Visible = false;
this.button5.Visible = false;
this.button6.Visible = false;
this.button7.Visible = false;
this.groupBox1.Enabled = true;
this.Text = "Ручной режим";
this.radioButton9.Enabled = true;
this.radioButton10.Enabled = true;
this.button1.Enabled = true;

warl0ck
18.04.2012, 14:05
реально!! Я тебяе говорю...

нука расскажи как это всё работает

крайслер, за такой код нужно сразу банить

крайслер
18.04.2012, 14:21
крайслер, за такой код нужно сразу банить
Меня?

Этот код выдал .NET Reflector и насколько он верен я хз. Но я думаю если бы даже код был криптован(каким-то магическим методом) следы в вызове бы остались....Или нет?
Я кроме визуализации не чего не нашел...
Хотя люди говорят что работает)))))))

Вот этот магический обход... ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
Вт ([Ссылки могут видеть только зарегистрированные и активированные пользователи] 7b8d4dba95fe43/analysis/)

Nickitee
18.04.2012, 16:18
foreach (Process process in Process.GetProcessesByName("PB"))
{
process.Kill();
}
this.progressBar1.Value = 100;
MessageBox.Show(null, "Выгрузка прошла успешно!\nПроцесс Point Blank убит\nМожете заходить в игру!", "====>Успешно<====", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
Application.Exit();
[/CODE]
Убиваем процесс PB.exe.




private void button4_Click(object sender, EventArgs e)
{
foreach (Process process in Process.GetProcessesByName("PointBlank"))
{
process.Kill();
}
foreach (Process process in Process.GetProcessesByName("PB"))
{
process.Kill();
}
this.Text = "Point Blank убит.";
}

При нажатии на кнопку сначала закрывается процесс PointBlank.exe, дальше PB.exe, причём если эти процессы не видимы - non sense...




this.groupBox3.Enabled = false;
this.Text = "Скорость бот'a Средне.";
this.timer2.Interval = 0x2710;
this.groupBox1.Enabled = false;
this.progressBar1.Value = 10;
this.groupBox1.Enabled = false;
this.progressBar1.Value = 20;
this.progressBar1.Value = 30;
this.timer2.Start();
this.progressBar1.Value = 40;

Ничего не делает




this.groupBox1.Enabled = true;
this.label2.Visible = true;
this.radioButton9.Visible = true;
this.radioButton10.Visible = true;
this.label5.Visible = false;
this.button5.Visible = false;
this.button6.Visible = false;
this.button7.Visible = false;
this.groupBox1.Enabled = true;
this.Text = "Ручной режим";
this.radioButton9.Enabled = true;
this.radioButton10.Enabled = true;
this.button1.Enabled = true;

Ничего не делает.

Его обход - нельзя назвать обходом.

Norick
08.05.2012, 01:10
а как можно удалить запись из реестра?
Например вот эти записи- (от се)

('Software\Cheat Engine\Plugins');
('Software\Cheat Engine\Tools');
('Software\Cheat Engine\Window Positions');
('Software\Cheat Engine');