ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
|
лечение программы под .net |

15.09.2009, 09:57
|
|
Познающий
Регистрация: 28.04.2009
Сообщений: 61
Провел на форуме: 103259
Репутация:
37
|
|
лечение программы под .net
Здравствуйте.
Решил тут на днях тряхнуть стариной, и зарегать на себя небольшую программку.
http://botva.onlinebots.net/
Программка триальная, на 80 запусков, и раз в 2 часа завершает работу.
Метод защиты - серийный номер, который генерится по аппаратному номеру привязанному к машине.
Вобщем то ничего сложного. Покопавшись в отладчике убедил программу что введённая мной белиберда это и есть серийный номер  .
Но возникла вторая проблема. Теперь программа ломится на сайт разработчика http://botva.onlinebots.net/checkregistrationcode.php и скидывает ему через post 2 параметра, ключ и email (в программе который вводится)
Прошу помощи. Подскажите на какую api функцию повешать бряк, чтобы он сработал в момент передачи/получения ответа.
Нашёл в памяти адрес строки с адресом (извините за тафталогию), пробовал бряк на чтение с памяти, но он не срабатывает (впрочем он у меня почему то никогда не срабатывал)
Сама программа написанна на c#. Строки с адресом в экзешнике нет, скорее всего она как то кодирована. (чтобы тупо подменить адрес на свой).
В дисшарпе нашол интересную функцию
Скорее всего она и есть искомая весч, но ничего в ней не могу найти, за что зацепиться отладчиком.
Может кто нибудь подскажет как справляться с такими защитами?
Код:
private string Method2_5(bool p1, bool p2, bool p3)
{
string s2;
int i = 0;
string s1 = System.String.Empty;
try
{
System.Net.HttpWebRequest httpWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(Root.Class8.Method8_1(847480816) + Field2_139 + Field2_140 + Root.Class8.Method8_1(847481588));
if (Field2_117)
{
if (Field2_116)
{
System.Net.ICredentials icredentials = new System.Net.NetworkCredential(Field2_250, Field2_249);
httpWebRequest.Proxy = new System.Net.WebProxy(Field2_248 + Root.Class8.Method8_1(847489944) + Field2_90.ToString(), true, null, icredentials);
}
else
{
httpWebRequest.Proxy = new System.Net.WebProxy(Field2_248, Field2_90);
}
}
else
{
httpWebRequest.Proxy = null;
}
httpWebRequest.Timeout = 30000;
httpWebRequest.ServicePoint.Expect100Continue = false;
httpWebRequest.AllowAutoRedirect = false;
httpWebRequest.Accept = Root.Class8.Method8_1(847480721);
httpWebRequest.Referer = Root.Class8.Method8_1(847480816) + Field2_139 + Field2_140 + Root.Class8.Method8_1(847481588);
httpWebRequest.Headers.Add(Root.Class8.Method8_1(847480667), Root.Class8.Method8_1(847480693));
httpWebRequest.Headers.Add(Root.Class8.Method8_1(847480599), Root.Class8.Method8_1(847480609));
httpWebRequest.Headers.Add(Root.Class8.Method8_1(847480637), Root.Class8.Method8_1(847480520));
httpWebRequest.Headers.Add(Root.Class8.Method8_1(847480561), Root.Class8.Method8_1(847480448));
httpWebRequest.UserAgent = Field2_251;
httpWebRequest.KeepAlive = true;
httpWebRequest.Headers.Add(Root.Class8.Method8_1(847480984), Field2_162);
System.Net.HttpWebResponse httpWebResponse = (System.Net.HttpWebResponse)httpWebRequest.GetResponse();
System.IO.StreamReader streamReader = new System.IO.StreamReader(httpWebResponse.GetResponseStream(), System.Text.Encoding.GetEncoding(1251));
s1 = streamReader.ReadToEnd();
httpWebResponse.Close();
}
catch (System.Exception e)
{
Root.Class2.Class16 class16 = new Root.Class2.Class16();
class16.Field16_1 = e;
class16.Field16_3 = this;
Field2_281 = System.Convert.ToInt32(Field2_53.Value * (1000M));
class16.Field16_2 = (double)Field2_281;
class16.Field16_2 /= 1000.0;
Invoke(new System.Windows.Forms.MethodInvoker(class16.Method16_1));
Invoke(new System.Windows.Forms.MethodInvoker(class16.Method16_2));
return Root.Class8.Method8_1(847489664);
}
if (s1.IndexOf(Root.Class8.Method8_1(847482847)) > 0)
{
if (p1)
{
Field2_190 = System.String.Empty;
while (s1[s1.IndexOf(Root.Class8.Method8_1(847482858)) + 16 + i] != 10)
{
Field2_190 = System.String.Concat(Field2_190, s1[s1.IndexOf(Root.Class8.Method8_1(847482858)) + 16 + i]);
i++;
}
Field2_190 = Field2_190.Replace(Root.Class8.Method8_1(847482755), System.String.Empty);
}
i = 0;
if (p3)
{
Field2_196 = System.String.Empty;
while (s1[s1.IndexOf(Root.Class8.Method8_1(847482763)) + 10 + i] != 32)
{
Field2_196 = System.String.Concat(Field2_196, s1[s1.IndexOf(Root.Class8.Method8_1(847482763)) + 10 + i]);
i++;
}
}
i = 0;
if (p2)
{
Field2_167 = System.String.Empty;
while (s1[s1.IndexOf(Root.Class8.Method8_1(847482784)) + 51 + i] != 60)
{
Field2_167 = System.String.Concat(Field2_167, s1[s1.IndexOf(Root.Class8.Method8_1(847482784)) + 51 + i]);
i++;
}
Field2_168 = System.String.Empty;
i = 0;
s1 = s1.Remove(0, s1.IndexOf(Root.Class8.Method8_1(847482784)) + 51 + i);
while (s1[s1.IndexOf(Root.Class8.Method8_1(847482784)) + 51 + i] != 60)
{
Field2_168 = System.String.Concat(Field2_168, s1[s1.IndexOf(Root.Class8.Method8_1(847482784)) + 51 + i]);
i++;
}
}
return Root.Class8.Method8_1(847481052);
}
return Root.Class8.Method8_1(847503990);
}
|
|
|

15.09.2009, 11:44
|
|
Познающий
Регистрация: 30.12.2008
Сообщений: 64
Провел на форуме: 647156
Репутация:
76
|
|
А что за отладчик?
|
|
|

15.09.2009, 15:32
|
|
Познающий
Регистрация: 28.04.2009
Сообщений: 61
Провел на форуме: 103259
Репутация:
37
|
|
syser.
А какая разница?
Раньше SoftIce юзил, в нём тоже бряки на память не срабатывали.
|
|
|

15.09.2009, 16:48
|
|
Постоянный
Регистрация: 06.02.2008
Сообщений: 494
Провел на форуме: 1754802
Репутация:
380
|
|
httpWebRequest - ставь в etc/host 127.0.0.1 botva.onlinebots.net , код по всей видимости после обфускации(хотя это не сильно то и важно), ну или man IL со всеми вытекающими.
|
|
|

15.09.2009, 16:55
|
|
Постоянный
Регистрация: 12.07.2006
Сообщений: 327
Провел на форуме: 1654818
Репутация:
117
|
|
ws2_32.send
ws2_32.recv
сисером по netу это конечно сильно)
|
|
|

15.09.2009, 17:22
|
|
Постоянный
Регистрация: 19.10.2007
Сообщений: 794
Провел на форуме: 1013791
Репутация:
711
|
|
Сообщение от zeppe1in
ws2_32.send
ws2_32.recv
сисером по netу это конечно сильно)
если трудностей нет, то их надо создать, иначе ломать неинтересно)
|
|
|

16.09.2009, 02:22
|
|
Познающий
Регистрация: 28.04.2009
Сообщений: 61
Провел на форуме: 103259
Репутация:
37
|
|
Эммм, а чем .net лечат?
 я просто других инструментов не знаю.
Попробовал дисшарп и рефлектор, они выдают кучу функций без названий, ну и + я в c# не сильно шарю.
А как обычно .net лечат (на данном примере можно порядок действий, какие проги юзать и что ими делать)?
А про подмену через hosts я в первую очередь подумал. Просто тут надо будет абсолютному валенку объяснить как ставить веб сервер. Брр... я лучше доломаю получше, мне на работе куриц в бухгалтерии хватает.
|
|
|

16.09.2009, 17:04
|
|
Постоянный
Регистрация: 12.07.2006
Сообщений: 327
Провел на форуме: 1654818
Репутация:
117
|
|
lis84
ну да, рефлектором надо. любой деобфускатор заюзать что бы в читаемый вид переименовал все функции. потом тут все строки зашифрованы, если их расшифровать то всё будет как на ладони).
рипнуть функцию которая их расшифровывает не проблемма, но вручную каждую строку смотреть запара хотя я нашол таки место проверки серйника. надо теперь проитись по всем функциям и заменить вызов расшивровщика на саму строку.)
------
открываеш в рефлекторе, F3 и щеш строки и константы "-2048782763" он найдёт одну функцию
а вней
Код:
if ((this. || this. ) && (this.(this. , this..Text) != .(-2048733781)))
{
return;
}
это и есть онлайн проверка.
вот декодер строк http://www.sendspace.com/file/lswugk
вставлять цифры без минуса. и должен лежать в папке с ботвой.
Последний раз редактировалось zeppe1in; 16.09.2009 в 18:01..
|
|
|

17.09.2009, 03:20
|
|
Познающий
Регистрация: 28.04.2009
Сообщений: 61
Провел на форуме: 103259
Репутация:
37
|
|
Блин, а я что то даже не подумал что строки зашифрованны автором. Думал это фишка .net
Даже кажется знаю какая функция шифрует, когда в коде рылся постоянно на вязов её натыкался там где строки должны были быть.
 спасибо, щас ещё покопаюсь.
Вот ещё вопросик. Я первый раз сталкиваюсь с .net после того как я найду в рефлекторе нужную функцию, как её фиксить то? Рефлектор даёт сишный код, который по моему стойкому подозрению потом не компильнётся. Чтобы в бинарнике что то править в рефлекторе никаких зацепок  .
ПыСы. Программа после декомпиляции как и ожидалось не компилится 
Программа декодировщик строк не запускается
Последний раз редактировалось lis84; 17.09.2009 в 09:59..
|
|
|

17.09.2009, 10:52
|
|
Познающий
Регистрация: 30.12.2008
Сообщений: 64
Провел на форуме: 647156
Репутация:
76
|
|
Чтобы править код нужен плагин Reflexil.
Как его использовать можно тут почитать http://www.cumps.be/reverse-engineering-with-reflector-and-reflexil/
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|