PDA

Просмотр полной версии : [Руководство] [C#] Привязка к железу v2.


Nickitee
14.07.2013, 20:01
Intro
Всем привет! Т.к. привязка v1 была сделана не совсем правильно (особенно хранение hwid) я решил сделать новую версию, на этот раз подменить ответ будет невозможно. Только надо изменять инструкции программы для "кряка". В этой привязке мы сможем задавать время, до которого будет действительна лицензия.

Что нам понадобится

1. Класс для получения HWID (HardWare ID) - скачать ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
2. Класс для работы с RSA на C# - скачать ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
3. PHP скрипты - скачать ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
4. Хостинг с поддержкой PHP - на данном примере я буду использовать хостинг от koding.com (не реклама)
5. MySQL - на данном примере я буду использовать [Ссылки могут видеть только зарегистрированные и активированные пользователи] (не реклама)
6. Microsoft Visual Studio 2008+ с редистрибутивом C# - гугл : )
7. Базовые знания (например как добавить класс в проект)

Начнём

1. Для начала необходимо создать MySQL базу. Для этого зарегистрируемся на [Ссылки могут видеть только зарегистрированные и активированные пользователи] и создадим MySQL базу (не MSSQL).
У вас должно получится что-то типо такого:[Ссылки могут видеть только зарегистрированные и активированные пользователи]

2. Теперь создадим таблицу в MySQL базе данных, где будет храниться информация для лицензии. Для этого зайдём в phpMyAdmin, введём туда данные (пароль после регистрации бд приходит на почту) и нажмём "Создать таблицу", количество полей 2 - с именами "Hardware ID" и "End Time", тип - TEXT, и далее обязательно выставтить сравнение на "utf8_general_ci". и нажать "Сохранить".
[Ссылки могут видеть только зарегистрированные и активированные пользователи]


3. Теперь надо сгенерировать паблик и приват ключи RSA. Для этого создадим проект с шаблоном "Приложение Windows Forms" и назовём его RSAKeysGenerator, далее на основную Form кинем 2 textBox-a, 2 label-a и 1 кнопку. Так же добавим в проект DigitalSign.cs.
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

4. На кнопку а именно в эвент Click запишем код:

string publicKey = String.Empty;
string privateKey = String.Empty;
DigitalSign.AssignNewKey(ref privateKey, ref publicKey);
textBox1.Text = privateKey;
textBox2.Text = publicKey;

Главное не путать textBox-ы куда записываем ключи! (Хотя определить private и public ключи не сложно)

5. Теперь этот проект понадобится только для генерации ключей.

6. Теперь откроем globalsettings.php и изменим настройки:

$RSAprivateKey = "<RSAKeyValue><Modulus></Modulus><Exponent></Exponent></RSAKeyValue>";

Сюда в кавычки мы скопируем приват ключ, у меня получилось так

$RSAprivateKey = "<RSAKeyValue><Modulus>qPATiJQqZiJayNJkknPQ4IhFBXDHWYiBJeSE2QiuRwb5en+58O ADRh6ssXzZIo9CyHDjlLB8ETjkrY4pPjO+SmH9h55tVns/VKyi73rZxDg4+EsenZUXa19z7SuzlhCyq/JXW2/SMSADBBKjch2L+JQuZi46eHxWZVyNFvzKy8XaCWYJFDgk9XYir UZ0XesL/UYMxTjiePCOjZJM6w6X+iUGWZhMcDfXsFnLpWJ1rXPUBGjPJrr nFs7GyKuuyw4UsXkD6jH6R4uiP2392Zf6bHwnQC5xGdT/1kP/kjIa42EakXrwkcQkpJj1SSy9MvYX0TJQ5SKOwi5jXEF0GZAVHw ==</Modulus><Exponent>AQAB</Exponent><P>4aEI1nXR2GLpbdyV5VfQkq5ZlO3/daczu0ns52RE6pgVVO32L+cFsFYJy03d8KmAI5MozZ8BMv15ug 7Hj6m+/RyMQIBOcLHwNLgs/MPzF/BOArbORsDu+6jHr022kN4Org5NLz/3pkVPA/zOuVqIuKGP3mSvxXS+mofiLZoQz3E=</P><Q>v62DvtWjTJ+PDvCxdILRBplVEjFuufCCYSIP6XcsC5jq5hbMiz sOka6WmYaoK8jmyXi1idbWjLU5N/Fj5W0pnslE9lRoDlLD+xmhWuV0TwEeHbLl0+kWJ6CAcMFOFF4L iAbtN6SG0WNw8AJtwOTqjxzlvDVfeck07BGEgzaPBY8=</Q><DP>I8RYV07kDg5X/K9sH6gVCzuSPdagmXEA9V6ZrHCrsBidwRHb5eoUb8ij0tOsLBt ikcEhRb8//GpMIp93KSH6gbtFzG/Kf3jloCXWE9eoMJJKe4mpF3Q8Li6qQPLrzvk0kIj52VSlmHkCN pqb1qwwYjxSRynk50NDd9G0nBABPDE=</DP><DQ>UyEmvTIcc5PT0I/09mnxy6Heclh8BCpZ8VR7gC6OLK1yWr3SkiPXyrjkWcs7zlmAN iqi2RgSzs2d9jQ7tfnlDheOUCMFSgj9ND7GawyOp+D9NbYr1P8 G+8KxUbWUbmLnL2SJpxM04UT2azEydnERhWXsAPdI5CGuUR+7z 8huuOM=</DQ><InverseQ>Lx6Fnqvj7/uo6MxSMm26lHReHTHn8SGFx1mI7Z+4+NgB9hqO+OaCXZ3oQJiS VlHzv7Be+72mPyu6A60Y5DUBAif3NA90vLJ+3hFMeD9jA5KhHD SbOgFoqKzHmedXl+lYQhhhaFpsomInOTMItrSvn1tNwi6RU1pJ Sc2suQT9r5c=</InverseQ><D>O71Buw9h+uH1JoS3yc4os+2cMrNR20hZGxQ3IiRetIEz4WyfTR 16KuaX/N+ATSdJ32WEJMVP6isrOnBGB1f214jVRYrxcR5+I6w0pejUbv3 Or4ao2eKp+G81qE3G4K8g74rv90aQloySZHNO1wC5yXpk+f8o8 AhP6OIUhmd4Mxw9T12sAvdp2Px3FsG4F2r2pF5YNIt8PAcV6uh YiZEdb+qR+HrZOj99Is+aGwuAhlAmsQcOEkARYuYwlYI6ZYjGs YWyEQGscdOMBFXrR6k1zdO6B0gVns5rWHOM82805qU8EPAlf19 fL2Pqf8H1evTsLWQMNnoqqUDDZihD3FwQ4Q==</D></RSAKeyValue>";

Далее

$MySQL_hostname = "sql.site.com";

Мы заменяем на адрес сервера где расположена MySQL БД.
В моём случае:

$MySQL_hostname = "sql3.freesqldatabase.com";

Далее

$MySQL_username = "user";

Мы за меняем на имя пользователя для MySQL бд.
В моём случае:

$MySQL_username = "sql313795";

Далее

$MySQL_password = "password";

Мы заменяем на пароль для пользователя для MySQL бд.
Далее

$MySQL_databasename = "database name";

Мы заменяем на имя базы данной для MySQL.
В моём случае:

$MySQL_databasename = "sql313795";

Далее
Мы заменяем имя таблицы MySQL бд

$MySQL_table = "table name";

В моём случае:

$MySQL_table = "licensetable";

Всё, сохраняем настройки, загружаем все php файлы на сервер.

7. Теперь создадим новый проект тот же шаблон "Приложение Windows Forms". На него кинем 1 richTextBox, 1 кнопку. Добавим в проект DigitalSign.cs и HWIDGrabber.cs
Теперь объявим пару функций (можно прямо в коде формы)

public string getDays(TimeSpan time)
{
return ((time < TimeSpan.Zero) ? String.Format("Лицензия истекла {0} дней {1} часов {2} минут назад", Math.Abs(time.Days).ToString(), Math.Abs(time.Hours).ToString(), Math.Abs(time.Minutes).ToString()) : String.Format("Лицензия активна. Осталось {0} дней {1} часов {2} минут", time.Days, time.Hours, time.Minutes));
}

public static string getSignedText(string[] response)
{
string returned = String.Empty;
for (int i = 0; i < response.Length - 1; i++)
{
returned += response.GetValue(i) + "\r\n";
}
return returned;
}
public static string info(Random rn, Int32 token1,string preKey)
{
string tokenString = String.Format("token={0}&hwid={1}", DigitalSign.EncryptString(token1.ToString(), preKey), HWIDGrabber.GetUHI);
return tokenString;
}
public static string GetRequest(string url, string post)
{
[Ссылки могут видеть только зарегистрированные и активированные пользователи] request = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])[Ссылки могут видеть только зарегистрированные и активированные пользователи](url);
byte[] buffer = Encoding.UTF8.GetBytes(post);
request.ContentType = "application/x-[Ссылки могут видеть только зарегистрированные и активированные пользователи]";
request.ContentLength = buffer.Length;
request.Method = "POST";
Stream newStream = request.GetRequestStream();
newStream.Write(buffer, 0, post.Length);
newStream.Close();
[Ссылки могут видеть только зарегистрированные и активированные пользователи] response = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])request.GetResponse();
StreamReader strReader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(1251));
string WorkingPage = strReader.ReadToEnd();
response.Close();
return WorkingPage;
}


public static string randomStringWithNumbers(int maxlength, Random rn)
{
StringBuilder sb = new StringBuilder();
char[] allowedChars = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
for (int i = 0; i < maxlength; i++)
{
int n = rn.Next(0, allowedChars.Length);
if (char.IsLetter(allowedChars[n]))
{
if (rn.Next(0, 2) == 0)
{
sb.Append(allowedChars[n].ToString().ToUpper());
}
else
{
sb.Append(allowedChars[n]);
}
}
else
{
sb.Append(allowedChars[n]);
}
}
return sb.ToString();
}


Теперь на эвент OnLoad на нашей форме запишем код:

richTextBox1.Text = HWIDGrabber.GetUHI;

p.s. если у вас ругается на ссылки, то вы должны подключить следующие:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;

А если ругается на Managment, то добавьте в ссылки System.Managment в .net ветке

Далее на эвент кнопки Click:

//////////////////////////////////////////////////////////////////////////////////////////
string pubKeyNotXORed = "<RSAKeyValue><Modulus></Modulus><Exponent></Exponent></RSAKeyValue>"; //Сюда в кавычки копируем ПАБЛИК rsa ключ.
//////////////////////////////////////////////////////////////////////////////////////////

Random curRandom = new Random();
string preKey = randomStringWithNumbers(curRandom.Next(15, 21), curRandom);
Int32 XORkey = curRandom.Next(1, int.MaxValue);

///////////////////////////////////////////////////////////////////////////////////////////
string urlToScript = DigitalSign.XOR("[Ссылки могут видеть только зарегистрированные и активированные пользователи]", XORkey); //Вместо site.com/base.php полный путь до скрипта на вашем хостинге
///////////////////////////////////////////////////////////////////////////////////////////

string pubKey = DigitalSign.XOR(pubKeyNotXORed, XORkey);

Int32 token = curRandom.Next(1000000, int.MaxValue);
string infoXORed = DigitalSign.XOR(info(curRandom, token, preKey), XORkey);
string responseXORed = DigitalSign.XOR(GetRequest(DigitalSign.XOR(urlToSc ript, XORkey), DigitalSign.XOR(infoXORed, XORkey)), XORkey);
string[] responseSplitted = DigitalSign.XOR(responseXORed, XORkey).Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
try
{
if (responseSplitted[0].Split('=')[1] == "1")
{

if (Int32.Parse(DigitalSign.DecryptString(responseSpl itted[4], preKey)) == token)
{
if (HWIDGrabber.GetUHI == Encoding.UTF8.GetString(Convert.FromBase64String(r esponseSplitted[1].Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries)[0])))
{
if (DigitalSign.CompareRSAMethod(getSignedText(respon seSplitted), responseSplitted[responseSplitted.Length - 1].Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries)[0], DigitalSign.XOR(pubKey, XORkey)))
{

DateTime CurrentTime = DateTime.Parse(responseSplitted[2].Split('=')[1]);
DateTime EndTime = DateTime.Parse(responseSplitted[3].Split('=')[1]);
TimeSpan ActivatedTime = EndTime.Subtract(CurrentTime);
if (ActivatedTime < TimeSpan.Zero)
{

MessageBox.Show(getDays(ActivatedTime));
//Тут мы что-то делаем, если лицензия истекла
}
else
{
MessageBox.Show(getDays(ActivatedTime));
//Тут мы что-то делаем, если лицензия активна.
}

}
}
}
}
else
{
MessageBox.Show("Лицензии не обнаружено!");
}
}
catch (Exception ex)
{
MessageBox.Show("Ошибка!\nКатастрофа!\nАхтунг!");
//AnyErrors
}


8. Запускаем, видим что в richTextBox появился наш HWID.
Жмём на кнопку, получаем
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

9. Идём в phpMyAdmin, открывает нашу таблицу выбираем "Вставить", в Hardware ID пишем то, что выдал richTextBox, в EndTime время окончания, строго в таком формате: 14.07.2013 20:00:00
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

10. Опять нажимаем на кнопку, и получаем:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

11. Пробуем поставить время окончания лицензии раньше нашего текущего времени, получем:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]


Заключение

Я сделал лишь основу, дальше вы можете модернизировать, как вам захочется, сделать автоматическое добавление в базу и т.д.
Самое главное - это обезопасить себя от декомпиляции кода, полностью обезопасить - невозможно, но от обычных юзеров можно.
Для этого делаем скрытые проверки, делаем условия из нескольких переменных типа int на основе математики и так далее... Ну и конечно использовать обсуфикаторы.

За основу для работы с RSA на php были взяты скрипты от Jim Wigginton

Гайд подготовил Nickitee специально для zhyk.ru
Автор не несёт ответственности за пользование информацией
При копировании на другие сайты/блоги/форумы и т.п. - указывать автора

Роман1231
14.07.2013, 20:13
Спасибо, очень хороший урок

pqsl
14.07.2013, 20:40
Мне очень нравятся книги Криса Касперски. В одной он дал совет, никогда! не используйте привязку через интернет. Все это ловиться снифером, пишется hook ws2_32 и...собственно все.
Как вариант, использование собственных упаковок, которые без какой либо проверки прогоняют код, юзер платит за ключ, и получает декодер. Если ключ не верный, юзер получает мусор. Ну или, самомодификация кода.
Все эти messagebox, label вообще любое сообщение о неверном/верном, выдают вас! Считайте, что вашу защиту уже поломали :)

Добавлено через 35 минут
#include <stdio.h>
#include <stdlib.h>

#define STEP1 14
#define STEP2 27

main(void)
{
unsigned char *str = "This is sample text";
unsigned char *temp = (unsigned char *)malloc(strlen(str));
int i = 0;
for(; i < strlen(str); i++)
{
temp[i] = (unsigned char *)(str[i] ^ STEP1);
temp[i] = (unsigned char *)(str[i] ^ STEP2);
}
for(i = 0; i < strlen(temp); i++)
printf("%c", temp[i]);


printf("\n");
unsigned char *decode_temp = (unsigned char *)malloc(strlen(temp));
for(i = 0; i < strlen(temp); i++)
{
decode_temp[i] = (unsigned char *)(temp[i] ^ STEP1);
decode_temp[i] = (unsigned char *)(temp[i] ^ STEP2);
}
for(i = 0; i < strlen(decode_temp); i++)
printf("%c", decode_temp[i]);

printf("\n");
free(temp);
free(decode_temp);
return 0;
}
Простейший пример моей идеи, что мешает продавать юзеру STEP1/STEP2 ?
А в str можно засунуть, секцию .code и прогнать :) Можно вообще все, включая заголовки.

Nickitee
14.07.2013, 21:17
Мне очень нравятся книги Криса Касперски. В одной он дал совет, никогда! не используйте привязку через интернет. Все это ловиться снифером, пишется hook ws2_32 и...собственно все.
Как вариант, использование собственных упаковок, которые без какой либо проверки прогоняют код, юзер платит за ключ, и получает декодер. Если ключ не верный, юзер получает мусор. Ну или, самомодификация кода.
Все эти messagebox, label вообще любое сообщение о неверном/верном, выдают вас! Считайте, что вашу защиту уже поломали :)
Ты думаешь?
Я разве не писал что тут нельзя подменить ответ?
И если накрыть приличным пакером типо Themida, то врядле рядовой юзер что-то сделает...

pqsl
14.07.2013, 21:22
Ты думаешь?
Я разве не писал что тут нельзя подменить ответ?
И если накрыть приличным пакером типо Themida, то врядле рядовой юзер что-то сделает...

Я не силен в C#, объясни почему нельзя подменять ?
Themida умеет шифровать исходящий трафик ? :)

Nickitee
14.07.2013, 21:53
Я не силен в C#, объясни почему нельзя подменять ?
Themida умеет шифровать исходящий трафик ? :)
Окей, объясню.
Мы шлём на скрипт закриптованный токен и не закриптованный hwid.
Ответ получаем в таком формате:

license=1
[[TklWSURHQUZlcm9lY1RHNVgwNWlUU0FTVWVUQ0tNT1VQRVRJUk NOTS43VDIwMDQxMjA1ODA0NTFaMERKTEcz]]"
CT=14.07.2013 20:45:32
ET=14.07.2013 13:00:00
TjtWP+bKKO8894lV7UpiMDduEMN0OB/N9c2sqiRsB7I=
[[MdWJUFZ0X667nenqUQEfdwM4O50quX5KfCnyCg9Sp7yaNvtMxt FMSfs23ZamJHzESgXg6cy/FFp5SqjdyFse0DKaZY4sD9WEsOX6VDIpwJpXtHkD5iK8EXJK0e CccSq14CHa5F2KG5w2HIPY9XVU0m5xKeq3blBC+QTdTK0QAsit 6UQi5nMIaIsUQ1Cg0iVSMkYUtE8ucE74hZbwDvwXRQdLeC9Diq iAgT8zEEq6KDkzdsc52Gl7KC8c7qyX5r...

В коде мы в первую очередь проверяем license=1, далее мы проверяем HWID, чтобы нельзя было зная чужой HWID работать с программой, далее идут CT - текущее время, которое выводит сервер и ET - время окончания взятое с БД, дальше идёт закриптованный токен, он декриптуеся по случайно сгенерированому ключу и сверяется так же с токеном в программе, и в конце всё подписывается RSA-2048 и через паблик ключ проверяется подпись.

pqsl
14.07.2013, 21:58
Окей, объясню.
Мы шлём на скрипт закриптованный токен и не закриптованный hwid.
Ответ получаем в таком формате:

license=1
[[TklWSURHQUZlcm9lY1RHNVgwNWlUU0FTVWVUQ0tNT1VQRVRJUk NOTS43VDIwMDQxMjA1ODA0NTFaMERKTEcz]]"
CT=14.07.2013 20:45:32
ET=14.07.2013 13:00:00
TjtWP+bKKO8894lV7UpiMDduEMN0OB/N9c2sqiRsB7I=
[[MdWJUFZ0X667nenqUQEfdwM4O50quX5KfCnyCg9Sp7yaNvtMxt FMSfs23ZamJHzESgXg6cy/FFp5SqjdyFse0DKaZY4sD9WEsOX6VDIpwJpXtHkD5iK8EXJK0e CccSq14CHa5F2KG5w2HIPY9XVU0m5xKeq3blBC+QTdTK0QAsit 6UQi5nMIaIsUQ1Cg0iVSMkYUtE8ucE74hZbwDvwXRQdLeC9Diq iAgT8zEEq6KDkzdsc52Gl7KC8c7qyX5r...

В коде мы в первую очередь проверяем license=1, далее мы проверяем HWID, чтобы нельзя было зная чужой HWID работать с программой, далее идут CT - текущее время, которое выводит сервер и ET - время окончания взятое с БД, дальше идёт закриптованный токен, он декриптуеся по случайно сгенерированому ключу и сверяется так же с токеном в программе, и в конце всё подписывается RSA-2048 и через паблик ключ проверяется подпись.

В дебагере будет видно, что делают с пакетом :) Никуда не денешься от этого

Nickitee
14.07.2013, 22:00
В дебагере будет видно, что делают с пакетом :) Никуда не денешься от этого
А зачем тогда пакеры? Тем более на сравнивай натив и .net.
----
Да и вообще, скомпиль, накрой каким-нибудь пакером, а потом попробуй снять и подменить ответ.

pqsl
14.07.2013, 22:02
А зачем тогда пакеры? Тем более на сравнивайй натив и .net.
----
Да и вообще, скомпиль, накрой каким-нибудь пакером, а потом попробуй снять и подменить ответ.

Я не сравниваю. Я выдвигаю абстрактные теории/способы :)
У меня нет Windows. Да если и был бы, что тогда ? Запакую я паблик пакером и т.д Транслирую шифр из машинного на Си и т.д На паблик пакер можно найти распаковку, если конечно Вы не дадите мне ключ :D
Да и та же темида, распакует программу в память. Делаем дамп, восстанавливаем oep, import list и т.д

Nickitee
14.07.2013, 22:03
Я не сравниваю. Я выдвигаю абстрактные теории/способы :)
Ну вот, теории никому не нужны. Только работающие способы. :pandal:
Да и тем более, по теории всё крякается, а на самом деле - не всё.

