Jump to content
Korean Random
angelsoft

Мод менеджер аккаунтов для WOT

Recommended Posts

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

Сейчас главное дождаться обновы, протестить ее, найти если будут косяки, исправить их, а уж потом, если будет желание у мододела, предлагать новые фичи.

Edited by SEREGA_SF

Share this post


Link to post

Short link
Share on other sites

Сейчас постараюсь просто и понятно объяснить как правильно сделать шифрование, даже если мод является общедоступным.

 

Часть 1. Как зашифровать данные

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

 

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

 

По этой причине первый вариант - это и есть шифрование. В то время как второй вариант - это по сути просто запутывание исходных данных.

Примеры:

  • Шифрование xor-ом по внешнему ключу, который запрашивается у юзвера:
  • key  = raw_input()                       #запрашиваем ключ у пользователя
    data = 'Hello!'                          #исходные данные
    
    def data_xor(data, key):
        from itertools import izip, cycle
        return ''.join(map(chr,[x^y for (x,y) in izip(map(ord,data), cycle(map(ord,key)))]))
    
    print 'Data: %s  Key: %s' % (data, key)
    new_data = data_xor(data, key)           #шифрование данных
    print 'Encrypt data: %s' % new_data
    new_data = data_xor(new_data, key)       #расшифровка данных 
    print 'Decrypt data: %s' % new_data
    
  • Запутывание или сокрытые информации, ключ внутренний и храниться вместе с данными в конце в перевернутом виде:
  • data = 'Hello!'                                           #исходные данные
    
    def new_key():
        from random import randint
        return ''.join(map(chr, [randint(0, 255) for x in range(10)]))
    
    def data_xor(data, key):
        from itertools import izip, cycle
        return ''.join(map(chr,[x^y for (x,y) in izip(map(ord,data), cycle(map(ord,key)))]))
    
    key = new_key()                                           #внутренний ключ
    new_data = data_xor(data, key) + key[::-1]                #шифрование данных вместе с ключом
    print 'Encrypt data: %s' % new_data
    new_data = data_xor(new_data[:len(new_data)-10], new_data[::-1][:10]) #извлечение ключа и расшифровка им данных
    print 'Decrypt data: %s Key: %s' % (new_data, key)
    

 

Часть 2. Как правильно сделать мод с открытым кодом, чтобы данные которые он сбрасывает на диск были зашифрованы

Всё очень просто, тот факт, что код мода общедоступен, вовсе не является препятствием для шифрования данных.

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

Разберем эти пункты:

 

1. Технически тот пример шифрования, что я привел выше первым - это и есть шифрование с мастер-ключом. Однако, в том виде как он написан выше он нам не подходит. Почему? Да очень просто - а если на компьютере два юзвера и оба юзают мод, первый хочет использовать мастер-ключ, а второй не хочет. Но при этом оба хотят чтобы данные открыто не хранились. Решить такую задачу можно совместив первый и второй примеры:

data = 'Hello!'                                            #исходные данные
try:
    master_key = raw_input()                               #запрашиваем мастер-ключ у юзвера
except:
    master_key = '0123456789'                              #юзвер не захотел его ввести, берем ключ по умолчанию

def new_key():
    from random import randint
    return ''.join(map(chr, [randint(0, 255) for x in range(10)]))

def data_xor(data, key):
    from itertools import izip, cycle
    return ''.join(map(chr,[x^y for (x,y) in izip(map(ord,data), cycle(map(ord,key)))]))

key = new_key()                                             #внутренний ключ
new_data = data_xor(data, data_xor(key, str(hash(master_key)))) + key[::-1] #шифруем данные внутренним ключом, который предварительно зашифрован хэшем мастер-ключа
print 'Encrypt data: %s' % new_data
new_data = data_xor(new_data[:len(new_data)-10], data_xor(new_data[::-1][:10], str(hash(master_key)))) #извлечение внутреннего ключа, шифровка его хэшем мастер-ключа и расшифровка данных
print 'Decrypt data: %s Master-Key: %s Internal-Key: %s' % (new_data, master_key, key)

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

 

