Сейчас на форуме: asfa, bartolomeo (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Проверка регистрационного кода через сайт
Посл.ответ Сообщение

Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 20 февраля 2012 08:30
· Личное сообщение · #1

Всем привет!
Расковырял бота для игры, нашел код проверки регистрации программы при запуске. Выглядит он примерно так:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Management;
using System.Net;

namespace keygen3
{
public partial class Form1 : Form
{
private long long_1;
private long long_0;
private ulong ulong_0;
private ulong ulong_2;
private UInt64 ulong_3;
public ulong ulong_4;
private ulong ulong_5;
private int p;
private int z;
public string e = "";
public Form1()
{
InitializeComponent();
}

public string connect(string kod)
{
WebRequest.DefaultWebProxy = null;
WebClient client = new WebClient();


try
{
e= client.DownloadString("hттp://bimsbot.ru/bims43x.php?id=" + Convert.ToUInt64(ulong_4) + "&kod=" + kod);
return e;

}
catch
{
}
Random random = new Random();
return random.Next(0xf4240, 0x989680).ToString();


}


}

private void Form1_Load(object sender, EventArgs e)
{
Random random = new Random();
string[] strArray3 = new string[] { Convert.ToString((long)(random.Next(0x3e8) * 0x174876e800L)), Convert.ToString((int)(random.Next(100) * 100)), "" };
FileInfo info = new FileInfo(@"C:\BimsBot\registration.re");
if (!info.Exists)
{
MessageBox.Show("Файла нет");
}
string str = string.Empty;
StreamReader reader = File.OpenText(@"C:\BimsBot\registration.re");
try
{

for (byte i = 0; i < 2; i = (byte)(i + 1))
{
str = reader.ReadLine();
if (str == null)
{
MessageBox.Show("Файл пустой");
}
strArray3[i] = str;


}
reader.Close();

}

catch
{
}

string[] strArray = new string[3];
string[] strArray2 = new string[3];
strArray = strArray3;
try
{
long_0 = Convert.ToInt64(strArray[0]);
}
catch
{
long_0 = 0xe1dfd777L;
}



string s = "";
SelectQuery query = new SelectQuery("Win32_Processor");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
using (ManagementObjectCollection.ManagementObjectEnumerator enumerator = searcher.Get().GetEnumerator())
{
while (enumerator.MoveNext())
{
s = Convert.ToString(enumerator.Current["ProcessorId"]);
}
}
byte[] bytes = new ASCIIEncoding().GetBytes(s);
for (int i = 0; i < bytes.Length; i++)
{
p += bytes[i] * (i + 10);
}
ulong_3 = Convert.ToUInt64(p);
ulong_4 = ulong_3 * ((ulong) 0x5ba0L);

ulong_0 = Convert.ToUInt64(connect(long_0.ToString()));

}

private void button1_Click(object sender, EventArgs e)
{
ulong_2 = (ulong)Math.Ceiling(Math.Pow(((((double)long_0) / ((double)(ulong_3 * ((ulong)0x929L)))) + 3555.0) + (ulong_3 * ((ulong)0x929L)), 1.49));

if (ulong_2 != ulong_0)

{
триальная Версия;
}
else

{
Мы зарегестрированы;
}


}

}
}
Это уже сам немного его переделал, что бы понять где, как и что работает, но основные моменты остались оригинальными. Значит в теле кода генерируется некое число, которое уникально для каждого компьютера, ulong_3. На основании этого числа генерируется ulong_4. Из регистрационного файла берется ключ, введенный при регистрации программы (long_0) и вместе с ulong_4 отправляется на сайт автора программы.
При попытке воспроизвести все это дело и записать логи, получилось, что возвращаемое сайтом число каждый раз разное, при постоянных long_0 и ulong_4. Мое предположение такое: При обращении к серверу идет проверка отправляемого ключа в базе данных и если ключ есть, то отправляется уже постоянный ответ. Если такого ключа нет, генерируется бред. Вот хочу спросить вашего совета, как же можно то это дело обойти. Пытаюсь пропатчить код на сравнении изменив знак равенства, экзешник отказывается запускаться. Но в этом варианте я не уверен, поскольку опыта в таком патчинге у меня нет. Пока же запустил цикл с обходом возможных кодов регистрации и проверкой их на сервере. Это на тот случай если я все же оказался прав про одинаковые ответы на существующий серийник.



Ранг: 85.4 (постоянный), 51thx
Активность: 0.090
Статус: Участник

Создано: 20 февраля 2012 09:51
· Личное сообщение · #2

1) вариант
в Form1_Load пихаем в ulong_0 и ulong_3 любое число, допустим 1, все остальное забиваем нулями (нопим)
в button1_Click пихаем в ulong_2 расчитанное число, 415499
2) вариант
тупо фиксим проверку в button1_Click



Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 20 февраля 2012 10:10
· Личное сообщение · #3

Забил nop'ами проверку ключа, экзешник сразу вываливается с ошибкой... Может какая проверка стоит на изменение кода?



Ранг: 3.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 20 февраля 2012 10:38
· Личное сообщение · #4

kreolx
Попробуй сделай чтобы прога не выключалась
Exitprocess
У меня было такое просто когда не даешь проги вырубаться она какимто образом работает



Ранг: 5.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 20 февраля 2012 10:42 · Поправил: AlexandrK
· Личное сообщение · #5

kreolx Нету там ни каких проверок. Значит не правильно пропатчил.
Я сделал гораздо проще... Там же есть триал. Просто найди по тексту из оповещения, где он закрывается по окончании триального времяни и удали килл процесса и вызов оповещения + к этому там чуть выше по тексту в том же методе есть ограничение на кол-во запущенных ботов которое тож можно просто удалить Но у меня есть другая задумка, чтобы при каждом обновлении бота не патчить. По листингу можно узнать какой ключ бот должен получать от сервера. И страничку куда он обращается за этим ключом тоже знаем. Так вот как сделать так, чтобы он при обращении ТОЛЬКО на эту страницу перенаправлялся например на localhost на котором развернуть тот же DENWER и от туда получать этот код? Причем все остальные запросы должны уходить на оригинальный сайт разработчика.



Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 20 февраля 2012 14:04
· Личное сообщение · #6

AlexandrK А ты чем патчил? Не знаю что не так делаю, но и через Reflexil и связкой Reflector, IDA, fLEXHEX ничего не получилось, в том плане, что выскакивает ошибка... Хотя это скорее мне матчасть учить нужно. И понравился вариант с установкой своего сервера на localhost. Сейчас пробую реализовать...



Ранг: 5.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 20 февраля 2012 15:58
· Личное сообщение · #7

Я патчил SAE и не забивал все это nop`ами, а просто брал и удалял лишнее).



Ранг: 1.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 20 февраля 2012 16:42 · Поправил: kreolx
· Личное сообщение · #8

В общем оказалось все не так просто на самом деле. У меня на внесение в файл Hosts адреса по которому отправляется запрос вызывало неизвестную ошибку и вылет программы. Убираешь строчку и работает нормально. А осуществить редирект программными средствами пока не знаю как, нашел одну прогу, но она работает только с браузерами, бота не видит. Покурю еще маны, может выплывет что нибудь..
Действительно SAE пропатчила без вопросов. Кстати в этой версии пройти проверку оказалось даже проще чем в предидущих.


 eXeL@B —› Вопросы новичков —› Проверка регистрационного кода через сайт
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати