close

Вход

Забыли?

вход по аккаунту

?

Отчет № 5

код для вставкиСкачать

Министерство образования Российской Федерации
Пензенский государственный университет
Кафедра "Вычислительная техника"
Отчет
о выполнении лабораторной работы №5 по курсу
"Методы и средства защиты компьютерной информации"
Защита приложения регистрации копии программы с использованием модификации тела программы.
Выполнили: студенты
группы 09ВВ2
Носков А.В.
Кривошеин И.В.
Проверил: Дубравин А. В.
Пенза 2012
Цель работы: Защита приложения. Регистрация копии программы с использованием модификации тела программы.
Лабораторное задание: Следует воспользоваться наработками, полученными в результате выполнения предыдущих лабораторных работ. А именно, для управления ключевой информацией следует использовать программу, разработанную в лабораторной работе №4. Полученный ключ следует зашифровать с использованием подстановочного шифра, реализацию следует взять из лабораторной работы №3. Необходимо модифицировать тестовую программу из лабораторной работы №4 таким образом, чтобы в ее тело можно было сохранить полученный зашифрованный ключ. Для этого следует добавить в программу переменную KEY типа char[], с размерностью, соответствующей длине зашифрованного ключа и полностью заполненный некоторой уникальной, не повторяющейся последовательностью двоичных данных (далее паттерн). Подготовка экземпляра программы для пользователя будет заключаться в выполнении двух операций: -Генерация ключа, аналогично лабораторной работе №4; -Шифрование ключа, с использованием подстановочного шифра; -Генерация дистрибутива. На этапе генерации дистрибутива следует взять скомпилированный вариант тестовой программы, найти в ней паттерн и заменить его на зашифрованный ключ.
При запуске тестовой программы следует проверить правильность ключа. Для этого следует извлечь ключ из переменной KEY, расшифровать его и выполнить проверку.
ВариантИнформация, сохраняемая в базе вместе с ключамиСодержимое четвертой группы символов ключа6Имя пользователя
e-mailA=rand(), B=rand(), C=rand()
D=A/B*C Текст программы.
Файл library.dll
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Win32;
namespace library
{
public class Class1
{
//public Int32 vuvud;
public void savekey(string klush, string infa)
{
RegistryKey saveKey = Registry.CurrentUser.CreateSubKey("software\\lab4\\");
saveKey.SetValue(klush, infa);
saveKey.Close();
}
public string readkey(string klu)
{
RegistryKey readKey = Registry.CurrentUser.OpenSubKey("software\\lab4\\");
if (readKey == null)
{
return null;
}
string loadString = (string)readKey.GetValue(klu);
readKey.Close();
return loadString;
}
public bool proverka(string klus)
{
//string kluch = "";
//RegistryKey readKey = Registry.CurrentUser.OpenSubKey("software\\lab4\\");
//readKey.
//string loadString = (string)readKey.GetValue(klus);
//readKey.Close();
Int32 a, b, c, d, d2;
if (klus.Length != 16) return false;
string aa, bb, cc, dd, dd2;
aa = klus.Substring(0, 4);
bb = klus.Substring(4, 4);
cc = klus.Substring(8, 4);
dd = klus.Substring(12, 4);
a = System.Convert.ToInt32(aa);
b = System.Convert.ToInt32(bb);
c = System.Convert.ToInt32(cc);
d = System.Convert.ToInt32(dd);
d2 = a / b;
d2 = d2 * c;
dd2 = System.Convert.ToString(d2);
dd2=dd2.Substring(0, 4);
d2 = System.Convert.ToInt32(dd2);
//vuvud = d2;
if (d2 == d) return true;
else return false;
}
}
}
Файл основной программы.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using library;
//[DllImport("library.dll")]
//static extern namespace library;
namespace laba_4
{
public partial class Form1 : Form
{
//[DllImport("library.dll")]
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
string kl = this.textBox1.Text;
//string af="";
string user = "not";
string email="not";
string infor="not";
if (this.textBox2.Text != "") user = this.textBox2.Text;
if (this.textBox3.Text != "") email = this.textBox3.Text;
infor = user + "$" + email;
if (kl != "")
{
Class1 cl1 = new Class1();
cl1.savekey(kl, infor);
//if (cl1.readkey(kl) == null) af = "not";
//else af = cl1.readkey(kl);
//this.textBox1.Text = af;
}
else MessageBox.Show("Нажмите кнопку Генерировать");
}
private void button2_Click(object sender, EventArgs e)
{
Random rand = new Random();
Int32 a, b, c, d;
a = rand.Next(1000, 9999);
b = rand.Next(1000, 9999);
c = rand.Next(1000, 9999);
d = a / b;
d = d * c;
string kod = "";
String rez = System.Convert.ToString(a) + System.Convert.ToString(b) + System.Convert.ToString(c);
kod = System.Convert.ToString(d);
kod=kod.Substring(0, 4);
rez = rez + kod;
this.textBox1.Text = rez;
}
private void button3_Click(object sender, EventArgs e)
{
string kl = this.textBox4.Text;
Int32 num;
string user = "";
string email = "";
string infor = "";
//if (this.textBox2.Text != "") user = this.textBox2.Text;
//if (this.textBox3.Text != "") email = this.textBox3.Text;
//infor = user + "$" + email;
if (kl != "")
{
Class1 cl1 = new Class1();
//cl1.savekey(kl, infor);
if (cl1.readkey(kl) == null)
{
this.textBox5.Text = "Необнаружен";
this.textBox6.Text = "Необнаружен";
}
else
{ infor = cl1.readkey(kl);
num = infor.IndexOf("$");
if (num == -1)
{
this.textBox5.Text = "Повреждён";
this.textBox6.Text = "Повреждён";
}
else
{
user = infor.Substring(0, num);
if (user == "not") user = "Не был введён";
email = infor.Substring(num + 1);
if (email == "not") email = "Не был введён";
this.textBox5.Text = user;
this.textBox6.Text = email;
}
}
//this.textBox1.Text = af;
}
else MessageBox.Show("Введите код пользователя");
}
}
}
Файл генерирущей программы using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;
using System.Diagnostics;
using library;
namespace CSCompiler
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox appName;
private RichTextBox richTextBox1;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null) {
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.button1 = new System.Windows.Forms.Button();
this.appName = new System.Windows.Forms.TextBox();
this.label1 = new System.Windows.Forms.Label();
this.richTextBox1 = new System.Windows.Forms.RichTextBox();
this.SuspendLayout();
// // button1
// this.button1.BackColor = System.Drawing.SystemColors.Control;
this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.button1.Location = new System.Drawing.Point(196, 54);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(152, 24);
this.button1.TabIndex = 1;
this.button1.Text = "Создать и запустить";
this.button1.UseVisualStyleBackColor = false;
this.button1.Click += new System.EventHandler(this.button1_Click);
// // appName
// this.appName.Location = new System.Drawing.Point(196, 18);
this.appName.Name = "appName";
this.appName.Size = new System.Drawing.Size(152, 20);
this.appName.TabIndex = 2;
this.appName.Text = "Тест.exe";
// // label1
// this.label1.Location = new System.Drawing.Point(38, 18);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(137, 23);
this.label1.TabIndex = 4;
this.label1.Text = "Имя файла";
// // richTextBox1
// this.richTextBox1.Enabled = false;
this.richTextBox1.Location = new System.Drawing.Point(61, 44);
this.richTextBox1.Name = "richTextBox1";
this.richTextBox1.Size = new System.Drawing.Size(32, 33);
this.richTextBox1.TabIndex = 8;
this.richTextBox1.Text = resources.GetString("richTextBox1.Text");
this.richTextBox1.Visible = false;
// // Form1
// this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(367, 94);
this.Controls.Add(this.richTextBox1);
this.Controls.Add(this.label1);
this.Controls.Add(this.appName);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Тест для л.р.№5";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main() {
Application.Run(new Form1());
}
/*private void Form1_Load(object sender, System.EventArgs e)
{
}
private void menuItem4_Click(object sender, System.EventArgs e)
{
Dispose();
Application.Exit();
}
/*private void menuItem3_Click(object sender, System.EventArgs e)
{
System.Windows.Forms.MessageBox.Show(this, "CSharp sample compiler :)", "CodeProject Rulez");
}*/
private void button1_Click(object sender, System.EventArgs e)
{
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
// For Visual Basic Compiler try this :
//Microsoft.VisualBasic.VBCodeProvider
ICodeCompiler compiler = codeProvider.CreateCompiler();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = true;
if (appName.Text == "")
{
System.Windows.Forms.MessageBox.Show(this, "Application name cannot be empty");
return ;
}
parameters.OutputAssembly = appName.Text.ToString();
parameters.MainClass = "test_lab_4.Program";
parameters.IncludeDebugInformation = true;
// Add available assemblies - this should be enough for the simplest
// applications.
foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) {
parameters.ReferencedAssemblies.Add(asm.Location);
}
String code =this.richTextBox1.Text;
string web;
Class1 cl1 = new Class1();
web = cl1.readkey("my_key");
string af = "";
int k;
char sa;
for (int y = 0; y < 16; y++)
{
sa = System.Convert.ToChar(web.Substring(y, 1));
k = (int)sa;
k = k - 20;
af = af + System.Convert.ToChar(k);
}
code = code.Replace("2430897367697355", af);
//System.Windows.Forms.MessageBox.Show(this, code);
CompilerResults results = compiler.CompileAssemblyFromSource(parameters, code);
if (results.Errors.Count > 0) {
string errors = "Compilation failed:\n";
foreach (CompilerError err in results.Errors) {
errors += err.ToString() + "\n";
}
System.Windows.Forms.MessageBox.Show(this, errors, "There were compilation errors");
}
else
{
#region Executing generated executable
// try to execute application
try {
if (!System.IO.File.Exists(appName.Text.ToString())) {
MessageBox.Show(String.Format("Can't find {0}", appName), "Can't execute.", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
ProcessStartInfo pInfo = new ProcessStartInfo(appName.Text.ToString());
Process.Start(pInfo);
} catch (Exception ex) {
MessageBox.Show(String.Format("Error while executing {0}", appName) + ex.ToString(),
"Can't execute.", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
#endregion
}
}
}
}
Файл сгенерированной программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using library;
namespace test_lab_4
{
public partial class Form1 : Form
{
Int32 i = 0;
public string superkey = "2430897367697355";
public Form1()
{
InitializeComponent();
label1.Text = "Введите код пользователя и нажмите кнопку";
}
private void button1_Click(object sender, EventArgs e)
{
Class1 cl1 = new Class1();
if (cl1.readkey("my_key") == null) label1.Text = "Код пользователя необнаружен";
else {
//Class1 cl1 = new Class1();
string read;
read=cl1.readkey("my_key");
string af="";
int k;
char sa;
for (int y = 0; y < 16; y++)
{
sa = System.Convert.ToChar(read.Substring(y, 1));
k = (int)sa;
k = k - 20;
af = af + System.Convert.ToChar(k);
}
this.textBox1.Text = af;
if (af != superkey) MessageBox.Show("Ключ не совпадает с ключом в программе!");
read = cl1.readkey(read);
if (read == null) MessageBox.Show("Данная запись в реестре не найдена");
else {
Int32 num = read.IndexOf("$");
if (num == -1)
{
this.label1.Text = "Повреждёна запись";
}
else
{
String user = read.Substring(0, num);
if (user == "not") {
user = "Не был введён";
this.button2.Enabled = true;
this.button2.Visible = true;
this.label3.Visible = true;
this.label4.Visible = true;
i = 1;
}
String email = read.Substring(num + 1);
if (email == "not") { email = "Не был введён";
this.button2.Enabled = true;
this.button2.Visible = true;
this.label3.Visible = true;
this.label4.Visible = true;
i = 1;
}
this.textBox2.Visible = true;
this.textBox2.Enabled= true;
this.textBox3.Visible = true;
this.textBox3.Enabled = true;
this.label3.Visible = true;
this.label4.Visible = true;
this.textBox2.Text = user;
this.textBox3.Text = email;
bool rez;
if (i == 0) { rez = cl1.proverka(this.textBox1.Text);
if (rez == true)
{
this.label1.Text = "Ключ корректен";
}
else {
this.label1.Text = "Ключ некорректен";
}
}
}
}
}
}
private void button2_Click(object sender, EventArgs e)
{
String kod, mail, user;
kod = this.textBox1.Text;
user = this.textBox2.Text;
mail = this.textBox3.Text;
//if (kod != "" & mail != "" & user != "")
// {
Class1 cl1 = new Class1();
bool rez;
rez = cl1.proverka(kod);
string af = "";
char sa;
int k;
for (int y = 0; y < 16; y++)
{
sa = System.Convert.ToChar(kod.Substring(y, 1));
k = (int)sa;
k = k + 20;
af = af + System.Convert.ToChar(k);
}
if (af != superkey) MessageBox.Show("Ключ не совпадает с ключом в программе!");
if (rez == true)
{
this.label1.Text = "Ключ корректен";
cl1.savekey("my_key", af);
cl1.savekey(af, user + "$" + mail);
this.label1.Text = "Информация проверена и сохранена";
this.textBox2.Enabled = false;
this.textBox2.Visible = false;
this.textBox3.Enabled = false;
this.textBox3.Visible = false;
this.button2.Enabled = false;
this.button2.Visible = false;
this.label3.Visible = false;
this.label4.Visible = false;
i = 0;
}
else
{
this.label1.Text = "Ключ некорректен" ;
}
//} MessageBox.Show("Введите все данные");
}
}
}
Внешний вид.
Вывод: В результате выполнения лабораторной работы мы научились защищать приложения и регистрировать копии программы с использованием модификации тела программы.
2
Документ
Категория
Рефераты
Просмотров
38
Размер файла
150 Кб
Теги
отчет
1/--страниц
Пожаловаться на содержимое документа