Sinyss
15.07.2013, 01:28
Ну вот, теории никому не нужны. Только работающие способы.
Ахахах, попробуй это сказать гуглу или любой другой серьезной исследовательской конторе.
Если сделать всё правильно, привязка действительно будет действовать до модификации самой программы или полного, я повторяю, ПОЛНОГО копирования скриптов которые работают на сервере и подмены этого самого сервера.

Nickitee
15.07.2013, 12:15
Ахахах, попробуй это сказать гуглу или любой другой серьезной исследовательской конторе.
Если сделать всё правильно, привязка действительно будет действовать до модификации самой программы или полного, я повторяю, ПОЛНОГО копирования скриптов которые работают на сервере и подмены этого самого сервера.
Угу, только до самого полнейшего копирования всех скриптов на сервере.
Включая приват RSA ключ. Но это довольно таки сложно, даже не рядовому юзеру.

object
15.07.2013, 19:14
Что же вы такого пишите, что боитесь за кряк к вашей софтине?/bonk

Nickitee
16.07.2013, 12:18
У меня нет Windows. Да если и был бы, что тогда ? Запакую я паблик пакером и т.д Транслирую шифр из машинного на Си и т.д На паблик пакер можно найти распаковку, если конечно Вы не дадите мне ключ :D
Да и та же темида, распакует программу в память. Делаем дамп, восстанавливаем oep, import list и т.д
На паблик пакер можно найти распаковку? Да ладно... Вы хотябы раз что-нибудь на виндовсе распаковывли? Ну и сделаешь ты дамп, а там будет не читабельный код, что дальше?

pqsl
16.07.2013, 15:25
На паблик пакер можно найти распаковку? Да ладно... Вы хотябы раз что-нибудь на виндовсе распаковывли? Ну и сделаешь ты дамп, а там будет не читабельный код, что дальше?

Да бывало дело.
Прогоняя программу по пакеру/криптору на выходе мы получаем набор байт с высокой энтропией. Нам нужен загрузчик, который бы распаковывал программу и запускал. Так вот, что мешает дебажить загрузчик и поймать pe вашей программы ?

Nickitee
16.07.2013, 17:09
Да бывало дело.
Прогоняя программу по пакеру/криптору на выходе мы получаем набор байт с высокой энтропией. Нам нужен загрузчик, который бы распаковывал программу и запускал. Так вот, что мешает дебажить загрузчик и поймать pe вашей программы ?
Давайте без ваших "абстрактных теорий".
Запакуйте программу тем же Confuser-ом и попробуйте снять ручками и получить читабельный код.

iamzero
17.07.2013, 02:02
Конешно :) не хочется терять свой приват софт :sad:


Надо не так юзеров завлекать, а нормальными обновами и добавлением новых фишек...
Если делать частые обновы - ломать замучаются

pqsl Крэкни любой забугорный чит, они все на такой привязке, вот и посмотрим на твой скил

pqsl
17.07.2013, 02:28
Надо не так юзеров завлекать, а нормальными обновами и добавлением новых фишек...
Если делать частые обновы - ломать замучаются

pqsl Крэкни любой забугорный чит, они все на такой привязке, вот и посмотрим на твой скил

Я сказал, что я крутой крэкер ? Еще раз, для тех кто в танке, хоть ИИ всуньте в вашу программу которая нахрен посылать будет. С подобной защитой от сниффера вы никуда не денетесь, а взломать защиту вопрос времени. Вся защита работает на едином принципе, шифрованный байт код и загрузчик.

Sinyss
17.07.2013, 03:00
С подобной защитой от сниффера вы никуда не денетесь, а взломать защиту вопрос времени.
Пару лет, если подбором...
Надо не так юзеров завлекать, а нормальными обновами и добавлением новых фишек...
Если делать частые обновы - ломать замучаются
Не ко всему можно обнову сделать...

iamzero
18.07.2013, 15:15
Не ко всему можно обнову сделать...
Например?

Ок тогда облачные технологии, только кое кто сейчас начнет писать " да что там, сервер взломал да и все".

Sinyss
18.07.2013, 17:02
Например?

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

iamzero
18.07.2013, 20:29
Например, (походу самые популярные проги форума) бруты, раз написал и будет работать пока протокол не поменяют, а когда это еще будет... единственное что можно модифицировать - добавить функционал чекера, но это можно впилить в другую прогу и продать отдельно...
Так же разнообразные маил/аккаунт чекеры, новых функций просто слишком мало для добавления...

к сожелению мы живем в суровом мире где протаколы меняют ну оч часто)

Sinyss
19.07.2013, 16:20
к сожелению мы живем в суровом мире где протаколы меняют ну оч часто)
Да не так уж.

Роспотребнадзор
20.07.2013, 21:47
Самое главное - это обезопасить себя от декомпиляции кода, полностью обезопасить - невозможно, но от обычных юзеров можно.
Сжать, и пройтись по эксешнику Net Reactor'ом достаточно?

Роман1231
20.07.2013, 21:49
Сжать, и пройтись по эксешнику Net Reactor'ом достаточно?
Для нубов этого достаточно, а если серьёзные люди займутся декомпиляцией, то маловато будет,если знаешь чем защищали гораздо легче декомпилить

Роспотребнадзор
21.07.2013, 09:23
Для нубов этого достаточно, а если серьёзные люди займутся декомпиляцией, то маловато будет,если знаешь чем защищали гораздо легче декомпилить
Т.е интерпретируемые языки ломаются проще, чем компилируемые?

warl0ck
21.07.2013, 14:58
я не думаю что хоть кто-то захочет разбираться в таком "коде" ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

Nickitee
21.07.2013, 15:14
я не думаю что хоть кто-то захочет разбираться в таком "коде" ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
Дык, эти длинные названия функций можно превратить в function1, function2.
Дальше понять, что делает каждая функция и исходя из этого запатчить.
Есть куда более сложные алгоритмы.

warl0ck
21.07.2013, 15:29
Дык, эти длинные названия функций можно превратить в function1, function2.
Дальше понять, что делает каждая функция и исходя из этого запатчить.
Есть куда более сложные алгоритмы.

даже если переименовать, даже если убрать лишние делегаты\методы\енкриптед строки, то батхёрт который у тебя появиться способен растопить Антарктиду

Nickitee
21.07.2013, 19:37
даже если переименовать, даже если убрать лишние делегаты\методы\енкриптед строки, то батхёрт который у тебя появиться способен растопить Антарктиду
Забомбит только у создателя программы, когда крякнут его программу.

alex_kg
02.10.2013, 09:23
Почитав тему я понял что тут щитают её так сказать нубской :)
Но т.к я в шарпе нуб ещё то щитаю что тема очень даже ничего)
Лично я много чего усвоил после прочтения темы автору онромное спасибо)

Nickitee
05.10.2013, 21:07
Почитав тему я понял что тут щитают её так сказать нубской :)
Но т.к я в шарпе нуб ещё то щитаю что тема очень даже ничего)
Лично я много чего усвоил после прочтения темы автору онромное спасибо)
Ну кто-то тут распинался, что любую привязку через инет можно крякнуть подменой, но никто пока ничего не сделал, да и не сделает. (Ибо те же переводы WebMoney, YandexMoney и т.п. можно было подменять, как угодно)

andrei7
08.10.2013, 07:14
Ну кто-то тут распинался, что любую привязку через инет можно крякнуть подменой, но никто пока ничего не сделал, да и не сделает. (Ибо те же переводы WebMoney, YandexMoney и т.п. можно было подменять, как угодно)
Я сделал - [Ссылки могут видеть только зарегистрированные и активированные пользователи] ;)
Правда там совсем другой алгоритм, и написана на делфи... но сути не меняет. Зачем ты пишешь о подмене денег? Нет, если ты можешь в ОФЛАЙН режиме покупать что то - то вопросов нет /problem

Окей, объясню.
Мы шлём на скрипт закриптованный токен и не закриптованный hwid.
Ответ получаем в таком формате:

license=1
[[TklWSURHQUZlcm9lY1RHNVgwNWlUU0FTVWVUQ0tNT1VQRVRJUk NOTS43VDIwMDQxMjA1ODA0NTFaMERKTEcz]]"
CT=14.07.2013 20:45:32
ET=14.07.2013 13:00:00
TjtWP+bKKO8894lV7UpiMDduEMN0OB/N9c2sqiRsB7I=
[[MdWJUFZ0X667nenqUQEfdwM4O50quX5KfCnyCg9Sp7yaNvtMxt FMSfs23ZamJHzESgXg6cy/FFp5SqjdyFse0DKaZY4sD9WEsOX6VDIpwJpXtHkD5iK8EXJK0e CccSq14CHa5F2KG5w2HIPY9XVU0m5xKeq3blBC+QTdTK0QAsit 6UQi5nMIaIsUQ1Cg0iVSMkYUtE8ucE74hZbwDvwXRQdLeC9Diq iAgT8zEEq6KDkzdsc52Gl7KC8c7qyX5r...

В коде мы в первую очередь проверяем license=1, далее мы проверяем HWID, чтобы нельзя было зная чужой HWID работать с программой, далее идут CT - текущее время, которое выводит сервер и ET - время окончания взятое с БД, дальше идёт закриптованный токен, он декриптуеся по случайно сгенерированому ключу и сверяется так же с токеном в программе, и в конце всё подписывается RSA-2048 и через паблик ключ проверяется подпись.
печально это все :sceptic: Дата окончания в открытом формате, ее легко подменить. Шлем запрос, получаем токен и тд., далее подменяем даты и отсылаем программе - и вуаля :goplol:

ResidentEvil2
08.10.2013, 11:53
Может я конечно не прав, но... собрались такие знатоки. Каждый постит "умную" идею взлома данного метода "защиты". Помнится мне автор в конце статьи написал :
Я сделал лишь основу, дальше вы можете модернизировать, как вам захочется
Если у Вас есть идеи лучше - предложите. Напиши статью. Все бросают камни, какая слабая защита и как все перехватывается и подменяется в трафике... :omg:
Конечно .Net не может похвастаться nativ'ом, что определенно минус. И любой протектор\обфускатор снимается. Конечно снимается. Вопрос только в уровне человека, который будет этим заниматься. Ведь если захотят - снимут в любом случае. Взламывают софт Microsoft, Adobe, а тут не снимут пакер или не разберут "обфусцированный" код ? Тут важна реализация метода. Лично я для себя вынес некоторые интересные моменты.
Автор старался, написал статью, причем довольно подробно.

Отличная статься на мой взгляд, автору - Большое спасибо.

Nickitee
10.10.2013, 01:22
печально это все :sceptic: Дата окончания в открытом формате, ее легко подменить. Шлем запрос, получаем токен и тд., далее подменяем даты и отсылаем программе - и вуаля :goplol:
Я потратил приличное количество времени, чтобы найти все возможные уязвимости в подмене данных.
При измене даты = > должна смениться подпись.
Всё, дальнейшие проверки уже не нужны, ибо тут уже есть ошибка.

Zizipuza
14.10.2013, 01:54
5. Теперь этот проект понадобится только для генерации ключей.
Я так понял, что ключи, сколько не тыкай на батон, будут одни и те же. Подскажите, пожалуйста, как сменить пару?

Вопрос снят. Спасибо, что никто не ответил :-)
Пришлось покопаться... Узнал много полезного.
Дабы сменить пару ключей, нужно изменить имя ключа в "CONTAINER_NAME".

Nickitee
21.10.2013, 19:34
Я так понял, что ключи, сколько не тыкай на батон, будут одни и те же. Подскажите, пожалуйста, как сменить пару?

Вопрос снят. Спасибо, что никто не ответил :-)
Пришлось покопаться... Узнал много полезного.
Дабы сменить пару ключей, нужно изменить имя ключа в "CONTAINER_NAME".
Странно, я вызвал несколько раз функцию генерации ключей, и они всегда разные были.

