Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C++ Decompile, Помогите плз разобраться. 
:(
    Опции темы
Felixx
  Дата 7.12.2011, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Всем привет, помогите плз разобраться что делает этот код?

Код

signed int __thiscall i3NetworkPacket__Decript(int this, unsigned int a2)
{
  int v2; // edi@1
  unsigned __int16 v3; // si@2
  signed int result; // eax@3

  v2 = this;
  if ( **(_WORD **)(this + 16) & 0x8000 && (v3 = **(_WORD **)(this + 16) & 0x7FFF, v3 <= 0x22D0u) )
  {
    BitRotateDecript((unsigned __int8 *)(this + 26), v3 + 2, a2);
    **(_WORD **)(v2 + 16) = v3;
    result = 1;
  }
  else
  {
    result = 0;
  }
  return result;
}


и

Код

void __thiscall i3NetworkPacket__Encript(int this, unsigned int a2)
{
  int v2; // edi@1
  unsigned __int16 v3; // si@1

  v2 = this;
  v3 = **(_WORD **)(this + 16);
  if ( !(**(_WORD **)(this + 16) & 0x8000) )
  {
    BitRotateEncript((unsigned __int8 *)(this + 26), v3 + 2, a2);
    **(_WORD **)(v2 + 16) = v3 | 0x8000;
  }
}


Это декомпил алгоритма декрипта/енкрипта байтов пакета TCP/IP, вернее его data.
Подскажите что тут вообще делается....
Или, если кому не будет трудно, перепишите это на С# пожалуйста)


P.S:
Используется   BitRotateEncript
У меня оно сделано так:

Код

class BitCrypt
    {
        public static void decrypt(byte[] data, int length, int shift)
        {
            byte result; // al@1
            byte v4; // bl@1
            int v5; // ebp@1
            int v6; // esi@1
            byte v7; // dl@3
            byte i; // [sp+1Ch] [bp+Ch]@1

            result = (byte)length;
            v4 = (byte)shift;
            v6 = length - 1;
            v5 = 8 - shift;
            for (i = data[length - 1]; v6 >= 0; data[v6 + 1] = result)
            {
                if (v6 <= 0)
                    v7 = i;
                else
                    v7 = data[v6 - 1];

                result = (byte)((v7 << v5) | (data[v6--] >> v4));
            }
        }

        public static void encrypt(byte[] data, int length, int shift)
        {
            int result; // al@1
            int v4; // bl@1
            int v5; // ebp@1
            byte[] v6; // esi@1
            int v7; // dl@3
            int v8;
            byte v9;
            int v10;

            v5 = shift;
            v6 = data;
            v9 = data[0];
            v4 = 8 - shift;
            result = 0;
            v10 = 8 - shift;
            if (length > 0)
            {
                while (true)
                {
                    v7 = result >= length - 1 ? v9 : v6[result + 1];
                    v8 = v6[result++] << v5;
                    v6[result - 1] = (byte)(v8 | v7 >> v4);
                    if (result >= length)
                        break;
                    var lowByte = (UInt16)v4 & 0xFF;
                    var hiByte = (UInt16)v4 >> 8;
                    v4 = (int)(((UInt32)v10 & 0xFF) | ((UInt32)hiByte & 0xFF) << 8);
                }
            }
        }
    }


Это сообщение отредактировал(а) Felixx - 7.12.2011, 10:16
PM MAIL   Вверх
baldina
Дата 7.12.2011, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(Felixx @  7.12.2011,  10:12 Найти цитируемый пост)
Это декомпил алгоритма декрипта/енкрипта байтов пакета TCP/IP, вернее его data.
Подскажите что тут вообще делается....

это какие-то манипуляции с данными, которые зависят от формата этих данных.
если на "нормальный" язык перевести, то что-то вроде
Код

class  i3NetworkPacket {
  ushort flags;
  byte len;
  byte [] data;
  
  public bool isEncrypted () { return (flags & 0x8000) != 0; }
  public void setEncrypted () { flags |= 0x8000; }
  public void clearEncrypted () { flags &= 0x7FFF; }
  
  public bool isAnotherCond () { return (flags & 0x7FFF) < 0x22D0u; }
  
  public bool Decrypt (int shift) {
    if (isEncrypted () && isAnotherCond ()) {
      BitRotateDecrypt(data, len, shift);
      clearEncrypted ();
      return true;
    }
    else
      return false;
  }
 
  public void Encrypt (int shift) {
    if (!isEncrypted()) {
      BitRotateEncrypt(data, len, shift);
      setEncrypted ();
    }
  }

  public static void BitRotateDecrypt(byte[] data, int length, int shift) { }
  public static void BitRotateEncrypt(byte[] data, int length, int shift) { }
}


Добавлено @ 14:08
можно так:
Код

  public void Encrypt (int shift) {
    if (!isEncrypted()) {
      BitCrypt.encrypt(data, len, shift);
      setEncrypted ();
    }
  }


Это сообщение отредактировал(а) baldina - 7.12.2011, 14:09
PM MAIL   Вверх
Felixx
Дата 7.12.2011, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Огромное спасибо, буду пробовать!
PM MAIL   Вверх
Felixx
Дата 7.12.2011, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Интересно, что ему за флаг нужен...

сделал так..

Код

namespace ByteVeiwer
{
    public class i3NetworkPacket
    {
        static ushort flags;
        static int len;
        static byte[] data;

        public i3NetworkPacket(byte[] d, ushort f)
        {
            flags = f;
            len = d.Length;
            data = d;

        }
        public static bool isEncrypted() { return (flags & 0x8000) != 0; }
        public static void setEncrypted() { flags |= 0x8000; }
        public static void clearEncrypted() { flags &= 0x7FFF; }

        public static bool isAnotherCond() { return (flags & 0x7FFF) < 0x22D0u; }

        public bool Decrypt(int shift)
        {
            if (isEncrypted() && isAnotherCond())
            {
                BitRotate.decrypt(data, len, shift);
                clearEncrypted();
                return true;
            }
            else
            {
                MessageBox.Show("Decrypt filed");
                return false;
            }
        }

        public void Encrypt(int shift)
        {
            if (!isEncrypted())
            {
                BitRotate.encrypt(data, len, shift);
                setEncrypted();
            }
            else
            {
                MessageBox.Show("Encrypt filed");
            }
        }
    }
}



Вызываю кнопкой..

Код

private void NetDecBtn_Click(object sender, EventArgs e)
        {
            byte[] array = { _bytes[0], _bytes[1] };
            ushort val = BitConverter.ToUInt16(array, 0);
            i3NetworkPacket p = new i3NetworkPacket(_bytes, 0);
            p.Decrypt(7);
            BufferList.Text = BitConverter.ToString(_bytes).Replace("-", "");
            setByteCount(_bytes.Length);
            label12.Text = "is Decrypted";
        }


И в любом случае MessageBox .....

флаг думаю должен быть как то взят из исходного массива байт... у меня это _bytes
Пока ничего не выходит(((
PM MAIL   Вверх
Felixx
Дата 7.12.2011, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Не неподходит... :(
тут меняется как то сама data и ее размер....

BitRotateDecript((unsigned __int8 *)(this + 26), v3 + 2, a2);
v3 она вроде как присваивается в проверке..

но так же никак низя... 
private int v3 = (flags & 0x7FFF) <= 0x22D0u;

Добавлено @ 15:14
Пример. Имеем
массив из байтов: bytes = 6E A1 0F 44 AA 05 2E 46 22 16 D7 19 20 DD D7 19 
  16 байт.
   первые 2 байта это short (bytes.size() - 4) тоесть должен быть равен 12.

Почему так, потому что это такая структура пакетных данных.
сначала 2 байта размер читаемого без самого размера и следущих 2 байт. (отсуда -4 байта)
потом 2 байта айди. и кстати каждый раз этот айди почему то меняется вместе с остальными данными, при одних и тех же условиях. (Данный со сниффера)
====

Явно, чтото изменяется во входящем массиве ... ибо что выше, это просто проверки, если шифровано - то делаем битРОтейт...
проверки норм проходят, говарит да, шифровано оно... но БитРотейту надо уже  мадифицированные данные... иначе никак не клеится.. да и пробовал уже кучу раз и баловался с sfift... :(

Это сообщение отредактировал(а) Felixx - 7.12.2011, 15:30
PM MAIL   Вверх
Felixx
Дата 7.12.2011, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Определение Шиврованные байты у нас или нешифрованные сделал, нормально определяет. тока вот не пойму. что оно делает с байтами перед отправкой в BitRotate

Я про эту штуковину....
Код

BitRotateEncript((unsigned __int8 *)(this + 26), v3 + 2, a2);

и
Код

BitRotateDecript((unsigned __int8 *)(this + 26), v3 + 2, a2);


Это сообщение отредактировал(а) Felixx - 7.12.2011, 17:24
PM MAIL   Вверх
Felixx
Дата 8.12.2011, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Help me please  smile 
PM MAIL   Вверх
baldina
Дата 8.12.2011, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(Felixx @  7.12.2011,  17:19 Найти цитируемый пост)
(unsigned __int8 *)(this + 26), v3 + 2, a2

ничего оно тут не делает. это вычисления адреса - смещения переменной относительно базиса
PM MAIL   Вверх
Felixx
Дата 8.12.2011, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Хм, и что это значит))???

Ну вот у меня есть 16 байт...  _bytes[] = 6EA10F44AA052E462216D71920DDD719

Я их проверяю на зашифрованность.... и если оно зашифровано то BitRotate()......

но получается совсем не то что нужно..  получается это: _bytes[] =  32DD421E89540A5C8C442DAE3241BBAE

вот код

Код

private void NetDecBtn_Click(object sender, EventArgs e)
        {
            int val = BitConverter.ToUInt16(_bytes, 0);
            NetDecrypt(val, 7);
            BufferList.Text = BitConverter.ToString(_bytes).Replace("-", "");
            setByteCount(_bytes.Length);
            label12.Text = "is Decrypted";
        }


 
Код

private void NetDecrypt(int data, int shift)
        {
            int v2;
            int v3;
            int flag;
            MessageBox.Show("data: " + data);
            v2 = data;
            flag = data + 16;
            v3 = flag & 0x7FFF;
            if ((flag & 0x8000) != 0 && v3 <= 0x22D0u) // Если размер шифрованый.
            {
                BitRotate.decrypt(_bytes, _bytes.Length, shift); // Тут что то надо делать с байтами, и длинной...
                v3 = v2 + 16; // Нафига оно?
            }
            else
            {
                MessageBox.Show("ОНО НЕ ШИФРОВАНО!");
            }
        }


На все 100% могу сказать что после BitRotate первые 2 байта должны быть 0x0C (ну или 12 - размер - 4...)
Это 100%

Это сообщение отредактировал(а) Felixx - 8.12.2011, 10:26
PM MAIL   Вверх
Felixx
Дата 8.12.2011, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



Блин, попробовал потестить на проверки шифровоности/нешифровоности...
что то не корректно определяет.. байты сую 100% шифрованные, он говорит оно не шифровано.. или наоборот..
кароче 50 на 50 .. но норм то криво определяет(
PM MAIL   Вверх
baldina
Дата 8.12.2011, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



похоже, структура данных Вам неизвестна, гадаете на кофейной гуще...
что делает BitRotate?

Добавлено через 3 минуты
Цитата(Felixx @  8.12.2011,  10:18 Найти цитируемый пост)
v2 = data;
            flag = data + 16;
v3 = flag & 0x7FFF;

ерунда какая-то. по этому коду. flag содержит смещение (адрес), а надо - содержимое по этому адресу.

PM MAIL   Вверх
Felixx
Дата 8.12.2011, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 113
Регистрация: 4.12.2008

Репутация: нет
Всего: нет



BitRotate. стандартный криптер от Zepetto, или игры Point Blank
shift всегда 7 хз почему.. но это только для расшифровки файлов клиента игры, по пакетам пробовал разные, да;е циклом от 0 до 100

после 7 выдает одни нули.... потом около 20 ваще какую то фигню пишет)
Ну я отписался в ПМ smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0539 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.