Итак, вопросы выбора языка программирования, сокетных библиотек и т.п. осуждаться не будут, ибо на вкус и цвет все фломастеры разные. А обсуждаться будут 2 наиболее интересных момента написании лоадера :
1. Обмен пакетами с login-сервером
Итак, по шагам : 1. Коннектимся с сервером авторизации
2. - Отсылаем пакет на запрос ключей для шифрования логина/пароля
05 00 15 0C FF
- Получаем ответ от сервера с ключами :
07 00 15 0D 04 A4 03
где :
04 = PlusKey
A4 = XORKey
Дальше идёт корейский мега-ход-конём =))
PlusKey = PlusKey + 1
XORKey = XORKey + 3
3. Шифруем логин и пароль, отправляем их серверу.
Строки логина и пароля по длине (maxPasswordLength) = 12 символов. Корейцы добавляют один про запас. Таким образом алгоритм шифрования, на примере пароля выгладит так :
for i := 1 to maxPasswordLength + 1 do
begin
if i <= length(aPassword) then aByte := ord(aPassword[i]) else aByte := 0;
aByte := aByte + aPlusKey;
aByte := aByte xor aXORKey;
end;
Добавляем завершающий 00 и в итоге пакет принимает вид :
1F 00 15 03 XX XX XX XX XX XX XX XX XX XX XX XX XX YY YY YY YY YY YY YY YY YY YY YY YY YY 00
где :
XX XX XX XX XX XX XX XX XX XX XX XX XX и
YY YY YY YY YY YY YY YY YY YY YY YY YY
соотсветственно зашифрованные логи и пароль.
4. Получаем и разбираем ответ сервера
0E 00 15 04 AA XX XX XX XX 01 00 00 00 00
здесь :
AA - Код резльтата (0x00 - всё норм, 0x06 - неверный логин или пасс)
XX XX XX XX - ID аккаунта
00 01 00 00 00 - Признак премиума (1 = премиум, другое значение - нет)
5. Посылаем запрос на список игровых серверов
08 00 15 05 00 00 00 00
6. Разбираем ответы - список серверов
30 00 15 06 AA 29 00 05 01 06 54 72 69 61 6E 00 01 04 41 73 75 00 01 07 41 6E 6F 6D 69 61 00 01 06 4E 6F 76 75 73 00 01 07 46 61 6C 67 6F 6E 00
здесь :
AA - Код резльтата (0x00 - всё норм, другие не попадались)
29 00 - Количество оставшихся байт в пакете
05 - Количество серверов в пакете
01 06 54 72 69 61 6E 00 - запись об одном сервере :
01 - Включён / отключён
06 54 72 69 61 6E - навзание сервера
00 - Завершающий 0x00
- нагруженность серверов
0F 00 15 42 05 01 00 01 00 01 00 01 00 01 00 где :
05 - количество серверов, по которым идут данные
01 00 - состояние сервера (00 - Normal, 01 - Busy)
- назначение этого пакета осталось для меня загадкой
0A 00 15 43 05 00 00 00 00 00
таким образом все полученные сревера нужно разместить в список или массив, индексы в котором начинаются с нуля.
7. Посылаем запрос на подключение к желаемому серверу
06 00 15 07 02 00, здесь :
02 - порядковый номер сервера в списке (считая от нуля)
8. Разбираем ответ
33 00 15 08 00 59 F9 12 8C 84 6C 09 20 C0 B8 C4 00 15 CD F7 AE 7E FD 2B EC B0 32 8B 0C 00 96 3B 5D 07 30 B7 87 5F 43 BB 35 45 15 25 B3 CD 11 64 4B FA 40
где :
00 - Код результата операции
59 F9 12 8C - IP сервера
84 6C - Порт сервера
Дальше идёт ключ сессии, разобьём его на DWORD'ы, далее будет понятно, зачем =)
09 20 C0 B8 (0)
C4 00 15 CD (1)
F7 AE 7E FD (2)
2B EC B0 32 (3)
8B 0C 00 96 (4)
3B 5D 07 30 (5)
B7 87 5F 43 (6)
BB 35 45 15 (7)
25 B3 CD 11 (8)
64 4B FA 40 (9)
На этом с общением с сервером авторизации - всё.
2. Создание файла defaultset.tmp, так необходимого клиенту
файл <GameDir>/System/DefaultSet.tmp необходим клиенту (rf_online.bin) для того, чтобы подружиться с сервером. Строится он очень просто из следующих составляющих :
+ IP сервера XOR 0xCB9C4B3A
+ Порт сервера XOR 0x4FB6
+ 13 байт логина игрока без "шифрования"
+ AccountID XOR 0x6E65E0AF (из пакета 1504)
+ сервера XOR 0xCB9C4B3A
+ Session key (5) XOR 0xCFCF22E6 (из пакета 1508)
+ Session key (3) XOR 0x5BBCDE6F (из пакета 1508)
+ Session key (7) XOR 0xACDF5EDA (из пакета 1508)
+ Session key (1) XOR 0xBCCD1B37 (из пакета 1508)
+ Порядковый номер выбранного сервера XOR 0x4B3A
+ AccountID XOR 0xC89C183A (из пакета 1504)
+ Premium Flag XOR 0xC89C183A (из пакета 1504)
Вот это и будут заветные 49 байт, которых так не хватает клиенту.
После создания файла можно пулять клиентский бинарник rf_online.bin
Ну, и для того, чтобы расставить все точеи на Ё - как запретить клиенту проверять наличие своей копии в памяти
Для этого всего лишь нужно подправить один jump, чтобы он просто миновал процедуру проверки. В дельфёвом коде это выглядит как :
var
bytesread : dword;
addrSingleInstCheck : dword = $006a56c4;
patchSingleInstCheck : word = $5F75;
....
WriteProcessMemory(ProcessID, pointer(addrSingleInstCheck), @patchSingleInstCheck, sizeof(patchSingleInstCheck), bytesread);
Вот и всё, ребята.
Последний раз редактировалось Тигрь; 24.05.2012 в 12:28.
Мой проект RFO Helper - заморожен пожалуй, навсегда...
можно было бы просто выложить твой Лоадер под хайдом 70-80)))))))))))) и того меньше,
Надо подумать
Цитата:
Сообщение от CoMoToZa
проги для открытия 2 окон выложены под хайдом 10-15
Сейчас понижу хайд на этот фрагмент.
Цитата:
Сообщение от gambler
Хайд выше 150 видят единицы на форуме, а точнее модераторы и админы, т.е. дарк сотоварищи.
Изложенная выше информация является плодом упорных раскопок. Нигде в тырнете аналогичная инфа не выложена.
А если Дарк сотоварищи решит, что хайд неоправданно высок - он его понизит.
Последний раз редактировалось vogel; 12.03.2008 в 16:17.
Мой проект RFO Helper - заморожен пожалуй, навсегда...
йопта, я думаю написать свой лоадер будет сложнее, чем запустить дебагер и посмотреть как там происходит шифрация, причем екзешник там чистый...
Вовсе нет. После анализа сниффа и дизассемблирования потребовалось примерно 2 часа чтобы его написать (включая отладку). Просто вот решил выложить инфу, вдруг Дарк оценит старания и накинет постов
Мой проект RFO Helper - заморожен пожалуй, навсегда...
Вовсе нет. После анализа сниффа и дизассемблирования потребовалось примерно 2 часа чтобы его написать (включая отладку). Просто вот решил выложить инфу, вдруг Дарк оценит старания и накинет постов
за что ? за то, что ты убил нашу годовую монополию ? :6:
Понадобилось чтобы прошел целый год, прежде чем кто то еще расковырял клиент.
Дарк, мы больше не монополисты ыыыыы.
Но, целый год монополии тоже было не плохо.
Последний раз редактировалось Sauron; 21.03.2008 в 01:46.
ещё мы со Штормом, 2 нуба, методом тыка будем делать свой лоадер на делфях, не зная этого языка ))))) Чувствую будет весело... по крайней мере тем на форуме комедийных прибавиться...
ещё мы со Штормом, 2 нуба, методом тыка будем делать свой лоадер на делфях, не зная этого языка ))))) Чувствую будет весело... по крайней мере тем на форуме комедийных прибавиться...
за что ? за то, что ты убил нашу годовую монополию ? :6:
Мононполию на знание IDA, Delphi и умение юзать не только сниффер но и мозг ? :6:
Я же не выложил готовый лоадер, так что Ваша монополия так и остаётся монополией.
Последний раз редактировалось vogel; 21.03.2008 в 13:29.
Мой проект RFO Helper - заморожен пожалуй, навсегда...
Мононполию на знание IDA, Delphi и умение юзать не только сниффер но и мозг ? :6:
Я же не выложил готовый лоадер, так что Ваша монополия так и остаётся монополией.
Монополию на информацию. Ты выложил эту информацию.
И теперь полезут десятки левых недолоадеров, которые ничего не принесут, кроме как ускорят изменение технологии защиты клиента.
Последний раз редактировалось Sauron; 21.03.2008 в 13:52.