2. Перейдем ко второму пункту, здесь несколько сложнее. Дело в том, что практически всегда взлом осуществляется не в лоб, т.е. расшифровкой данных, а чаще всего перехватом уже расшифрованных данных, хаком кода программы, модификацией исполняемой среды и т.д. и т.п. Эти методы оказываются куда более действенными нежели попытки расшифровать закодированные данные. Следовательно, такие пути и возможности нужно по максимуму закрывать и пресекать.

 

Так например, выше в коде я не стал использовать мастер-ключ как таковой для шифрования, а вместо этого извлекаю его хэш и уже хэш выступает в роли крипто-ключа. Зачем так делается? Такое встречается повсеместно. Причины этому - запутывание алгоритма шифрования, т.е. если начать отслеживать как программа работает и какие операции с мастер-ключом происходят, то можно легко убедиться, что в самом коде шифрования мастер-ключ как таковой в своем первозданном виде ни как не используется и ни какие операции с данными с его участием не производятся. В чем здесь профит? Да хотя бы в том, что если злоумышленник как-то и перехватит хэш ключа, то зная хэш, восстановить сам ключ он все равно не сможет. Как известна операция вычисления хэша необратима. Выходит, что если подобных преобразований в коде очень много, то сумев взломать какую-то часть кода, злоумышленник получит исключительно промежуточную информацию, но не сможет понять как она связана с предыдущей или с последующими. На нашем примере такого профита можно и не увидеть, но это потому что он простенький.

 

Вернемся к коду, в том виде как он написан выше, код явно небезопасен.

 

А) Обязательно следует защитить мод от какой-либо модификации или подмены из вне

 

Представьте, что вы скачали мод с открытым кодом и стали его юзать. Кто-то у вас дома решил стырить ваши пароли с компьютера, все что ему надо это открыть исходник, вписать туда print в нужном месте, скомпилить pyc-файл и после этого подождать, когда вы сядете играть и введете свой мастер-ключ, после этого в логах появится инфа, нужная злоумышленнику. Всё. Выходит, что код мода следует обязательно защитить от модификации, например, тем же Орионом.

 

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

 

Чтобы мод стал уникальным в примере выше можно сделать так. Строку

key = new_key()                          #внутренний ключ

заменить на строки

uni_key = 'd1Zk3e56Yy'
key = data_xor(new_key(), str(hash(uni_key)))  #шифруем сгенерированный внутренний ключ хэшем уникальной константы

Б) Обязательно следует исключить какие-либо возможности перехвата шифруемых или расшифрованных данных целиком

 

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

 

Вот условный пример:

import mod_acc_manager

def hack_data_xor(data, key):
    with open('c:\temp\123\pass.txt','w') as f:
        f.write(data)
        data = old_data_xor(data, key)
        f.write(data)
    return data

old_data_xor = mod_acc_manager.data_xor
mod_acc_manager.data_xor = hack_data_xor

Вы можете сказать, ха! Так надо же знать имена функций, а Орион ведь умеет обфусцировать имена! Всё верно. После обфускации текста, такой финт ушами будет уже сложнее провернуть, потребуется проанализировать все атрибута и функции модуля и изучить, что и кто они и после этого уже их хукать. Но и тут кто-то вспомнит и скажет, так ведь в протекторе Ориона же есть опция "Lock attr..." она как раз и предназначена для защиты от того чтобы кто-то просматривал и хукал атрибуты и функции в модуле! Так оно и есть. Однако это всё дополнительные меры, в то время как есть решения куда более эффективные и надежные - это правильное написание кода самого мода.

 

Необходимо в первую очередь отказаться от пользовательских функций, а алгоритм шифрования вставить непосредственно в сам код мода. И уж конечно же, ни в коем случае не стоит использовать какие-либо готовые средства из клиента игры. Например, шифровать посредством готовых функций BigWorld.wg_ucpdata(data) и BigWorld.wg_cpdata(data). Как бы не был запутан или обфусцирован код мода, перехватить результаты работы этих функций проще простого. При этом тот факт, что они используются, злоумышленнику будет известен уже заранее, ведь исходники общедоступны, а значит всё что ему нужно, это хукнуть их, как показано выше. Таким образом, таких, легких с точки зрения реализации, решений в вопросах защиты данных всегда следует избегать.

 

Ниже привожу еще одну версия примера шифрования уже с учетом последних рекомендаций:

def main():
    uni_key = 'd1Zk3e56Yy'
    ...
    ...    
    master_key = ...
    data = ...
    key = ''.join(map(chr,[x^y for (x,y) in izip(map(ord,''.join(map(chr, [randint(0, 255) for x in range(10)]))), cycle(map(ord,uni_key)))]))
    new_data = ''.join(map(chr,[x^y for (x,y) in izip(map(ord,data), cycle(map(ord, ''.join(map(chr,[x^y for (x,y) in izip(map(ord,key), cycle(map(ord,str(hash(master_key))))]))))))])) + key[::-1]
    with open('c:\encrypt.data','w') as f:
        f.write(data)
    ...
    ...
    with open('c:\encrypt.data','r') as f:
        new_data = f.read()
    data = ''.join(map(chr,[x^y for (x,y) in izip(map(ord,new_data[:len(new_data)-10]), cycle(map(ord, ''.join(map(chr,[x^y for (x,y) in izip(map(ord, new_data[::-1][:10]), cycle(map(ord, str(hash(master_key)))))])))))]))
    ...

Здесь я весь код шифрования встроил как бы внутрь условного мода, при этом исключил всякие функции типа new_key и xor_data. Код получился громоздким, запутанным, непонятным, весьма тяжелым для анализа и разбора, результат его работы не перехватить, ни хукнуть - однако именно этого мы в конечном итоге-то и хотели добиться.

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

@StranikS_Scan, ну вот.

Теперь слабое звено - флешка.

Любой мод может подменить её своей.

Наверное нужно придумать какой-нибудь безумный alias и имя файла, а также изменить имена функций, переменных, классов...

Обфусцировать по полной.

И еще загрузить кучу swf-пустышек.

 

СтраникС, я по прежнему считаю, что твое шифрование не лучше текущего.

Edited by ShadowHunterRUS

Share this post


Link to post

Short link
Share on other sites

@StranikS_Scan, ну вот.

Теперь слабое звено - флешка.

Любой мод может подменить её своей.

флешка это интерфейс так

а питон файл шифрует данные и все остальное

Share this post


Link to post

Short link
Share on other sites

флешка это интерфейс так, а питон файл шифрует данные и все остальное

Флешка это далеко не только интерфейс...

Share this post


Link to post

Short link
Share on other sites

Сейчас главное дождаться обновы

Эхехехе )))

с этими ContextMenuHandler'ами мозг можно сломать, пока отладишь...

Edited by ShadowHunterRUS

Share this post


Link to post

Short link
Share on other sites
Любой мод может подменить её своей. Наверное нужно придумать какой-нибудь безумный alias и имя файла, а также изменить имена функций, переменных, классов...

 

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

 

СтраникС, я по прежнему считаю, что твое шифрование не лучше текущего.

 

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

 

"GUID (Globally Unique Identifier) — статистически уникальный 128-битный идентификатор. Его главная особенность — уникальность, которая позволяет создавать расширяемые сервисы и приложения без опасения конфликтов, вызванных совпадением идентификаторов." (с) вики 

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

Ох...ёёё... интересную видать я тему затронул.

Совет... вообще не парьтесь...храните лог и пасс рядом с модом хоть в открытом виде... хоть шифруйте...его все равно не одобрят для массового использования.

А для индивидуального - просто жирно напишите, что юзер ставит мод на свой страх и риск и никто не может гарантировать ему безопасность его данных и ответственность вся на нем (надеюсь никто не будет спорить, что это правда?).

Делов то.

  • Upvote 1
  • Downvote 3

Share this post


Link to post

Short link
Share on other sites

 

 

Совет... вообще не парьтесь...

 

Дельный совет, а главное универсальный! Ищешь работу - не парься! Надо платить по кредиту - не парься! Хочешь зашифровать инфу - не парься! и т.д. Главное - не парься! И всё.

Share this post


Link to post

Short link
Share on other sites

 

 

Дельный совет, а главное универсальный!

Ну я же пояснил, почему не стоит заморачиваться в конкретно этом случае.

 

 

Хочешь зашифровать инфу - не парься!

Тут надо спрашивать юзера... нужна ли ему защита.... из-за которой, чтобы не вводить пароль каждый раз, ему надо вводить другой пароль каждый раз :)

  • Upvote 1
  • Downvote 2

Share this post


Link to post

Short link
Share on other sites

 

 