Hermein
11.12.2013, 03:23
1) Зачем использовать статик CspParameters, если ключи всегда должны быть разными?

RSACryptoServiceProvider RsaKey = new RSACryptoServiceProvider(2048);
string publickey = RsaKey.ToXmlString(false); //получим открытый ключ
string privatekey = RsaKey.ToXmlString(true); //получим закрытый ключ

2) Все очень плохо в плане кодировок, где-то ASCII, где-то Unicode, а что делать, если на сервере установлен UTF-8 и собственно скрипты будут именно в UTF-8 и нужно подписать русский текст? Не проще ли перевести все в UTF-8?

3) Непонятно что за соль и откуда она взялась или ее можно хоть рандомно генерировать? Если так, то какое число символов? Ограничения на кодировки и символы?

//Ivan Medvedev
PasswordDeriveBytes pdb = new PasswordDeriveBytes(Password, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });


ps: самое главное, пожалуй, все же - это 1 вид кодировки, почему именно UTF-8 я думаю итак понятно.

Denis170597
12.12.2013, 18:51
а мне так ни кто и не помог у мя получается что то типо ошибки соединения с бд

Hermein
12.12.2013, 19:05
а мне так ни кто и не помог у мя получается что то типо ошибки соединения с бд

Что-то типа? Это как?
Конкретный код ошибки и описание лучше бы приложили и вообще, если все настроено правильно, то никаких ошибок не возникает, особенно с БД /md

Denis170597
13.12.2013, 16:37
Что-то типа? Это как?
Конкретный код ошибки и описание лучше бы приложили и вообще, если все настроено правильно, то никаких ошибок не возникает, особенно с БД /md



вроде всё правильно сделал. Как я понял это толь ошибка коннекта с бд или с чекером:nono: оно мне кидает такое [Ссылки могут видеть только зарегистрированные и активированные пользователи]

Nickitee
13.12.2013, 21:06
вроде всё правильно сделал. Как я понял это толь ошибка коннекта с бд или с чекером:nono: оно мне кидает такое [Ссылки могут видеть только зарегистрированные и активированные пользователи]
Брякай exception, нету другого выхода.

Denis170597
13.12.2013, 21:36
Брякай exception, нету другого выхода.

обясни по проще нубу))) пожжж/kidding

Nickitee
15.12.2013, 21:02
Обновил класс для C# с учётом всех пожеланий /nyan

Hermein
19.12.2013, 12:31
Уже весь мозг поломал :-(
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

Nickitee
19.12.2013, 16:38
Уже весь мозг поломал :-(
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Обновил ещё раз, там просто надо было соль убрать.

Hermein
19.12.2013, 18:38
Обновил ещё раз, там просто надо было соль убрать.

Да, теперь все сразу запахало, еще методу XOR требуется public static, а не private :rolleyeyes: /nyan

Nickitee
19.12.2013, 21:18
Да, теперь все сразу запахало, еще методу XOR требуется public static, а не private :rolleyeyes: /nyan
Исправил.

DonatX
23.12.2013, 00:09
загружаем все php файлы на сервер
как это сделать? там нету не FTP не чего другова. Помогите!

Nickitee
23.12.2013, 00:38
как это сделать? там нету не FTP не чего другова. Помогите!
Какой вы используете хостинг - я не знаю.
Но почти все хостинги предоставляют FTP доступ.

esim
12.02.2014, 20:12
При проверке сообщения сколько осталось не выдает. ПОМОГИТЕ ! ! !

MembRupt
12.02.2014, 22:34
При проверке сообщения сколько осталось не выдает. ПОМОГИТЕ ! ! !
Отладка в помощь. Если всё верно отсюда скопировали, то проверьте таблицу MySQL и скрипты, быть может пропустили что-нибудь

aleksin19
19.02.2014, 15:34
А на vb.net такое можно сделать?
А ток конвертирую всё под vb но в классе RSA ошибки.
И можно как то делать без RSA и DigitalSign класса

Sinyss
19.02.2014, 15:51
А на vb.net такое можно сделать?
А ток конвертирую всё под vb но в классе RSA ошибки.
И можно как то делать без RSA и DigitalSign класса
Воспользоваться встроенными в .Net классы...

MembRupt
19.02.2014, 16:59
А на vb.net такое можно сделать?
А ток конвертирую всё под vb но в классе RSA ошибки.
И можно как то делать без RSA и DigitalSign класса

Ну ошибки само собой будут, поймите какие операции на c# синонимичны вашим и можно большую часть работы сделать обычным поиском с заменой

Cassa
13.05.2014, 05:24
Подниму тему, надеюсь пинать не будете )
В таком формате можно, что бы при определенных обстоятельствах вызывался конкретный метод в программе?
Тоесть, что бы этот метод передавался в ответе?

Апдейт
Уже нагуглил как, вот только забыл для чего мне это было нужно...

shalkoff
20.05.2014, 18:33
У меня при нажатии на кнопку "Авторизации" выводит ошибку:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
При этом за день до этой ошибки всё работало нормально, не подскажите в чём дело?
Код ощибки:
System.Net.WebException не обработано
HResult=-2146233079
Message=Время ожидания операции истекло
Source=System
StackTrace:
в System.Net.[Ссылки могут видеть только зарегистрированные и активированные пользователи]()
в HackNero.Form1.GetRequest(String url, String post) в c:\Users\imya\Documents\Visual Studio 2012\Projects\Project\Project\Form1.cs:строка 55
в HackNero.Form1.button1_Click(Object sender, EventArgs e) в c:\Users\imya\Documents\Visual Studio 2012\Projects\Project\Project\Form1.cs:строка 107
в System.Windows.Forms.Control.OnClick(EventArgs e)
в System.Windows.Forms.Button.OnClick(EventArgs e)
в System.Windows.Forms.Button.OnMouseUp(MouseEventAr gs mevent)
в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
в System.Windows.Forms.Control.WndProc(Message& m)
в System.Windows.Forms.ButtonBase.WndProc(Message& m)
в System.Windows.Forms.Button.WndProc(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.O nMessage(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.W ndProc(Message& m)
в System.Windows.Forms.NativeWindow.DebuggableCallba ck(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
в System.Windows.Forms.UnsafeNativeMethods.DispatchM essageW(MSG& msg)
в System.Windows.Forms.Application.ComponentManager. System.Windows.Forms.UnsafeNativeMethods.IMsoCompo nentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
в System.Windows.Forms.Application.ThreadContext.Run MessageLoopInner(Int32 reason, ApplicationContext context)
в System.Windows.Forms.Application.ThreadContext.Run MessageLoop(Int32 reason, ApplicationContext context)
в System.Windows.Forms.Application.Run(Form mainForm)
в HackNero.Program.Main() в c:\Users\imya\Documents\Visual Studio 2012\Projects\Project\Project\Program.cs:строка 19
в System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
в Microsoft.VisualStudio.HostingProcess.HostProc.Run UsersAssembly()
в System.Threading.ThreadHelper.ThreadStart_Context( Object state)
в System.Threading.ExecutionContext.RunInternal(Exec utionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionCon text executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionCon text executionContext, ContextCallback callback, Object state)
в System.Threading.ThreadHelper.ThreadStart()
InnerException:

MembRupt
20.05.2014, 19:24
Попробуйте указать таймаут секунд 20
И вообще проверьте - с браузера на сайт заходит?

shalkoff
20.05.2014, 19:33
Сейчас проверил на ноуте, там нормально работает! Без ошибок. Эт что-то у меня на компе!

1)типо :
System.Threading.Thread.Sleep(20000);
[Ссылки могут видеть только зарегистрированные и активированные пользователи] response = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])request.GetResponse();
2)С браузера заходит! Отключал ативирус фаервол и т.д. Думал в них, пока не разобрался!

MembRupt
20.05.2014, 19:46
Сейчас проверил на ноуте, там нормально работает! Без ошибок. Эт что-то у меня на компе!

1)типо :
System.Threading.Thread.Sleep(20000);
[Ссылки могут видеть только зарегистрированные и активированные пользователи] response = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])request.GetResponse();
2)С браузера заходит! Отключал ативирус фаервол и т.д. Думал в них, пока не разобрался!

Это не таймаут, а пауза в работе. Таймаут задается как свойство [Ссылки могут видеть только зарегистрированные и активированные пользователи]
Когда проверяете программу, ошибка вылетает сразу или после ожидания ответа сервера?

shalkoff
20.05.2014, 22:04
После ожидания.



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

MembRupt
20.05.2014, 22:25
После ожидания.



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

Если рассуждать, раз на ноутбуке всё в порядке, программа одна и та же, интернет соединение тоже так понимаю одно и то же
Значит дело в компьютере
Всё-таки проблема где-то в блокировке соединения, можете посмотреть через сниффер
Запрос может и не начинается, а может как-то сайт запрещает

shalkoff
20.05.2014, 22:56
через [Ссылки могут видеть только зарегистрированные и активированные пользователи] смотрел, строка с обращением к base.php высвечивается!

Nickitee
23.05.2014, 21:46
через [Ссылки могут видеть только зарегистрированные и активированные пользователи] смотрел, строка с обращением к base.php высвечивается!
Окей, что дальше? /dgs

NyZze
27.05.2014, 07:28
Извиняюсь,тема уже старая.Но для меня очень полезная. Тоже самое что чуть ниже..Как это решить?


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

MembRupt
27.05.2014, 07:59
Извиняюсь,тема уже старая.Но для меня очень полезная. Тоже самое что чуть ниже..Как это решить?


Проверяйте доступность сервера, блокировки со стороны антивируса и провайдера
У меня уже не первый месяц всё работает без перебоев

NyZze
27.05.2014, 08:18
Проверяйте доступность сервера, блокировки со стороны антивируса и провайдера
У меня уже не первый месяц всё работает без перебоев

Антивируса нету,провайдер вроде не блокирует.
/base.php ссылка не открывается,txt открывает .
В чем дело не знаю((

Добавлено через 1 час 18 минут
Прошлую проблему решил,не создал папки на хостинге. Появилась новая,Пишет лицензии не обнаружено,хотя все правильно сделал.


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

MembRupt
27.05.2014, 10:30
Сверьте всё со статьей
Может базу данных не указали, неправильно написан пароль или имя пользователя, ищите сами, ваших исходников нет у нас

NyZze
27.05.2014, 11:22
Я уже отчаялся,все проверял раз 100.Все то же самое.Кому не сложно помогите пожалуйста.
Вот сам проект
Вот Вт
[Ссылки могут видеть только зарегистрированные и активированные пользователи] f14603d7296232/analysis/1401174999/
Вот сам архив

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

DeathAngel
27.05.2014, 13:25
Я уже отчаялся,все проверял раз 100.Все то же самое.Кому не сложно помогите пожалуйста.
Вот сам проект

Немного изменил. Зачем ты вешал обработку на "richTextBox1_TextChanged" ?

Ссылка: [Ссылки могут видеть только зарегистрированные и активированные пользователи]
Все файлы с php скриптами залей на хостинг (или только файл globalsettings.php обнови), у тебя там подключение к базе не верно было указано.

cloc
27.08.2014, 18:26
помогите вот скайп мне срочно нужно

Добавлено через 40 минут
а всё сделал спасибоо

UkrainaNazi
06.09.2014, 11:10
можно ли обойти эту привязку?

Sinyss
06.09.2014, 12:42
можно ли обойти эту привязку?
Любую привязку можно обойти

Роман1231
06.09.2014, 12:54
Любую привязку можно обойти
вопрос лишь в том хватить ли навыком и времени обойти такую привязку.Разумеется, новичок в этом деле эту привязку не обойдёт, а вот тот кто по умнее, ему придётся подумать

Sinyss
06.09.2014, 13:47
вопрос лишь в том хватить ли навыком и времени обойти такую привязку.Разумеется, новичок в этом деле эту привязку не обойдёт, а вот тот кто по умнее, ему придётся подумать
Ну вообще снимается почти так же как и любая другая... Снимается пакер и выкидывается всё ненужное. А далее собирается обратно.
Тут защита по сути только от подмены сервера и то если не знаешь как оно работает...

Nickitee
06.09.2014, 19:24
вопрос лишь в том хватить ли навыком и времени обойти такую привязку.Разумеется, новичок в этом деле эту привязку не обойдёт, а вот тот кто по умнее, ему придётся подумать
Естественно если доберутся до твоего сурсника - никакая защита не поможет, как вариант лучшей защиты - если твоя программа требует каких-то значений для работы - грузить их с сервера при проверки лицензии прямо на сервере.
В теории даже если твою программу хакнут, то без данных с сервера она работать не будет.

cloc
07.09.2014, 01:41
я понемаю тема старая но всё же как сделать перевязку

Роман1231
07.09.2014, 12:46
я понемаю тема старая но всё же как сделать перевязку

что за перевязку?мб перепривязку?тогда создай новый ключ

realavril7
20.09.2014, 18:39
можно ли обойти эту привязку?


Запускаем защищенную программу с флагом CREATE_SUSPENDED и ищем (или по заранее найденным офсетам)
паблик ключ и адрес сервера, которые меняем на свои (по строке "<RSAKeyValue>" кстати удобно искать).

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

Бюджетный вариант кряка (для тех у кого нет хостинга) это перехват winapi криптования и подмена результата, конкретно функции вызываемые незнаю т.к. ничего не крякаю, но дорогу осилит идущий...

Оригинальный вариант кряка это SQL-inject , т.к. параметр $hwid в сорцах не фильтруется, можно выполнить произвольную комманду,
добавить свой серийник или еще что похуже... (детальное описание приводить не буду, но тот кто знаком с синтаксисом запросов поймет)
mysql_real_escape_string лечит это недуг.


Несмотря на это, данная привязка вполне нормальная, так-что юзай без сомнения я бы еще отказался от мускула (на это много причин)
+ и добавил детект виртуалок на сервере или в программе (опционально)


Серийник:

Например у меня генерация построена так - минимум два уникальных идентификатора (фильтруем неуникальные идентификаторы типа:

"TOBEFILLEDBYOEM" ,
"SYSTEMSERIALNUMBER" ,
"123490EN400015" ,
"BSN12345678901234567" ,
"BASEBOARDSERIALNUMBER" ,
"N/A",
"NONE",
"BSN12345678901234567",
"FFFFFFFF",
"INVALID",
"NB-1234567890"

и отправляем все что наковыряли на сервер, обычно выходит их 3-4, сервер проверяет - если два идентификатора совпали то клиент опознан.

Идентификаторы могут меняются при переустановке ОС, первый раз заметил когда один пользователь переустановил винду и у него
вместо серийника жесткого стала приходить пустая строка, так-же при частичном апгрейде может что-то поменятся, вообщем это избавило меня от ненужных хлопот.


Конечно еще не хватает админки, со статистикой и "базовым администрированием", скриптами оплаты эх...
Если кто-то желает обьедениться в написании оной то пишите в лс, т.к. писать красивые формы я так и не научился ^^ скрин моей развалины ( ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

WoOdy774
29.10.2014, 09:20
Помогите пожалуйста, я уже сутки мусолю этот код, не фига не получается.

Все файлы в архиве : [Ссылки могут видеть только зарегистрированные и активированные пользователи]
Хостинг: Danver

Ах да и вот еще:
Поставил вывод ошибки,

catch (Exception ex)
{
MessageBox.Show(Convert.ToString(ex));

}

и у меня такая ошибка вот:


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

MembRupt
29.10.2014, 10:11
Помогите пожалуйста, я уже сутки мусолю этот код, не фига не получается.
Попробуйте на бесплатном хостинге, таких полно
Видимо не получаете ответа от сервера (либо совсем пусто, либо неполная первая строка)
Включаете сниффер и запускаете, смотрите что отвечает сервер

WoOdy774
29.10.2014, 11:04
Включаете сниффер и запускаете, смотрите что отвечает сервер
На отлидчике в первой строчке где долно быть license=0/1
у меня показывает вот:
[1] "<b>Warning</b>: mysql_num_rows() expects parameter 1 to be resource, boolean given in <b>/home/u819640911/public_html/base.php</b> on line <b>16</b><br />" string

А lincense переходит на четвертую строчку.
[4] "license=0" string

И ошибка опять возникает, та же...


Что за ошиюбка то: mysql_num_rows() expects parameter 1 to be resource, boolean given in /home/u819640911/public_html/base.php on line 16

MembRupt
29.10.2014, 11:32
Что за ошиюбка то: mysql_num_rows() expects parameter 1 to be resource, boolean given in /home/u819640911/public_html/base.php on line 16
Для этого есть "Поиск". Проверьте поля в таблице, да и сам запрос к ней

WoOdy774
29.10.2014, 12:17
Для этого есть "Поиск". Проверьте поля в таблице, да и сам запрос к ней
Дай ссылку на хостинг с удаленным доступом к mysql бесплатный какой нибудь.

BearHack
23.11.2014, 14:08
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
:z:
Я НЕПОНЯЛ КАК ПОСТАВИТЬ ПРАВИЛЬНО КОД ВО ВТОРОЙ ПРГЕ НА КНОПКУ ЧТОБ НЕБЫЛО ОШИБОК

Ginrey
24.11.2014, 23:19
Ваш сервер отдает защищаемой программе желаемый результат который вы уже предварительно перехватили
(снифером думаю не трудно воспользоватся и расшифровать паблик ключом ответ) и зашифровали с помощью своего приват ключа.
ну не всегда же так. в моем серваке например у каждой копии программы есть свой идентификатор, по которому хранятся статические ключи для шифрации, а сами ключи генерируются уже в самой проге, и трафик начинается шифроваться уже после первого пакета, так что мало информации можно получить.

а на счет вот такой защиты могу посоветовать посмотреть, как написать многопользовательский чат на шарпе и на основе мутить свой сервер со своей защитой, ну я по крайне мере начинал именно так

realavril7
01.12.2014, 00:57
в моем серваке например у каждой копии программы есть свой идентификатор, по которому хранятся статические ключи для шифрации, а сами ключи генерируются уже в самой проге, и трафик начинается шифроваться уже после первого пакета, так что мало информации можно получить

По вашему скудному описанию вам подходит "Бюджетный вариант кряка" описанный мной, он будет работать даже если ключи генерировать каждый запуск разные

ну не всегда же так

Я и не писал что всегда, читайте внимательней. :forward:

Ginrey
03.12.2014, 13:30
По вашему скудному описанию вам подходит "Бюджетный вариант кряка" описанный мной, он будет работать даже если ключи генерировать каждый запуск разные
это каким же образом? всего идет 3 разных ключа, первый генерируется при запуске проги(ну и он у каждой копии проги одинаковый), потом по мере прохождения активации на сервере генерируются еще ключи, с помощью которых шифруется уже шифрованный трафик ну и так получается 3 слоя шифрации. Плюс прога изначально не имеет в себе никаких элементов управления, они передаются от сервера в пакетах если вся активация была успешно пройдена, и эти пакеты 3 раза шифрованы уже, и если хоть 1 байт в ключе не будет совпадать с серверными то дешифрация будет уже кривой и ничего не выйдет
Конечно не спорю, сломать можно все, но думаю не так просто это выйдет сделать, да и придется писать сервер свой

BearHack
06.12.2014, 21:22
КУ чёт он пхп сервер ненаходит делал на hut.ru как из твоей 1 версии(только домен взял)

realavril7
12.12.2014, 15:18
это каким же образом?

Да хоть 33 ключа, это не значит что шансы на взлом уменьшаются в 33 раза.

В целом, того что ты отписал мало для анализа, ванговать и выспрашивать что конкретно и как реализовано у меня нет времени, я тебе предлагаю вот что:

выкладывай код сервера и клиента на форум (что-то вроде "привязка от Ginrey") как будет свободное время я посмотрю его и отпишу все варианты обхода которые найду, и мб накидаю кода.

Ginrey
13.12.2014, 15:43
Да хоть 33 ключа, это не значит что шансы на взлом уменьшаются в 33 раза.
неее, просто шансы подобрать ключ к расшифровки трафика снизится.
вот например рабочий клиент, но не активирован сервером [Ссылки могут видеть только зарегистрированные и активированные пользователи]

Все процедуры описывать довольно догло, в кратце есть Switch(OPCODE) по нему выполняются действия активации проги в несколько этапов, до получения опкода трафик расшифровывается, ну а на сервере(на моем компе) уже идет проверки на все ключи и подтверждение активации. если все совпадает и дата и активация, то шифруются пакеты с определенными данными и высылаются на клиент, ну и так вот все происходит

Sinyss
14.12.2014, 20:17
неее, просто шансы подобрать ключ к расшифровки трафика снизится.
вот например рабочий клиент, но не активирован сервером [Ссылки могут видеть только зарегистрированные и активированные пользователи]

Все процедуры описывать довольно догло, в кратце есть Switch(OPCODE) по нему выполняются действия активации проги в несколько этапов, до получения опкода трафик расшифровывается, ну а на сервере(на моем компе) уже идет проверки на все ключи и подтверждение активации. если все совпадает и дата и активация, то шифруются пакеты с определенными данными и высылаются на клиент, ну и так вот все происходит
Насколько я понимаю подбирать никто не будет. Будут подмены.

Ginrey
15.12.2014, 00:09
Насколько я понимаю подбирать никто не будет. Будут подмены.
ну так ключи ж на серве генерируются, надо тогда пытаться написать свой сервер для синхронизации. по мне так вся эта морока не будет стоить результата

MembRupt
30.01.2015, 00:38
Не знаю почему, но у меня функция GetHDDStaticSerial() работала некорректно. Вставил флешку - значение другое.
Оказалось, что по запросу "SELECT * FROM Win32_DiskDrive" первым элементом вылезала пустая строка, которая и сбивала всё с толку, поэтому её необходимо пропустить

Nickitee
30.01.2015, 17:01
Не знаю почему, но у меня функция GetHDDStaticSerial() работала некорректно. Вставил флешку - значение другое.
Оказалось, что по запросу "SELECT * FROM Win32_DiskDrive" первым элементом вылезала пустая строка, которая и сбивала всё с толку, поэтому её необходимо пропустить
Есть такое.
Но сейчас я работаю над более современной системой активации.
Если тесты пройдут норм, то возможно опишу как и что.

Lubot
02.02.2015, 00:11
а как можно будет добавить новую переменную для проверки?
например выбор группы , если обычный юзер то паблик если приватный то грузить приват. и выбор групп сделать на форме входе например в comboBox
читать ее и пускать туда куда надо

MembRupt
02.02.2015, 07:27
Дополнительный параметр в GET запросе к серверу. Дополнительный стобец в таблице БД. Сделать ответом от сервера параметр license=1 или license=2 для выбора версии. Но без вашей смекалки обойти защиту не составит проблем

Lubot
02.02.2015, 12:28
Дополнительный параметр в GET запросе к серверу. Дополнительный стобец в таблице БД. Сделать ответом от сервера параметр license=1 или license=2 для выбора версии. Но без вашей смекалки обойти защиту не составит проблем
ну этоже надо создовать еще один count вроде или не?
if ($count == 1) //Если число рядков равно 1
else if ($count == 0) //Тогда если число рядков равно 0
к примеру group5 это одна, group10 дргуая группа

marik768
27.03.2015, 10:31
все норм было ни чего не делал, а вот щас вот такая ошибка
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
ошибку кидает тут
if (responseSplitted[0].Split('=')[1] == "1")
код обычный, как и сказал ни чего не менял
public static void initLoad()
{
Random curRandom = new Random();
string preKey = randomStringWithNumbers(curRandom.Next(15, 21), curRandom);
Int32 XORkey = curRandom.Next(1, int.MaxValue);
string pubKey = DigitalSign.XOR(Settings.pubKeyNotXORed, XORkey);
Int32 token = curRandom.Next(1000000, int.MaxValue);
string infoXORed = DigitalSign.XOR(info(curRandom, token, preKey), XORkey);
string responseXORed = DigitalSign.XOR(GetRequest(DigitalSign.XOR(Setting s.urlToScript(XORkey), XORkey), DigitalSign.XOR(infoXORed, XORkey)), XORkey);
string[] responseSplitted = DigitalSign.XOR(responseXORed, XORkey).Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
try
{
if (responseSplitted[0].Split('=')[1] == "1")
{
if (Int32.Parse(DigitalSign.DecryptString(responseSpl itted[4], preKey)) == token)
{
if (HWIDGrabber.GetUHI == Encoding.UTF8.GetString(Convert.FromBase64String(r esponseSplitted[2].Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries)[0])))
{

if (DigitalSign.CompareRSAMethod(getSignedText(respon seSplitted), responseSplitted[responseSplitted.Length - 1].Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries)[0], DigitalSign.XOR(pubKey, XORkey)))
{
if (responseSplitted[1].Split('=')[1] == "0")
{
Application.Run(new Main());
}
else
{
Home wid = new Home();
}
}
}
}
}
else
{
Home wid = new Home();

MembRupt
27.03.2015, 10:48
а вот щас вот такая ошибка
Сервер перестал вам корректно отвечать license=1 или license=0, смотрите сниффером или в отладчике, что возвращает сервер

marik768
28.03.2015, 02:20
Сервер перестал вам корректно отвечать license=1 или license=0, смотрите сниффером или в отладчике, что возвращает сервер
с сервером все норм, забыл добавить что на других компах все норм. у меня вин7 ультимате 64

Nickitee
28.03.2015, 11:18
с сервером все норм, забыл добавить что на других компах все норм. у меня вин7 ультимате 64
Глянь, что отвечает сервер и анализируй.

marik768
28.03.2015, 18:43
Глянь, что отвечает сервер и анализируй.
не я всеравно исключаю сервер, т.к думаю что сама программа чтото не то отправляет
вот поставил бряк на страку, где еррорит
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
мне вот както писали, что responseSplited пустой

CasoHack
30.09.2017, 01:02
Intro
Всем привет! Т.к. привязка v1 была сделана не совсем правильно (особенно хранение hwid) я решил сделать новую версию, на этот раз подменить ответ будет невозможно. Только надо изменять инструкции программы для "кряка". В этой привязке мы сможем задавать время, до которого будет действительна лицензия.

Что нам понадобится

1. Класс для получения HWID (HardWare ID) - скачать ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
2. Класс для работы с RSA на C# - скачать ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
3. PHP скрипты - скачать ([Ссылки могут видеть только зарегистрированные и активированные пользователи])
4. Хостинг с поддержкой PHP - на данном примере я буду использовать хостинг от koding.com (не реклама)
5. MySQL - на данном примере я буду использовать [Ссылки могут видеть только зарегистрированные и активированные пользователи] (не реклама)
6. Microsoft Visual Studio 2008+ с редистрибутивом C# - гугл : )
7. Базовые знания (например как добавить класс в проект)

Начнём

1. Для начала необходимо создать MySQL базу. Для этого зарегистрируемся на [Ссылки могут видеть только зарегистрированные и активированные пользователи] и создадим MySQL базу (не MSSQL).
У вас должно получится что-то типо такого:[Ссылки могут видеть только зарегистрированные и активированные пользователи]

2. Теперь создадим таблицу в MySQL базе данных, где будет храниться информация для лицензии. Для этого зайдём в phpMyAdmin, введём туда данные (пароль после регистрации бд приходит на почту) и нажмём "Создать таблицу", количество полей 2 - с именами "Hardware ID" и "End Time", тип - TEXT, и далее обязательно выставтить сравнение на "utf8_general_ci". и нажать "Сохранить".
[Ссылки могут видеть только зарегистрированные и активированные пользователи]


3. Теперь надо сгенерировать паблик и приват ключи RSA. Для этого создадим проект с шаблоном "Приложение Windows Forms" и назовём его RSAKeysGenerator, далее на основную Form кинем 2 textBox-a, 2 label-a и 1 кнопку. Так же добавим в проект DigitalSign.cs.
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

4. На кнопку а именно в эвент Click запишем код:

string publicKey = String.Empty;
string privateKey = String.Empty;
DigitalSign.AssignNewKey(ref privateKey, ref publicKey);
textBox1.Text = privateKey;
textBox2.Text = publicKey;

Главное не путать textBox-ы куда записываем ключи! (Хотя определить private и public ключи не сложно)

5. Теперь этот проект понадобится только для генерации ключей.

6. Теперь откроем globalsettings.php и изменим настройки:

$RSAprivateKey = "<RSAKeyValue><Modulus></Modulus><Exponent></Exponent></RSAKeyValue>";

Сюда в кавычки мы скопируем приват ключ, у меня получилось так

$RSAprivateKey = "<RSAKeyValue><Modulus>qPATiJQqZiJayNJkknPQ4IhFBXDHWYiBJeSE2QiuRwb5en+58O ADRh6ssXzZIo9CyHDjlLB8ETjkrY4pPjO+SmH9h55tVns/VKyi73rZxDg4+EsenZUXa19z7SuzlhCyq/JXW2/SMSADBBKjch2L+JQuZi46eHxWZVyNFvzKy8XaCWYJFDgk9XYir UZ0XesL/UYMxTjiePCOjZJM6w6X+iUGWZhMcDfXsFnLpWJ1rXPUBGjPJrr nFs7GyKuuyw4UsXkD6jH6R4uiP2392Zf6bHwnQC5xGdT/1kP/kjIa42EakXrwkcQkpJj1SSy9MvYX0TJQ5SKOwi5jXEF0GZAVHw ==</Modulus><Exponent>AQAB</Exponent><P>4aEI1nXR2GLpbdyV5VfQkq5ZlO3/daczu0ns52RE6pgVVO32L+cFsFYJy03d8KmAI5MozZ8BMv15ug 7Hj6m+/RyMQIBOcLHwNLgs/MPzF/BOArbORsDu+6jHr022kN4Org5NLz/3pkVPA/zOuVqIuKGP3mSvxXS+mofiLZoQz3E=</P><Q>v62DvtWjTJ+PDvCxdILRBplVEjFuufCCYSIP6XcsC5jq5hbMiz sOka6WmYaoK8jmyXi1idbWjLU5N/Fj5W0pnslE9lRoDlLD+xmhWuV0TwEeHbLl0+kWJ6CAcMFOFF4L iAbtN6SG0WNw8AJtwOTqjxzlvDVfeck07BGEgzaPBY8=</Q><DP>I8RYV07kDg5X/K9sH6gVCzuSPdagmXEA9V6ZrHCrsBidwRHb5eoUb8ij0tOsLBt ikcEhRb8//GpMIp93KSH6gbtFzG/Kf3jloCXWE9eoMJJKe4mpF3Q8Li6qQPLrzvk0kIj52VSlmHkCN pqb1qwwYjxSRynk50NDd9G0nBABPDE=</DP><DQ>UyEmvTIcc5PT0I/09mnxy6Heclh8BCpZ8VR7gC6OLK1yWr3SkiPXyrjkWcs7zlmAN iqi2RgSzs2d9jQ7tfnlDheOUCMFSgj9ND7GawyOp+D9NbYr1P8 G+8KxUbWUbmLnL2SJpxM04UT2azEydnERhWXsAPdI5CGuUR+7z 8huuOM=</DQ><InverseQ>Lx6Fnqvj7/uo6MxSMm26lHReHTHn8SGFx1mI7Z+4+NgB9hqO+OaCXZ3oQJiS VlHzv7Be+72mPyu6A60Y5DUBAif3NA90vLJ+3hFMeD9jA5KhHD SbOgFoqKzHmedXl+lYQhhhaFpsomInOTMItrSvn1tNwi6RU1pJ Sc2suQT9r5c=</InverseQ><D>O71Buw9h+uH1JoS3yc4os+2cMrNR20hZGxQ3IiRetIEz4WyfTR 16KuaX/N+ATSdJ32WEJMVP6isrOnBGB1f214jVRYrxcR5+I6w0pejUbv3 Or4ao2eKp+G81qE3G4K8g74rv90aQloySZHNO1wC5yXpk+f8o8 AhP6OIUhmd4Mxw9T12sAvdp2Px3FsG4F2r2pF5YNIt8PAcV6uh YiZEdb+qR+HrZOj99Is+aGwuAhlAmsQcOEkARYuYwlYI6ZYjGs YWyEQGscdOMBFXrR6k1zdO6B0gVns5rWHOM82805qU8EPAlf19 fL2Pqf8H1evTsLWQMNnoqqUDDZihD3FwQ4Q==</D></RSAKeyValue>";

Далее

$MySQL_hostname = "sql.site.com";

Мы заменяем на адрес сервера где расположена MySQL БД.
В моём случае:

$MySQL_hostname = "sql3.freesqldatabase.com";

Далее

$MySQL_username = "user";

Мы за меняем на имя пользователя для MySQL бд.
В моём случае:

$MySQL_username = "sql313795";

Далее

$MySQL_password = "password";

Мы заменяем на пароль для пользователя для MySQL бд.
Далее

$MySQL_databasename = "database name";

Мы заменяем на имя базы данной для MySQL.
В моём случае:

$MySQL_databasename = "sql313795";

Далее
Мы заменяем имя таблицы MySQL бд

$MySQL_table = "table name";

В моём случае:

$MySQL_table = "licensetable";

Всё, сохраняем настройки, загружаем все php файлы на сервер.

7. Теперь создадим новый проект тот же шаблон "Приложение Windows Forms". На него кинем 1 richTextBox, 1 кнопку. Добавим в проект DigitalSign.cs и HWIDGrabber.cs
Теперь объявим пару функций (можно прямо в коде формы)

public string getDays(TimeSpan time)
{
return ((time < TimeSpan.Zero) ? String.Format("Лицензия истекла {0} дней {1} часов {2} минут назад", Math.Abs(time.Days).ToString(), Math.Abs(time.Hours).ToString(), Math.Abs(time.Minutes).ToString()) : String.Format("Лицензия активна. Осталось {0} дней {1} часов {2} минут", time.Days, time.Hours, time.Minutes));
}

public static string getSignedText(string[] response)
{
string returned = String.Empty;
for (int i = 0; i < response.Length - 1; i++)
{
returned += response.GetValue(i) + "\r\n";
}
return returned;
}
public static string info(Random rn, Int32 token1,string preKey)
{
string tokenString = String.Format("token={0}&hwid={1}", DigitalSign.EncryptString(token1.ToString(), preKey), HWIDGrabber.GetUHI);
return tokenString;
}
public static string GetRequest(string url, string post)
{
[Ссылки могут видеть только зарегистрированные и активированные пользователи] request = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])[Ссылки могут видеть только зарегистрированные и активированные пользователи](url);
byte[] buffer = Encoding.UTF8.GetBytes(post);
request.ContentType = "application/x-[Ссылки могут видеть только зарегистрированные и активированные пользователи]";
request.ContentLength = buffer.Length;
request.Method = "POST";
Stream newStream = request.GetRequestStream();
newStream.Write(buffer, 0, post.Length);
newStream.Close();
[Ссылки могут видеть только зарегистрированные и активированные пользователи] response = ([Ссылки могут видеть только зарегистрированные и активированные пользователи])request.GetResponse();
StreamReader strReader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding(1251));
string WorkingPage = strReader.ReadToEnd();
response.Close();
return WorkingPage;
}


public static string randomStringWithNumbers(int maxlength, Random rn)
{
StringBuilder sb = new StringBuilder();
char[] allowedChars = new char[] { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
for (int i = 0; i < maxlength; i++)
{
int n = rn.Next(0, allowedChars.Length);
if (char.IsLetter(allowedChars[n]))
{
if (rn.Next(0, 2) == 0)
{
sb.Append(allowedChars[n].ToString().ToUpper());
}
else
{
sb.Append(allowedChars[n]);
}
}
else
{
sb.Append(allowedChars[n]);
}
}
return sb.ToString();
}


Теперь на эвент OnLoad на нашей форме запишем код:

richTextBox1.Text = HWIDGrabber.GetUHI;

p.s. если у вас ругается на ссылки, то вы должны подключить следующие:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;

А если ругается на Managment, то добавьте в ссылки System.Managment в .net ветке

Далее на эвент кнопки Click:

//////////////////////////////////////////////////////////////////////////////////////////
string pubKeyNotXORed = "<RSAKeyValue><Modulus></Modulus><Exponent></Exponent></RSAKeyValue>"; //Сюда в кавычки копируем ПАБЛИК rsa ключ.
//////////////////////////////////////////////////////////////////////////////////////////

Random curRandom = new Random();
string preKey = randomStringWithNumbers(curRandom.Next(15, 21), curRandom);
Int32 XORkey = curRandom.Next(1, int.MaxValue);

///////////////////////////////////////////////////////////////////////////////////////////
string urlToScript = DigitalSign.XOR("[Ссылки могут видеть только зарегистрированные и активированные пользователи]", XORkey); //Вместо site.com/base.php полный путь до скрипта на вашем хостинге
///////////////////////////////////////////////////////////////////////////////////////////

string pubKey = DigitalSign.XOR(pubKeyNotXORed, XORkey);

Int32 token = curRandom.Next(1000000, int.MaxValue);
string infoXORed = DigitalSign.XOR(info(curRandom, token, preKey), XORkey);
string responseXORed = DigitalSign.XOR(GetRequest(DigitalSign.XOR(urlToSc ript, XORkey), DigitalSign.XOR(infoXORed, XORkey)), XORkey);
string[] responseSplitted = DigitalSign.XOR(responseXORed, XORkey).Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
try
{
if (responseSplitted[0].Split('=')[1] == "1")
{

if (Int32.Parse(DigitalSign.DecryptString(responseSpl itted[4], preKey)) == token)
{
if (HWIDGrabber.GetUHI == Encoding.UTF8.GetString(Convert.FromBase64String(r esponseSplitted[1].Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries)[0])))
{
if (DigitalSign.CompareRSAMethod(getSignedText(respon seSplitted), responseSplitted[responseSplitted.Length - 1].Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries)[0], DigitalSign.XOR(pubKey, XORkey)))
{

DateTime CurrentTime = DateTime.Parse(responseSplitted[2].Split('=')[1]);
DateTime EndTime = DateTime.Parse(responseSplitted[3].Split('=')[1]);
TimeSpan ActivatedTime = EndTime.Subtract(CurrentTime);
if (ActivatedTime < TimeSpan.Zero)
{

MessageBox.Show(getDays(ActivatedTime));
//Тут мы что-то делаем, если лицензия истекла
}
else
{
MessageBox.Show(getDays(ActivatedTime));
//Тут мы что-то делаем, если лицензия активна.
}

}
}
}
}
else
{
MessageBox.Show("Лицензии не обнаружено!");
}
}
catch (Exception ex)
{
MessageBox.Show("Ошибка!\nКатастрофа!\nАхтунг!");
//AnyErrors
}


8. Запускаем, видим что в richTextBox появился наш HWID.
Жмём на кнопку, получаем
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

9. Идём в phpMyAdmin, открывает нашу таблицу выбираем "Вставить", в Hardware ID пишем то, что выдал richTextBox, в EndTime время окончания, строго в таком формате: 14.07.2013 20:00:00
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

10. Опять нажимаем на кнопку, и получаем:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]

11. Пробуем поставить время окончания лицензии раньше нашего текущего времени, получем:
[Ссылки могут видеть только зарегистрированные и активированные пользователи]


Заключение

Я сделал лишь основу, дальше вы можете модернизировать, как вам захочется, сделать автоматическое добавление в базу и т.д.
Самое главное - это обезопасить себя от декомпиляции кода, полностью обезопасить - невозможно, но от обычных юзеров можно.
Для этого делаем скрытые проверки, делаем условия из нескольких переменных типа int на основе математики и так далее... Ну и конечно использовать обсуфикаторы.

За основу для работы с RSA на php были взяты скрипты от Jim Wigginton

Гайд подготовил Nickitee специально для zhyk.ru
Автор не несёт ответственности за пользование информацией
При копировании на другие сайты/блоги/форумы и т.п. - указывать автора

Можешь помочь пишет Вроде бы все делал как у тебя показано ![Ссылки могут видеть только зарегистрированные и активированные пользователи]

prizrak115
29.04.2018, 17:07
Можете помочь скрины не открываются тупа грузят потом "Не удается получить доступ к сайту". Уже через анимайзер пытался через другой браузер никак.

prizrak115
04.05.2018, 16:32
Помогите генерирует 0 хоть всё правильно сделал

Nickitee
06.05.2018, 23:53
Помогите генерирует 0 хоть всё правильно сделал
Поставь брекпоинты на участки где идёт return значений и смотри что после чего 0 выдаёт.
Данная привязка устарела и не желательна в использовании, это лишь пример как можно использовать WMI и базовую логику проверка лицензии.
И использование языка программирования с промежуточным кодом для проверки лицензии - не самое лучшее решение.
Моя рекомендация это связка нативный код + управляемый + хороший виртуализатор. Это хоть как-то усложняет и замедляет взлом "прошаренным" пользователям.

