Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Реверсинг (https://forum.antichat.xyz/forumdisplay.php?f=94)
-   -   лечение программы под .net (https://forum.antichat.xyz/showthread.php?t=141540)

lis84 15.09.2009 09:57

лечение программы под .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);
        }


0rs 15.09.2009 11:44

А что за отладчик?

lis84 15.09.2009 15:32

syser.
А какая разница?
Раньше SoftIce юзил, в нём тоже бряки на память не срабатывали.

PaCo 15.09.2009 16:48

httpWebRequest - ставь в etc/host 127.0.0.1 botva.onlinebots.net , код по всей видимости после обфускации(хотя это не сильно то и важно), ну или man IL со всеми вытекающими.

zeppe1in 15.09.2009 16:55

ws2_32.send
ws2_32.recv
сисером по netу это конечно сильно)

neprovad 15.09.2009 17:22

Цитата:

Сообщение от zeppe1in
ws2_32.send
ws2_32.recv
сисером по netу это конечно сильно)

если трудностей нет, то их надо создать, иначе ломать неинтересно)

lis84 16.09.2009 02:22

Эммм, а чем .net лечат?
:) я просто других инструментов не знаю.
Попробовал дисшарп и рефлектор, они выдают кучу функций без названий, ну и + я в c# не сильно шарю.

А как обычно .net лечат (на данном примере можно порядок действий, какие проги юзать и что ими делать)?

А про подмену через hosts я в первую очередь подумал. Просто тут надо будет абсолютному валенку объяснить как ставить веб сервер. Брр... я лучше доломаю получше, мне на работе куриц в бухгалтерии хватает.

zeppe1in 16.09.2009 17:04

lis84
ну да, рефлектором надо. любой деобфускатор заюзать что бы в читаемый вид переименовал все функции. потом тут все строки зашифрованы, если их расшифровать то всё будет как на ладони).
рипнуть функцию которая их расшифровывает не проблемма, но вручную каждую строку смотреть запара хотя я нашол таки место проверки серйника. надо теперь проитись по всем функциям и заменить вызов расшивровщика на саму строку.)
------
открываеш в рефлекторе, F3 и щеш строки и константы "-2048782763" он найдёт одну функцию
а вней
Код:

            if ((this.​  || this.  ) && (this.(this.  , this..Text) !=  .(-2048733781)))
                {
                    return;
                }

это и есть онлайн проверка.
вот декодер строк http://www.sendspace.com/file/lswugk
вставлять цифры без минуса. и должен лежать в папке с ботвой.

lis84 17.09.2009 03:20

Блин, а я что то даже не подумал что строки зашифрованны автором. Думал это фишка .net
Даже кажется знаю какая функция шифрует, когда в коде рылся постоянно на вязов её натыкался там где строки должны были быть.

:) спасибо, щас ещё покопаюсь.

Вот ещё вопросик. Я первый раз сталкиваюсь с .net после того как я найду в рефлекторе нужную функцию, как её фиксить то? Рефлектор даёт сишный код, который по моему стойкому подозрению потом не компильнётся. Чтобы в бинарнике что то править в рефлекторе никаких зацепок :(.

ПыСы. Программа после декомпиляции как и ожидалось не компилится :(
Программа декодировщик строк не запускается

0rs 17.09.2009 10:52

Чтобы править код нужен плагин Reflexil.
Как его использовать можно тут почитать http://www.cumps.be/reverse-engineering-with-reflector-and-reflexil/


Время: 16:01