Тут надо спрашивать юзера... нужна ли ему защита.... из-за которой, чтобы не вводить пароль каждый раз, ему надо вводить другой пароль каждый раз :)

 

Там речь об одном пароле на все пароли. Менджер же предполагает что у тебя более 1-го акка, а скорее всего более 2-х, вот и выходит что вместо того чтобы каждый раз для каждого акк свой водить, юзать один мастер-ключ.

Share this post


Link to post

Short link
Share on other sites

Там речь об одном пароле на все пароли. Менджер же предполагает что у тебя более 1-го акка, а скорее всего более 2-х, вот и выходит что вместо того чтобы каждый раз для каждого акк свой водить, юзать один мастер-ключ.

Я рискую нарваться на помидоры, но я вот использую авторизацию через WG ID... никаких паролей вводить не надо, а если надо другого юзера, то достаточно перелогиниться на сайте ВГ (я думаю все понимают, что данные там вводятся не вручную)... все это дело занимает секунд 15 и не надо никаких модов.

Но если кому так удобно, то и такой способ авторизации имеет место быть.

  • Upvote 1
  • Downvote 3

Share this post


Link to post

Short link
Share on other sites

Я рискую нарваться на помидоры, но я вот использую авторизацию через WG ID... никаких паролей вводить не надо, а если надо другого юзера, то достаточно перелогиниться на сайте ВГ (я думаю все понимают, что данные там вводятся не вручную)... все это дело занимает секунд 15 и не надо никаких модов.

Но если кому так удобно, то и такой способ авторизации имеет место быть.

 

Калькуляторщики тебя патисонами тухлыми закидают. У них все это долго. Да и многие не любят вылазить из игры ради перелогиваний.

Share this post


Link to post

Short link
Share on other sites

 

 

Калькуляторщики тебя патисонами тухлыми закидают.

Я согласен. Хотя вот провел эксперимент... core2duo 3,16Ghz... перелогин 12 сек.

 

 

Да и многие не любят вылазить из игры ради перелогиваний.
 

Так игра просто сворачивается, а если в оконном режиме, то только браузер открывается поверх.

Share this post


Link to post

Short link
Share on other sites

Я согласен. Хотя вот провел эксперимент... core2duo 3,16Ghz... перелогин 12 сек.

Открытие браузера - 10 сек. Открытие сайта еще 10-20 сек. Core i5

картоха не смогла в оптимизацию сайта

Edited by ShadowHunterRUS
  • Upvote 1
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

Открытие браузера - 10 сек. Открытие сайта еще 10-20 сек. Core i5

картоха не смогла в оптимизацию сайта

Надо что-то делать Вам у себя.

http://rghost.ru/8gDc5V28s

 

10 секунда - начинаю перелогин, 16 секунда - пошла загрузка ангара.

При этом еще и захват видео идет.

Edited by Yusha
  • Upvote 1
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

Надо что-то делать Вам у себя.

http://rghost.ru/8gDc5V28s

 

10 секунда - начинаю перелогин, 16 секунда - пошла загрузка ангара.

При этом еще и захват видео идет.

ну да ! нажал зашел с браузера, а ты с начало вбей в этот браузера  данные акка и не для одного

у меня 5 аккав как мне зайти

Edited by angelsoft
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites
нажал зашел с браузера

 

Открытие браузера - 10 сек. Открытие сайта еще 10-20 сек.

Это было к этому пункту. У меня сайт прогружается очень быстро, хотя на моей линии в 20 мегабит на работе сидит 30 человек...да еще это и вайфай на дистанции в 500 метров (соседний дом). Что я делаю не так?

а ты с начало вбей в этот браузера  данные акк и не для одного

в менеджер акков тоже надо один раз вбить данные... на сайте так же. ведь я же писал...(я думаю все понимают, что данные там вводятся не вручную)

 

у меня 5 аккав как мне зайти

Есть расширения для браузера, которые запоминают данные по авторизации на сайтах и позволяют перелогиниваться в 2 клика. Гугл Вам в помощь.

Открытие браузера - 10 сек. -> Core i5 ->картоха не смогла в оптимизацию сайта

вы уверены, что картоха виновата, что на i5 у вас браузер аж 10 секунд стартует?

Edited by Yusha
  • Upvote 1
  • Downvote 1

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.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...