Jump to content
Korean Random
Sign in to follow this  
axazol

Расшифровка кеша

Recommended Posts

Как расшифровать сам кеш можно найти тут - https://github.com/P...he-to-JSON или тут - http://code.google.c.../source/browse/

Поскольку шифровка идёт на родном для игры питоне то и дешифровать это легче всего питоном. Благо это некоим образом не сложно.

К примеру вариант для С#

using IronPython.Hosting;
namespace TankTest
{
class Program
{
 static unsafe void Main(string[] args)
 {
	 var ironPythonRuntime = Python.CreateRuntime();
	 try {
		 dynamic loadIPython = ironPythonRuntime.UseFile("../../pyparse.py");
		 var data = loadIPython.parse("../../cache.dat");
// SOME CODE...

 

У меня же вопрос как расшифровать имя из имени файла кеша что бы приобщить получаемую инфу к конкретному игроку?

Скажу сразу, пароли хранятся в другом месте и в другом виде. ;)

Share this post


Link to post

Short link
Share on other sites
У меня же вопрос как расшифровать имя из имени файла кеша что бы приобщить получаемую инфу к конкретному игроку?

 

Похоже это base64 немного видоизменённый. Чтобы узнать как именно изменённый - надо покопаться в игровых ресурсах либо проанализировать много имён файлов с известными входными данными.

Share this post


Link to post

Short link
Share on other sites

К примеру мои:

NRXWO2LOFZYD C LTXN5ZGYZDPMZ2GC3TLOMXG4ZLUHIZDAMBRGQ5WC6DBPJXWY===
NRXWO2LOFZYD E LTXN5ZGYZDPMZ2GC3TLOMXG4ZLUHIZDAMBRGQ5WC6DBPJXWY===
NRXWO2LOFZYD I LTXN5ZGYZDPMZ2GC3TLOMXG4ZLUHIZDAMBRGQ5WC6DBPJXWY===
MF4GC6TPNQ5TCNJWGY3A====

Пробелами выделено различия имён. последнее имя папки с результатами боёв. Имя = имя тут.

Share this post


Link to post

Short link
Share on other sites

У меня же вопрос как расшифровать имя из имени файла кеша что бы приобщить получаемую инфу к конкретному игроку?

Скажу сразу, пароли хранятся в другом месте и в другом виде. ;)

кажись имя игрока внутри кэша, а не в названии

могу дать исходники одного анализатора кэша, правда я там не разбирался где оно достаёт ник

wot-personal-statistics

 

ЗЫ, ошибся, таки в имени

Имя файла закодировано алгоритмом Base32. При раскодировке из него можно взять ник игрока и сервер на котором играл игрок.

Edited by VicKing

Share this post


Link to post

Short link
Share on other sites

Что-то либо я не тем конвертирую либо...

 

конвертер - http://www.atrevido.net/blog/PermaLink.aspx?guid=debdd47c-9d15-4a2f-a796-99b0449aa8af

выхлоп

LTXN5ZGYZDPMZ2GC3TLOMXG4ZLUHIZDAMBRGQ5WC6DBPJXWY
Byte32 {byte[30]} "30 26 251 68 164 34 125 45 70 84 7 250 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 "
UTF8 "�D�\"}-FT\a�������������������"
ASCII "?D?\"}-FT\a???????????????????"
Unicode "᨞䓻⊤⵽呆輻........."

Share this post


Link to post

Short link
Share on other sites

Как верно сказал @VicKing - это base32

 

Примеры раскодирования строк:

 

NRXWO2LOFZYDCLTXN5ZGYZDPMZ2GC3TLOMXG4ZLUHIZDAMBRGQ5WC6DBPJXWY===
login.p1.worldoftanks.net:20014;axazol[1]

 

 

NRXWO2LOFZYDELTXN5ZGYZDPMZ2GC3TLOMXG4ZLUHIZDAMBRGQ5WC6DBPJXWY===
login.p2.worldoftanks.net:20014;axazol[1]

 

 

NRXWO2LOFZYDILTXN5ZGYZDPMZ2GC3TLOMXG4ZLUHIZDAMBRGQ5WC6DBPJXWY===
login.p4.worldoftanks.net:20014;axazol[1]

 

Отличающаяся буква, на которую вы указали - это номер логин-сервера, при подключении к которому генерировался файл кеша досье.

 

Пример рабочего base32 онлайн-декодера: http://tomeko.net/on...e32.php?lang=en

Share this post


Link to post

Short link
Share on other sites

Хех, я и на дельфи имею вариант... Вот только не на более приятном С# =(

Share this post


Link to post

Short link
Share on other sites

1. bitbucket.org/Lazin/base32transcoder/src (C#)

 

2.

public class Base32Encoding
{
public static byte[] ToBytes(string input)
{
 if (string.IsNullOrEmpty(input))
 {
	 throw new ArgumentNullException("input");
 }
 input = input.TrimEnd('='); //remove padding characters
 int byteCount = input.Length * 5 / 8; //this must be TRUNCATED
 byte[] returnArray = new byte[byteCount];
 byte curByte = 0, bitsRemaining = 8;
 int mask = 0, arrayIndex = 0;
 foreach (char c in input)
 {
	 int cValue = CharToValue(c);
	 if (bitsRemaining > 5)
	 {
		 mask = cValue << (bitsRemaining - 5);
		 curByte = (byte)(curByte | mask);
		 bitsRemaining -= 5;
	 }
	 else
	 {
		 mask = cValue >> (5 - bitsRemaining);
		 curByte = (byte)(curByte | mask);
		 returnArray[arrayIndex++] = curByte;
		 curByte = (byte)(cValue << (3 + bitsRemaining));
		 bitsRemaining += 3;
	 }
 }
 //if we didn't end with a full byte
 if (arrayIndex != byteCount)
 {
	 returnArray[arrayIndex] = curByte;
 }
 return returnArray;
}
public static string ToString(byte[] input)
{
 if (input == null || input.Length == 0)
 {
	 throw new ArgumentNullException("input");
 }
 int charCount = (int)Math.Ceiling(input.Length / 5d) * 8;
 char[] returnArray = new char[charCount];
 byte nextChar = 0, bitsRemaining = 5;
 int arrayIndex = 0;
 foreach (byte b in input)
 {
	 nextChar = (byte)(nextChar | (b >> (8 - bitsRemaining)));
	 returnArray[arrayIndex++] = ValueToChar(nextChar);
	 if (bitsRemaining < 4)
	 {
		 nextChar = (byte)((b >> (3 - bitsRemaining)) & 31);
		 returnArray[arrayIndex++] = ValueToChar(nextChar);
		 bitsRemaining += 5;
	 }
	 bitsRemaining -= 3;
	 nextChar = (byte)((b << bitsRemaining) & 31);
 }
 //if we didn't end with a full char
 if (arrayIndex != charCount)
 {
	 returnArray[arrayIndex++] = ValueToChar(nextChar);
	 while (arrayIndex != charCount) returnArray[arrayIndex++] = '='; //padding
 }
 return new string(returnArray);
}
private static int CharToValue(char c)
{
 int value = (int)c;
 //65-90 == uppercase letters
 if (value < 91 && value > 64)
 {
	 return value - 65;
 }
 //50-55 == numbers 2-7
 if (value < 56 && value > 49)
 {
	 return value - 24;
 }
 //97-122 == lowercase letters
 if (value < 123 && value > 96)
 {
	 return value - 97;
 }
 throw new ArgumentException("Character is not a Base32 character.", "c");
}
private static char ValueToChar(byte b)
{
 if (b < 26)
 {
	 return (char)(b + 65);
 }
 if (b < 32)
 {
	 return (char)(b + 24);
 }
 throw new ArgumentException("Byte is not a value Base32 value.", "b");
}
}

Edited by TwoPizza

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...