First login-server sends packet with encryption key:
Код:
07 00 15 0d 01 e8 03
The last three bytes are encoding key (different for each session). Then RFO client will transform these data:
Код:
004444FF 90 NOP
00444500 /$ 56 PUSH ESI
00444501 |. 8BF1 MOV ESI,ECX
00444503 |. 68 B8E94C00 PUSH RF.004CE9B8 ; ASCII "<4> RecvCryptKeyRequest"
00444508 |. 8B86 F4350400 MOV EAX,DWORD PTR DS:[ESI+435F4]
0044450E |. 50 PUSH EAX
0044450F |. E8 EC6B0000 CALL RF.0044B100
00444514 |. 50 PUSH EAX
// Saving into log file
00444515 |. E8 766E0000 CALL RF.0044B390
// Moving to EAX key-pointer
0044451A |. 8B4424 18 MOV EAX,DWORD PTR SS:[ESP+18]
// Allocation 12 bytes in stack
0044451E |. 83C4 0C ADD ESP,0C
// Moving to CX last 2 bytes of a key (0x03e8 in this case)
00444521 |. 66:8B48 01 MOV CX,WORD PTR DS:[EAX+1]
// Moving to DL first byte of key (0x01 in this case)
00444525 |. 8A10 MOV DL,BYTE PTR DS:[EAX]
// CX += 3
00444527 |. 66:83C1 03 ADD CX,3
// DL++
0044452B |. FEC2 INC DL
Now we have two keys. Then XORing auth-packet with them:
Код:
// EDI - counter
// CL - first key
// AL - second key
004445E1 |. BF 1B000000 MOV EDI,1B
// Cycle beggining
// Moving to DL current byte of non-encrypted auth-packet
004445E6 |> 8A16 /MOV DL,BYTE PTR DS:[ESI]
// Add to it the first key.
004445E8 |. 02D1 |ADD DL,CL
// XORing result (DL) with the second key
004445EA |. 32D0 |XOR DL,AL
// Writing result back to packet.
004445EC |. 8816 |MOV BYTE PTR DS:[ESI],DL
// Incementing pointer.
004445EE |. 46 |INC ESI
// Decrementing counter.
004445EF |. 4F |DEC EDI
// Quit when counter will be 0.
004445F0 |.^75 F4 \JNZ SHORT RF.004445E6
The most interesting thing, that the last byte of "key-packet" (0x03 in this case) isnt use while encrypting auth-packet.
Now look what we had before encryption (login AAAA, password BBBB):
0x00 | 1f 00 15 03 41 41 41 41 00 00 00 00 00 00 00 00
0x10 | 00 42 42 42 42 00 00 00 00 00 00 00 00 00 00
After:
0x00 | 1f 00 15 03 a8 a8 a8 a8 e9 e9 e9 e9 e9 e9 e9 e9
0x10 | e9 21 21 21 21 e9 e9 e9 e9 e9 e9 e9 e9 e9 00
By the way, "Z XOR 0 = Z", so we can easily decrypt any auth-packet even if we have no key!
-------------------------------------------------------------
Перевод:
Сначало логин сервер посылает пакет с ключем шифрования:
Код:
07 00 15 0d 01 e8 03
Последние 3 байта являются ключевыми в кодировке (разные для каждой сессии ). Потом клиент RFO преобразовывает эти данные:
Код:
004444FF 90 NOP
00444500 /$ 56 PUSH ESI
00444501 |. 8BF1 MOV ESI,ECX
00444503 |. 68 B8E94C00 PUSH RF.004CE9B8 ; ASCII "<4> RecvCryptKeyRequest"
00444508 |. 8B86 F4350400 MOV EAX,DWORD PTR DS:[ESI+435F4]
0044450E |. 50 PUSH EAX
0044450F |. E8 EC6B0000 CALL RF.0044B100
00444514 |. 50 PUSH EAX
// Сохранение в лог файл
00444515 |. E8 766E0000 CALL RF.0044B390
// Перемещение в EAX key-pointer
0044451A |. 8B4424 18 MOV EAX,DWORD PTR SS:[ESP+18]
// Распределение 12 байт в стек
0044451E |. 83C4 0C ADD ESP,0C
// Moving to CX last 2 bytes of a key (0x03e8 in this case)
00444521 |. 66:8B48 01 MOV CX,WORD PTR DS:[EAX+1]
// Перемещение в DL первый байт ключа (0x01 в данном случае)
00444525 |. 8A10 MOV DL,BYTE PTR DS:[EAX]
// CX += 3
00444527 |. 66:83C1 03 ADD CX,3
// DL++
0044452B |. FEC2 INC DL
Now we have two keys. Then XORing auth-packet with them:
Код:
// EDI - counter
// CL - 1 ключ
// AL - 2 ключ
004445E1 |. BF 1B000000 MOV EDI,1B
// Cycle beggining
// Moving to DL current byte of non-encrypted auth-packet
004445E6 |> 8A16 /MOV DL,BYTE PTR DS:[ESI]
// Add to it the first key.
004445E8 |. 02D1 |ADD DL,CL
// XORing result (DL) with the second key
004445EA |. 32D0 |XOR DL,AL
// Запись результата обратно в пакет.
004445EC |. 8816 |MOV BYTE PTR DS:[ESI],DL
// Incementing pointer.
004445EE |. 46 |INC ESI
// Decrementing counter.
004445EF |. 4F |DEC EDI
// Quit when counter will be 0.
004445F0 |.^75 F4 \JNZ SHORT RF.004445E6
Самое интересное то, что последний байт "ключ-пакет" (0x03 в данном случае) isn't использования при шифровании авт-пакета.
Пакет до шифрования (Логин AAAA, пароль BBBB):
0x00 | 1f 00 15 03 41 41 41 41 00 00 00 00 00 00 00 00
0x10 | 00 42 42 42 42 00 00 00 00 00 00 00 00 00 00
После:
0x00 | 1f 00 15 03 a8 a8 a8 a8 e9 e9 e9 e9 e9 e9 e9 e9
0x10 | e9 21 21 21 21 e9 e9 e9 e9 e9 e9 e9 e9 e9 00
Кстати, "Z XOR 0 = Z", так что мы можем легко расшифровать любой авт-пакета, даже если у нас нет ключа!
-----------------------------------------------------------
копирайт с rf-cheats.org
перевод с гугла с моими правками (где знал, там подправил)
warning:сам не проверял,но на читсе постил сам дарк - значит скорее всего алгоритм правельный