prizrak115
15.05.2018, 12:48
Может неправильно понял 0 выползает при лоаде формы:
richTextBox1.Text = HWIDGrabber.GetUHI;
Указывает на GetUHI;
private static string UHI()
{
try
{
string result = "";
result += getGraphicDevice().Replace(" ", "");
result += getMotherManufacturer().Replace(" ", "");
result += getMotherSerial().Replace(" ", "");
result += GetHDDStaticSerial().Replace(" ", "");
ReverseString(ref result);
ReverseDouble(ref result);
ReverseString(ref result);
return result;
}
catch (Exception)
{
return "0";
}
}
public static string GetUHI
{
get { return UHI(); }
}

Nickitee
22.05.2018, 15:18
Может неправильно понял 0 выползает при лоаде формы:
richTextBox1.Text = HWIDGrabber.GetUHI;
Указывает на GetUHI;
private static string UHI()
{
try
{
string result = "";
result += getGraphicDevice().Replace(" ", "");
result += getMotherManufacturer().Replace(" ", "");
result += getMotherSerial().Replace(" ", "");
result += GetHDDStaticSerial().Replace(" ", "");
ReverseString(ref result);
ReverseDouble(ref result);
ReverseString(ref result);
return result;
}
catch (Exception)
{
return "0";
}
}
public static string GetUHI
{
get { return UHI(); }
}
Поставь брекпоинт на catch блок и смотри что в exception (только про Debug режим не забудь)

