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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> из С++ в С#, Помогите переписать код 
:(
    Опции темы
Felixx
  Дата 9.10.2011, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всем привет, может кто нить переписать код с плюсов на шарп или хотябы на Java?

Код


unsigned __int8 __cdecl BitRotateDecript(unsigned __int8 *a1, unsigned int a2, unsigned int a3)
{
  unsigned __int8 result; // al@1
  char v4; // bl@1
  unsigned int v5; // ebp@1
  unsigned int v6; // esi@1
  unsigned __int8 v7; // dl@3
  unsigned __int8 i; // [sp+1Ch] [bp+Ch]@1

  result = a2;
  v4 = a3;
  v6 = a2 - 1;
  v5 = 8 - a3;
  for ( i = a1[a2 - 1]; (signed int)v6 >= 0; a1[v6 + 1] = result )
  {
    if ( (signed int)v6 <= 0 )
      v7 = i;
    else
      v7 = a1[v6 - 1];
    result = (v7 << v5) | (a1[v6--] >> v4);
  }
  return result;
}


Код

signed int __cdecl BitRotateEncript(unsigned __int8 *a1, signed int a2, unsigned int a3)
{
  signed int result; // eax@1
  unsigned int v4; // ecx@1
  char v5; // bp@1
  unsigned __int8 *v6; // esi@1
  unsigned __int8 v7; // dl@5
  char v8; // bl@7
  unsigned __int8 v9; // [sp+10h] [bp+4h]@1
  unsigned int v10; // [sp+18h] [bp+Ch]@1

  v5 = a3;
  v6 = a1;
  v9 = *a1;
  v4 = 8 - a3;
  result = 0;
  v10 = 8 - a3;
  if ( a2 > 0 )
  {
    while ( 1 )
    {
      v7 = result >= a2 - 1 ? v9 : v6[result + 1];
      v8 = v6[result++] << v5;
      v6[result - 1] = v8 | (v7 >> v4);
      if ( result >= a2 )
        break;
      LOBYTE(v4) = v10;
    }
  }
  return result;
}


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


Эксперт
****


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

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



Нужно засенить названия типов на соответстующие типы C#; указатель здесь на самом дела массивы; while(1) заменить на while(true);
LOBYTE(v4) = v10; - если я правильно понимаю, что делает макрос LOBYTE на v4 = (v4&~0xFF)|(v10&0xFF);
__cdecl убрать
PM   Вверх
Felixx
Дата 10.10.2011, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



По идеи, это алгоритмы шифрации/дешеврации этого файлика .
Как оно работает что то понять не могу вообще. Код что выложен взят с декомпила этого файла

Помогите пожалуста написать прогу для шифровки/расшифровки этого файла?)
Без разницы какой язык программирования, главное чтоб работало..
Или хотябы обьесните кто может, что вообще этот код делает, ну или примерно как он работать должен..
За ранее спасибо.

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


Шустрый
*


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

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



Сделал так:

Код

using System;
using System.Collections.Generic;
using System.Linq;
using System.Collections;
using System.Text;
using System.IO;
using Decrypter.crypt;

namespace Decrypter
{
    class PBEncDec
    {
        static void Main(string[] args)
        {
            //int i = 0;
            byte[] buf = File.ReadAllBytes("data\\lwsi_en.sif");
            //String ss = BitConverter.ToString(buf);
            //String[] array = ss.Split(new Char[] { '-', ',', '.', ':', '\t' });

            //byte res = EncDec.decrypt(buf, buf.Length, buf.Length);
            //Console.WriteLine("Dec byte :" +" 0x" + res);

            //foreach (byte b in buf)
            //{
             //   Console.WriteLine("byte " + i + ": " + b + "; 0x" + array[i]);
              //  i++;
            //}
            byte[] temp = buf; // Чтобы не портить buf
            for (int i = 0; i < 9; i++) // После i=9 строки идут NULL
            {

                byte b = EncDec.decrypt(buf, buf.Length, i); // Прогоняем декриптером. Нах вот возвращаетса 1 байт - ХЗ
                //temp[temp.Length] = b;
                Console.WriteLine("String " + i + ": " + Encoding.GetEncoding(1251).GetString(buf));
            }
        }
    }
}


Код

using System.Linq;
using System.Text;
using System.IO;

namespace Decrypter.crypt
{
    public class EncDec
    {
        public EncDec()
        {
        }

        public static byte decrypt(byte[] a1, int a2, int a3)
        {
            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)a2;
            v4 = (byte)a3;
            v6 = a2 - 1;
            v5 = 8 - a3;
            for (i = a1[a2 - 1]; v6 >= 0; a1[v6 + 1] = result)
            {
                if (v6 <= 0)
                    v7 = i;
                else
                    v7 = a1[v6 - 1];

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


Почти получаетса.. но как то непонятно..

В начале какие то каракули, в цткле 5 выходит
Код

String 5: r; ServerList

[Default]
UseServerSet                = "RUSSIAN_LIVE"    ; ServerList Set

[RUSSIAN_LIVE]
ServerCount                = 1
ServerIp00                = "109.105.134.72"        ; GameServe


ниже опять каруакули. кароче не до конца расшифровывает.. и не с начала, получаетса..
На угад тыкать ниче не получаетса..

Может у кого есть опыт в расшифровке файлов? Помогите плз, уже 3й день парюсь, ничего не получаетса(((

если что Open Sourse СВН: http://xp-dev.com/svn/PBEncDec


Это сообщение отредактировал(а) Felixx - 13.10.2011, 18:44
PM MAIL   Вверх
math64
Дата 13.10.2011, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вероятно, перепутаны беззнаковые и знаковые типы. Не помню, в C# byte знаковый или нет.
Массив a1 должен быть беззнаковым, иначе сдвиг вправо будет выполнен неправильно:
Код

    result = (v7 << v5) | (a1[v6--] >> v4);

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


Шустрый
*


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

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



ДОбавляю байт в конец buf  каждый цикл, тот что вернул декриптор, получаетса немного получше.

Код

            for (int i = 0; i <= 5; i++) // После i=9 строки идут NULL
            {
                byte b = EncDec.decrypt(buf, buf.Length, (uint)i); // Прогоняем декриптером. Нах вот возвращаетса 1 байт - ХЗ
                Array.Resize(ref buf, buf.Length+1); // Добавляем 1 байт.
                buf[buf.Length - 1] = b; // Вписываем в последний байт, байт что вернул декриптор.
            }
            Console.WriteLine(Encoding.GetEncoding(1251).GetString(buf));


Код

!! ServerList

[Default]
UseServerSet                = "RUSSIAN_LIVE"    ; ServerList Set

[RUSSIAN_LIVE]
ServerCount                = 1
ServerIp00                = "109.105.134.72"        ; GameServer;!!!!



Но всеравно, что то здесь не так.
Должен быть ещо и порт, это 100%, не нравятса мне эти "!!!"

byte в C# вроде как беззнаковый. Знаковый это sbyte

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


Эксперт
****


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

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



Попробу так:
Код

            // Подбираем параметр a3
            for (int i = 0; i <= 8; i++)
            {  // Копируем массив (в C# наверно, есть специальный класс для копирования массива
                // byte[]buf2 = buf // копирует указатель на массив, а не сам массив
                byte[] buf2 = new byte[buf.length];
                for(int j = 0; j < buf.length; j++) buf2[i] = buf[i];
                byte b = EncDec.decrypt(buf2, buf2.Length, i);
                //temp[temp.Length] = b;
                Console.WriteLine("String " + i + ": " + Encoding.GetEncoding(1251).GetString(buf2));
            }

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


Шустрый
*


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

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



неа.. как я понел там одни и теже байты нужно прогонять 5 раз в этот декрипт-метод.
но вот восклицательные знаки напрягают...
попробовал расшифровать другой файл, из другого клиента... тодже самое выходит:

Надо попробовать encrypt сделать! но что то оно никак не хочет переписываться на Шарп!...

Код

!! ServerList

[Default]
UseServerSet            = "Turkey_LIVE"            ; ЂЊ‡Џ >§х«‡’ ServerList Set

[Turkey_Dev]
ServerCount                = 1
ServerIp00                = "221.132.79.118"

[Turkey_QA]
ServerCount                = 1
ServerIp00                = "122.199.144.236"

[Turkey_LIVE]
ServerCount                = 4
ServerIp00                = "85.111.16.2"
ServerIp01                = "85.111.16.11"
ServerIp02                = "85.111.16.12"
ServerIp03                = "85.111.16.13"


;!!!!


Добавлено @ 21:34
math64, 
А ты можеш сделать проектик на C++? с этой инфой?
А то у меня чото не получаетса на плюсе проект накатать))

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


Шустрый
*


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

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



Если расшифровка

Код

// a1 - Все байты из текстового файла.
        // a2 - Размер а1
        // a3 - Какой раз производитса операция над а1. Должно быть не более 5!
        public static byte decrypt(byte[] a1, int a2, int a3)
        {
            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)a2;
            v4 = (byte)a3;
            v6 = a2 - 1;
            v5 = 8 - a3;
            for (i = a1[a2 - 1]; v6 >= 0; a1[v6 + 1] = result)
            {
                if (v6 <= 0)
                    v7 = i;
                else
                    v7 = a1[v6 - 1];

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


то какой while() должен быть в Шифровании?


Код

public static byte encrypt(byte[] a1, int a2, int a3)
        {
            byte 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 = a3;
            v6 = a1;
            v9 = a1[0];
            v4 = 8 - a3;
            result = 0;
            v10 = 8 - a3;
            if(a2 > 0)
            {
                while(a3 > v6.Length) // TODO какое то другое условие должно быть!
                {
                    v7 = result >= a2 - 1 ? v9 : v6[result + 1];
                    v8 = v6[result++] << v5;
                    v6[result - 1] = (byte)(v8 | v7 >> v4);
                    if (result >= a2)
                        break;
                }

            }
            return result;
        }  


PM MAIL   Вверх
math64
Дата 13.10.2011, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



При твоём цикле:
Первый прогон a3=1 - сдивиг на 1 бит
2-й прогон a3=2 - сдивиг ещё на 2 бит, итого: 3
3-й прогон a3=3 - сдивиг ещё на 3 бит, итого: 6
4-й прогон a3=4 - сдивиг ещё на 4 бит, итого: 10 (2 + целый байт, на месте конторого появляется мусор)
5-й прогон a3=5 - сдивиг ещё на 5 бит, итого: 15 (7 + 1 байт мусора)
6-й прогон a3=5 - сдивиг ещё на 6 бит, итого: 21 (5 + 2 байта мусора)
7-й прогон a3=5 - сдивиг ещё на 7 бит, итого: 28(4 + 3 байта мусора)
Турецкий файл не в 1251 - неправильная перекодировка

Добавлено через 3 минуты и 17 секунд
При шифровании должно быть while(true) или for(;;) - выход из цикла по break; -  я уже писал
PM   Вверх
Felixx
Дата 13.10.2011, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да кодировка пофиг, я этотфайл заюзал только для теста расшифровки....

у меня уже кстати так)))
Код


        public static void go(string data, string file, string help, string fpath)
        {
            byte[] buf = File.ReadAllBytes(fpath);
            for (int i = 0; i <= 5; i++) // После i=9 строки идут NULL
            {
                byte b = EncDec.decrypt(buf, buf.Length, i); // Прогоняем декриптером. Нах вот возвращаетса 1 байт - ХЗ
                Array.Resize(ref buf, buf.Length + 1); // Добавляем 1 байт.
                buf[buf.Length - 1] = b; // Вписываем в последний байт, байт что вернул декриптор.
            }
            Console.WriteLine(Encoding.GetEncoding(1251).GetString(buf));

            string newfile = help + file;
            if (File.Exists(newfile))
            {
                File.Delete(newfile);
            }
            File.Create(newfile).Write(buf, 0, buf.Length); // Пишем в файл
        }


Добавлено через 5 минут и 59 секунд
Цитата(math64 @ 13.10.2011,  22:25)
При шифровании должно быть while(true) или for(;;) - выход из цикла по break; -  я уже писал

Индекс находился вне границ массива.

Код

public static byte encrypt(byte[] a1, int a2, int a3)
        {
            byte 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 = a3;
            v6 = a1;
            v9 = a1[0];
            v4 = 8 - a3;
            result = 0;
            v10 = 8 - a3;
            if(a2 > 0)
            {
                while(true) // TODO какое то другое условие должно быть!
                {
                    v7 = result >= a2 - 1 ? v9 : v6[result + 1];
                    v8 = v6[result++] << v5;
                    v6[result - 1] = (byte)(v8 | v7 >> v4); =====>>> Вот тут
                    if (result >= a2)
                        break;
                }

            }
            return result;
        }  


Это сообщение отредактировал(а) Felixx - 13.10.2011, 22:32
PM MAIL   Вверх
math64
Дата 14.10.2011, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



После зашифровки файл становится на 1 байт длиннее - массив нужно выделить соответственно. При дешифровке, аналогично, отбросить последний байт.
PM   Вверх
Felixx
  Дата 14.10.2011, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Угу, я так и сделал.
Если не сложно, посмотри правельно ли?

Код

using System;
using System.Text;
using System.IO;

namespace crypt
{
    public class Dec
    {
        public static void go(string data, string file, string help, string fpath)
        {
            byte[] buf = File.ReadAllBytes(fpath);
            for (int i = 1; i <= 5; i++) // Прогоняем декриптером байты 5 раз.
            {
                byte b = EncDec.decrypt(buf, buf.Length, i); // Прогоняем декриптером.
                Array.Resize(ref buf, buf.Length + 1); // Добавляем 1 байт.
                buf[buf.Length - 1] = b; // Вписываем в последний байт, байт что вернул декриптор.
            }
            Console.WriteLine(Encoding.GetEncoding(1251).GetString(buf));

            string newfile = help + file;
            if (File.Exists(newfile))
            {
                File.Delete(newfile);
            }
            File.Create(newfile).Write(buf, 0, buf.Length); // Пишем в файл
        }
    }
}



Код

using System;
using System.Text;
using System.IO;

namespace crypt
{
    public class Enc
    {
        public static void go(string data, string file, string help, string fpath)
        {
            byte[] buf = File.ReadAllBytes(help + file);
            for (int i = 1; i <= 5; i++)  // 5 раз выполняем енкрипт байтов.
            {
                int b = EncDec.encrypt(buf, buf.Length, i); // Прогоняем енкриптером.
                Array.Resize(ref buf, buf.Length - 1); // Убрезаем 1 байт.
            }
            Console.WriteLine(Encoding.GetEncoding(1251).GetString(buf));

            help = "enc_";
            string newfile = help + file;
            if (File.Exists(newfile))
            {
                File.Delete(newfile);
            }
            File.Create(newfile).Write(buf, 0, buf.Length); // Пишем в файл
        }
    }
}



Код

using System;
using System.Linq;
using System.Text;
using System.IO;

namespace crypt
{
    public class EncDec
    {
        // a1 - Все байты из текстового файла.
        // a2 - Размер а1
        // a3 - Какой раз производитса операция над а1. Должно быть не более 5!
        public static byte decrypt(byte[] a1, int a2, int a3)
        {
            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)a2;
            v4 = (byte)a3;
            v6 = a2 - 1;
            v5 = 8 - a3;
            for (i = a1[a2 - 1]; v6 >= 0; a1[v6 + 1] = result)
            {
                if (v6 <= 0)
                    v7 = i;
                else
                    v7 = a1[v6 - 1];

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

        public static int encrypt(byte[] a1, int a2, int a3)
        {
            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 = a3;
            v6 = a1;
            v9 = a1[0];
            v4 = 8 - a3;
            result = 0;
            v10 = 8 - a3;
            if(a2 > 0)
            {
                while (true)
                {
                    v7 = result >= a2 - 1 ? v9 : v6[result + 1];
                    v8 = v6[result++] << v5;
                    v6[result - 1] = (byte)(v8 | v7 >> v4);
                    if (result >= a2)
                        break;
                    var lowByte = (UInt16)v4 & 0xFF;
                    var hiByte = (UInt16)v4 >> 8;
                    v4 = (int)(((UInt32)v10 & 0xFF) | ((UInt32)hiByte & 0xFF) << 8);
                }
            }
            return result;
        }
    }
}



Мусор всеравно ещо есть, видимо что то всеравно не так делаю, либо в декрипте где то косяк.... :(

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


Шустрый
*


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

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



Кому интересно, пишетса эмулятор сервера игры Point Blank и тулзы для расшифровки файлов клиента.
Пишетса на C# в будующем будет и Java версия делаться.
Если кому то стало интересно, обращайтесь в асю 919292.
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.0894 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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