Что мешает нам зайти?
1. 3 крипт ключа, для передачи инфы вовремя логина
2. изменен коэфициент в формуле для определения будующих ключей
Начнем со второго. Когда вы залогинились сервер присылает рандомное число Seed и на основании него происходит шафрование всего последующего игрового трафика трафика.
как это выглядит в реале (воспользуюсь исходниками инжи)
Code:
void LoginCrypt::init(unsigned char * pseed, unsigned int k1, unsigned int k2)
{
unsigned int seed;
N2L(pseed, seed);
m_key[0] =
(((~seed) ^ 0x00001357) << 16)
| ((seed ^ 0xffffaaaa) & 0x0000ffff);
m_key[1] =
((seed ^ 0x43210000) >> 16)
| (((~seed) ^ 0xabcdffff) & 0xffff0000);
m_k1 = k1;
m_k2 = k2;
}
изменен какраз 0x00001357 коэффициет за менили на 0x0000135f
в клиенте эта функция мало чем отличается от инжовой по этому легко найти;) Изменения этого коэффициента происходят после загрузки дллки тоесть сам клиент содержит нормальное родное число... длл его правит в момент загрузки.
Что касается 3 ключей. Они опять таки на прямую не прописаны... Длл перезаписывает xor команды на вызов своих процедур в которых тотже xor но уже с другим значение (куда проще было это значение просто переписать), возможно хитрость за ключалось в том что процедуры лежат в далюких некому не нужных сегментах и при дампе они просто не дампятся. Вытаскиваем ключи и наживую пишем в клиент и и справляет коэффициент. И заменяем abyss.dll на advapi32.dll в таблице импорта.
С инжектом тежелей он не умеет работать с 3 ключами...
Code:
void LoginCrypt::encrypt(unsigned char * in, unsigned char * out, int len)
{
for(int i = 0; i < len; i++)
{
out[i] = in[i] ^ static_cast<unsigned char>(m_key[0]);
unsigned int table0 = m_key[0];
unsigned int table1 = m_key[1];
m_key[1] =
(
(
(
((table1 >> 1) | (table0 << 31))
^ m_k1
)
>> 1
)
| (table0 << 31)
) ^ m_k1;
m_key[0] = ((table0 >> 1) | (table1 << 31)) ^ m_k2;
}
}
Code:
| (table0 << 31)
) ^ m_k1;
тут в место m_k1 должен быть m_k2
Code:
m_key[0] = ((table0 >> 1) | (table1 << 31)) ^ m_k2;
а тут m_k3
Но ввиду того что все компилятор имеет своство выравнивать код было достаточно пустот чтобы эту функцию подредактить;) Тоже правим в инжекте правим и коэфициент.
Но на этом не закончено. Уних там есть приблуда которая каверкает пакеты а имено перезаписывает их номера.
Тоесть зайти вы зайдете но не поиграете;)
С пакетами буду разбиратся позже