Okashe
17.06.2018, 03:32
Не работает, после добавления серийника в базу данных, программа перестаёт запускаться...

Сам то проверял?

anomal666
31.08.2018, 19:50
не я всеравно исключаю сервер, т.к думаю что сама программа чтото не то отправляет
вот поставил бряк на страку, где еррорит
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
мне вот както писали, что responseSplited пустой
Мне вот инетересно ты разобрался с это проблемой?

Добавлено через 16 часов 37 минут
Просто тебе правильно говорили, что смотри лог, дело в базе.
php скрипт старый у тебя.
И нету аргумента условия
if (DigitalSign.CompareRSAMethod(getSignedText(respon seSplitted), responseSplitted[responseSplitted.Length - 1].Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries)[0], DigitalSign.XOR(pubKey, XORkey)) == false)


Перепиши немного base.php он не под современные условия сделан. mysqli или PDO

Добавлено через 16 часов 39 минут
Спустя 5 лет, данный метод актуален

konstantin413
14.11.2018, 09:27
Меня больше интересует почему после нажатия кнопки, когда должна пойти сверка данных, у меня выдает ошибку " индекс находился вне границ массива ", эксепшн получается вылезает.

sfinmysoul
28.12.2018, 15:10
Как выпилить код привязки по железу ? есть инфа?

GTAX
09.03.2019, 11:02
не работает, автор всех кинул
зачем выкладывать не рабочую привязку?

Тигрь
29.05.2019, 10:40
не работает, автор всех кинул
зачем выкладывать не рабочую привязку?

чисто по приколу.

EngineHook
26.09.2019, 22:10
У меня почему-то ошибка использовал хостинг "sprinthost.ru" (Не реклама) вроде норм хост ну почему-то ошибка тип запрос отклоняет сайт

ivangelsorc
16.02.2022, 14:56
Все работает спасибо!

Genzalll
18.02.2022, 20:00
Помогите. У меня всегда выдает ошибку

System.Net.WebException
HResult=0x80131509
Сообщение = Удаленный сервер возвратил ошибку: (404) Не найден.
Источник = System
Трассировка стека:
at System.Net.[Ссылки могут видеть только зарегистрированные и активированные пользователи]()
at Click.Form3.GetRequest(String url, String post)
at Click.Form3.button1_Click(Object sender, EventArgs e)
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventAr gs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallba ck(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchM essageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager. System.Windows.Forms.UnsafeNativeMethods.IMsoCompo nentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.Run MessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.Run MessageLoop(Int32 reason, ApplicationContext context)
at Click.Program.Main()


Что с ней делать?

Добавлено через 9 минут
У вас получилось сделать? Что делали?

Рэйзор
18.02.2022, 22:04
Помогите. У меня всегда выдает ошибку

System.Net.WebException
HResult=0x80131509
Сообщение = Удаленный сервер возвратил ошибку: (404) Не найден.
Источник = System
Трассировка стека:
at System.Net.[Ссылки могут видеть только зарегистрированные и активированные пользователи]()
at Click.Form3.GetRequest(String url, String post)
at Click.Form3.button1_Click(Object sender, EventArgs e)
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventAr gs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallba ck(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchM essageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager. System.Windows.Forms.UnsafeNativeMethods.IMsoCompo nentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.Run MessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.Run MessageLoop(Int32 reason, ApplicationContext context)
at Click.Program.Main()


Что с ней делать?

Добавлено через 9 минут
У вас получилось сделать? Что делали?

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

Ты запрос то куда шлешь

Genzalll
18.02.2022, 22:07
[Ссылки могут видеть только зарегистрированные и активированные пользователи]Ошибка_404

Ты запрос то куда шлешь

Я запускаю прогу, жму на батон. И у меня происходит остановка проги и выдает такую ошибку в VS

Добавлено через 12 минут
[Ссылки могут видеть только зарегистрированные и активированные пользователи]Ошибка_404

Ты запрос то куда шлешь

Укоротил адрес, но вот уже начинает новую ошибку выдавать

System.Net.WebException
HResult=0x80131509
Сообщение = Удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера.


Вообще ничего не пойму

Рэйзор
18.02.2022, 22:49
Я запускаю прогу, жму на батон. И у меня происходит остановка проги и выдает такую ошибку в VS

Добавлено через 12 минут


Укоротил адрес, но вот уже начинает новую ошибку выдавать

System.Net.WebException
HResult=0x80131509
Сообщение = Удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера.


Вообще ничего не пойму

Статье 10 лет, ты на какой сервер шлешь запрос?

Это не прога, а пример

Genzalll
18.02.2022, 22:59
Статье 10 лет, ты на какой сервер шлешь запрос?

Это не прога, а пример

У меня хостинг sprinthost(не реклама), пробую на разных доменах, путь сокращал. все время ошибка.

А если есть лучше способ, можно ссылку на статью?

Рэйзор
18.02.2022, 23:04
У меня хостинг printhost(не реклама), пробую на разных доменах, путь сокращал. все время ошибка.

А если есть лучше способ, можно ссылку на статью?

ну надо для начала разобраться, как вообще интернет работает на базовом уровне (http(s) протоколы, что такое uri/url и т д) а то с этим явно беды. Потом разобраться что/куда и зачем ты шлешь.

Genzalll
18.02.2022, 23:09
ну надо для начала разобраться, как вообще интернет работает на базовом уровне (http(s) протоколы, что такое uri/url и т д) а то с этим явно беды. Потом разобраться что/куда и зачем ты шлешь.

string urlToScript = DigitalSign.XOR("[Ссылки могут видеть только зарегистрированные и активированные пользователи]", XORkey);
Вот такой путь. Запускаю форму и на ней жму на батон(эта ссылка как раз внутри кода кнопки). И у меня должна подтвердиться лицензия. Но всегда вылезает ошибка

в отладке пишет это:
Необработанное исключение типа "System.Net.WebException" в System.dll
Удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера.

Рэйзор
18.02.2022, 23:20
string urlToScript = DigitalSign.XOR("[Ссылки могут видеть только зарегистрированные и активированные пользователи]", XORkey);
Вот такой путь. Запускаю форму и на ней жму на батон(эта ссылка как раз внутри кода кнопки). И у меня должна подтвердиться лицензия. Но всегда вылезает ошибка

в отладке пишет это:
Необработанное исключение типа "System.Net.WebException" в System.dll
Удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера.

ну так это пхп падает, смотри в логи, что там за ошибка

Добавлено через 2 минуты
посмотрел пхп скрипт - так конечно дичь, такое только выкинуть и забыть, но логи все равно должны быть, там будет ответ, что падает. Может коннект к базе падать mysql_connect или еще что угодно.

Genzalll
18.02.2022, 23:24
ну так это пхп падает, смотри в логи, что там за ошибка

Добавлено через 2 минуты
посмотрел пхп скрипт - так конечно дичь, такое только выкинуть и забыть, но логи все равно должны быть, там будет ответ, что падает. Может коннект к базе падать mysql_connect или еще что угодно.


[u][18/Feb/2022:23:21:14 +0300] 0.150 0.150 200 178.205.247.81 a0575607.xsph.ru GET /click/base.php [Ссылки могут видеть только зарегистрированные и активированные пользователи] "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" "-" 158 141.8.192.58 a0575607
[u][18/Feb/2022:23:21:24 +0300] 0.050 0.150 500 178.205.247.81 a0575607.xsph.ru POST /click/base.php [Ссылки могут видеть только зарегистрированные и активированные пользователи] "-" "-" 202 141.8.192.58 a0575607

Это все что выдает после попытки подключения

Рэйзор
18.02.2022, 23:40
[u][18/Feb/2022:23:21:14 +0300] 0.150 0.150 200 178.205.247.81 a0575607.xsph.ru GET /click/base.php [Ссылки могут видеть только зарегистрированные и активированные пользователи] "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 OPR/82.0.4227.50" "-" 158 141.8.192.58 a0575607
[u][18/Feb/2022:23:21:24 +0300] 0.050 0.150 500 178.205.247.81 a0575607.xsph.ru POST /click/base.php [Ссылки могут видеть только зарегистрированные и активированные пользователи] "-" "-" 202 141.8.192.58 a0575607

Это все что выдает после попытки подключения

ну вот у тебя в логе 500, выясни, что падает оберни все try/catch, пиши логи. Шож программировать учить тебя тут чтоли :omg: