Monster Hunter Freedom Unite, нужен перевод |
Здравствуйте, гость ( Вход | Регистрация )
Monster Hunter Freedom Unite, нужен перевод |
17.11.2009, 16:07
Сообщение
#1
|
|
Участник Группа: Пользователи Сообщений: 12 Регистрация: 3.2.2009 Пользователь №: 429 |
Есть несколько единомышленников, которые хотели-бы увидеть в свете русскую версию Monster Hunter Freedom Unite. Вопрос в следующем: возможно ли это? Ну и понятное дело, что мы согласны сложиться некоторой суммой вам в поддержку. Спасибо за ответ )
|
|
|
22.11.2009, 18:04
Сообщение
#2
|
|
Администратор Группа: Администраторы Сообщений: 948 Регистрация: 28.12.2007 Из: Ростов-на-Дону Пользователь №: 1 |
Нет, ребятки, скорей всего без PSP мне вряд ли удастся что-нибудь сделать. Либо я напал на ложный след, либо там всё гораздо сложнее, чем я думаю. Даже была бы у меня PSP - совсем не факт, что я бы разобрался, без дебаггера (которого для PSP нет в природе, разве что у разработчиков) довольно сложно выходит: я не знаю даже, какими именно данными оперирует процедура, адреса чего хранятся в регистрах, какие исходные данные берутся при генерации ключей для шифрования, и т.д. и т.п. В принципе, это можно было бы узнать, но заняло бы довольно много времени и сил, да и то только при наличии PSP.
Я, конечно, постараюсь ещё что-нибудь сделать, но я действую вслепую, я не могу свои догадки даже проверить. Так что в случае чего - не расстраивайтесь. А пока выпишу всё, что мне удалось узнать, на всякий случай. Если судить по той процедуре, что я нашёл (она, кстати, двусторонняя - как для шифрования, так и для дешифрования, разве что для каждого случая нужны разные матрицы, о них ниже), данные криптуются следующим образом: Имеется 32-х битный ключ, состоящий по сути из двух независимых 16-битных ключей. О нём чуть позже. Также имеются две 256-ти элементные матрицы кодов - байты от 0 до 255, разбросанные в хаотичном порядке, при этом присутствует только по одному экземпляру каждого байта. Нужны они, чтобы заменять кодами из матрицы исходные данные методом взятия кода из матрицы по индексу, которым является исходный байт. Т.е. было у нас что-либо вроде 11 00 00 00, стало 5F 56 56 56 - уже не похоже на исходные данные. По сути это можно описать как byte = matrix[byte]. Первая матрица - в одну сторону, вторая - в обратную, для декодирования. Т.е. последовательность byte = matrix[byte]; byte = matrix2[byte]; вернёт нам исходный байт. Код unsigned char changeByte(unsigned char b){ return matrix[b]; } Ключи генерируются следующим образом: если верить коду, то туда передаётся некий параметр (вообще я уверен, что на создание ключа влияет номер сектора, в котором хранятся данные, однако в коде я такого не углядел), расположенный по адресу [data_addr + size - 4] (я в этом не уверен, но код говорит именно это), при этом эти 4 байта дважды прогоняются через преобразование по матрице (matrix[matrix[byte]]), затем делятся на два ключа по 2 байта. Если первый "полуключ" получается нулевым, ему присваевается 0x215F. Если второй - 0xDFA3. Код void createKey(unsigned int value){ key1 = value & 0xFFFF; key2 = (value >> 16) & 0xFFFF; if(!key1) key1 = 0x215F; if(!key2) key2 = 0xDFA3; } Далее данные обрабатываются по 4 байта следующим образом: все 4 байта преобразуются через матрицу, затем вызывается процедура смены ключей (о ней ниже), 4 байта представляются как одно значение и xor'ятся с ключом, который возвращает процедура смены ключей. Затем 4 байта снова преобразуются. Смена ключей происходит примерно так: Код unsigned int getKey(){ key1 = (key1 * 0x215F) % 0xFF8F; key2 = (key2 * 0xDFA3) % 0xFFEF; return key1 + (key2 << 16); } Сама же процедура обработки - примерно так: Код void processData(unsigned int offset){ int i; for(i = 0; i < 4; i++) data[offset + i] = matrix[data[offset + i]]; *(unsigned int*)(&data[offset]) ^= getKey(); for(i = 0; i < 4; i++) data[offset + i] = matrix[data[offset + i]]; } А вот, собственно, сами матрицы (я не знаю, какая из них служит для кодирования, а какая для раскодирования): Код unsigned char matrix[256] = { 0x3A, 0x11, 0x72, 0x6E, 0x2F, 0x7A, 0x23, 0xF0, 0x6B, 0x5C, 0xCA, 0x41, 0x57, 0x5D, 0xB2, 0xA8, 0x06, 0x5F, 0xC9, 0xD8, 0x17, 0x82, 0xBB, 0xD2, 0x88, 0x86, 0x27, 0x47, 0xC7, 0x29, 0x5B, 0x04, 0x8E, 0xAE, 0x5E, 0x33, 0x49, 0xDB, 0xA5, 0x7B, 0x31, 0xB7, 0xB5, 0x84, 0xF6, 0x76, 0x81, 0xAD, 0x6F, 0xE0, 0x39, 0x87, 0xC0, 0xAB, 0x68, 0x4D, 0x05, 0x92, 0x77, 0xFF, 0x99, 0x36, 0x2C, 0x07, 0x0A, 0x59, 0xFA, 0xBC, 0x54, 0xE1, 0x94, 0x3D, 0x1F, 0x58, 0xA6, 0xAA, 0x53, 0x2E, 0x89, 0xEB, 0x9C, 0x98, 0x1B, 0xD6, 0xC1, 0x30, 0x00, 0xF4, 0xEF, 0x7D, 0xBF, 0xE8, 0x0C, 0xC4, 0xAC, 0xF3, 0xEA, 0x78, 0xBE, 0xAF, 0xB0, 0x08, 0xA1, 0x90, 0x60, 0x2A, 0xD4, 0x62, 0x3B, 0xA7, 0xD9, 0xED, 0x7C, 0xF5, 0xEC, 0xBA, 0x9B, 0x4A, 0x0F, 0x3C, 0x7F, 0xC6, 0x24, 0x55, 0x01, 0x43, 0x22, 0x8A, 0xA0, 0x70, 0x65, 0x67, 0x50, 0x1D, 0x96, 0x42, 0xCE, 0x20, 0x03, 0x12, 0xE3, 0x4E, 0x95, 0x26, 0xE4, 0xB8, 0xD7, 0x48, 0xD0, 0xC3, 0xB9, 0x80, 0x18, 0xD5, 0x02, 0x34, 0x21, 0x8B, 0xDF, 0xE9, 0x61, 0x79, 0x0E, 0x93, 0xA3, 0x63, 0x1A, 0x9D, 0xB3, 0xCD, 0xE6, 0x14, 0x2D, 0xDC, 0xA4, 0x9E, 0x28, 0x75, 0xA9, 0x66, 0x91, 0xBD, 0xD3, 0x6A, 0x6D, 0xFB, 0x5A, 0x8C, 0xE7, 0x64, 0x97, 0x19, 0x46, 0xFE, 0x32, 0xF2, 0x9F, 0x38, 0x9A, 0x10, 0x3F, 0x6C, 0xE2, 0xD1, 0x45, 0x15, 0xB4, 0xDE, 0x40, 0x56, 0xE5, 0x3E, 0xF9, 0xC8, 0x35, 0x16, 0x69, 0xFC, 0x85, 0x8F, 0x51, 0xA2, 0xC5, 0xEE, 0xB6, 0x8D, 0x74, 0xCC, 0xB1, 0x4F, 0x25, 0xFD, 0x7E, 0x1C, 0x09, 0x13, 0x4B, 0x37, 0xCF, 0xDA, 0x4C, 0xF7, 0xC2, 0x52, 0x2B, 0xF1, 0x1E, 0xF8, 0x0B, 0x83, 0xCB, 0x44, 0x0D, 0x73, 0x71, 0xDD }; unsigned char matrix2[256] = { 0x56, 0x7C, 0x9A, 0x8A, 0x1F, 0x38, 0x10, 0x3F, 0x65, 0xEA, 0x40, 0xF8, 0x5C, 0xFC, 0xA2, 0x76, 0xC7, 0x01, 0x8B, 0xEB, 0xAB, 0xCD, 0xD7, 0x14, 0x98, 0xBF, 0xA6, 0x52, 0xE9, 0x85, 0xF6, 0x48, 0x89, 0x9C, 0x7E, 0x06, 0x7A, 0xE6, 0x8F, 0x1A, 0xB0, 0x1D, 0x69, 0xF4, 0x3E, 0xAC, 0x4D, 0x04, 0x55, 0x28, 0xC2, 0x23, 0x9B, 0xD6, 0x3D, 0xED, 0xC5, 0x32, 0x00, 0x6C, 0x77, 0x47, 0xD3, 0xC8, 0xD0, 0x0B, 0x87, 0x7D, 0xFB, 0xCC, 0xC0, 0x1B, 0x93, 0x24, 0x75, 0xEC, 0xF0, 0x37, 0x8D, 0xE5, 0x84, 0xDC, 0xF3, 0x4C, 0x44, 0x7B, 0xD1, 0x0C, 0x49, 0x41, 0xBA, 0x1E, 0x09, 0x0D, 0x22, 0x11, 0x68, 0xA0, 0x6B, 0xA5, 0xBD, 0x82, 0xB3, 0x83, 0x36, 0xD8, 0xB7, 0x08, 0xC9, 0xB8, 0x03, 0x30, 0x81, 0xFE, 0x02, 0xFD, 0xE2, 0xB1, 0x2D, 0x3A, 0x61, 0xA1, 0x05, 0x27, 0x70, 0x59, 0xE8, 0x78, 0x97, 0x2E, 0x15, 0xF9, 0x2B, 0xDA, 0x19, 0x33, 0x18, 0x4E, 0x7F, 0x9D, 0xBB, 0xE1, 0x20, 0xDB, 0x67, 0xB4, 0x39, 0xA3, 0x46, 0x8E, 0x86, 0xBE, 0x51, 0x3C, 0xC6, 0x74, 0x50, 0xA7, 0xAF, 0xC4, 0x80, 0x66, 0xDD, 0xA4, 0xAE, 0x26, 0x4A, 0x6D, 0x0F, 0xB2, 0x4B, 0x35, 0x5E, 0x2F, 0x21, 0x63, 0x64, 0xE4, 0x0E, 0xA8, 0xCE, 0x2A, 0xE0, 0x29, 0x91, 0x96, 0x73, 0x16, 0x43, 0xB5, 0x62, 0x5A, 0x34, 0x54, 0xF2, 0x95, 0x5D, 0xDE, 0x79, 0x1C, 0xD5, 0x12, 0x0A, 0xFA, 0xE3, 0xA9, 0x88, 0xEE, 0x94, 0xCB, 0x17, 0xB6, 0x6A, 0x99, 0x53, 0x92, 0x13, 0x6E, 0xEF, 0x25, 0xAD, 0xFF, 0xCF, 0x9E, 0x31, 0x45, 0xCA, 0x8C, 0x90, 0xD2, 0xAA, 0xBC, 0x5B, 0x9F, 0x60, 0x4F, 0x72, 0x6F, 0xDF, 0x58, 0x07, 0xF5, 0xC3, 0x5F, 0x57, 0x71, 0x2C, 0xF1, 0xF7, 0xD4, 0x42, 0xB9, 0xD9, 0xE7, 0xC1, 0x3B }; Однако, на деле это ничего не дало, что говорит о том, что я либо чего-то не учёл, либо с данным происходят ещё какие-то преобразования, либо я вообще копаю не в ту сторону. -------------------- |
|
|
Текстовая версия | Сейчас: 8.6.2024, 8:05 |