Можно ли как то достать автозамены из этого файла?
Сам файл очевидно зашифрован, а руками переписывать автозамены ну уж очень долго. Возможно есть какой то способ извлечь автозамены из этого файла?
replace.rar (55,9 КБ)
Можно ли как то достать автозамены из этого файла?
Сам файл очевидно зашифрован, а руками переписывать автозамены ну уж очень долго. Возможно есть какой то способ извлечь автозамены из этого файла?
replace.rar (55,9 КБ)
А не работает если просто скопировать все файлы?
работает. проверил у себя.
при выключенном Punto Switcher в папке у себя заменил файл
“C:\Users\User\AppData\Roaming\Yandex\Punto Switcher\User Data\replace.dat”
получил такое:
Мне не нужно заменять файл или копировать его, мне нужно достать из него автозамены каким то образом, чтобы не переписывать их например в блокнот или в word вручную.
Ну это надо разбираться в каком формате они записаны в этом файле. Они скорее всего не зашифрованы в том смысле, что нужен какой-то пароль, а просто как-то записаны в бинарном формате и надо разобраться как именно. Если никто в интернете это пока не сделал и не рассказал, то проще и быстрее вручную переписать )
Хотя может и пароль есть, блогопост на эту тему о другом файле пунто свитчера: Как открыть запароленный дневник Punto Switcher | Темная сторона Силы | Blog. Just Blog
В интернете к сожалению даже намека нет на эту тему, я уже все перекопал, но увы (
Выковырял замены из открытого окна настроек с загруженным replace.dat, разделитель “;”.
punto-result.txt (269,7 КБ)
Подскажешь как ты это сделал?
Сможешь меня научить так же делать?
Скачал первый попавшийся Punto Switcher;
Подсунул ему replace.dat;
Открыл окно настроек и перешел на вкладку “Автозамена”;
С помощью Microsoft Spy++ нашел окно-диалог (в Finder Tool есть “прицел”, которым нужно тыкнуть в искомое окно), развернув его детей, нашел SysListView32 и взял его хендл;
Взял код (winapi - Win32- Getting ListView Control content from another application - Stack Overflow), переписал на питон (ради интереса), подставил хендл;
Добавил вывод в файл.
Я так понимаю если я не программист и не шарю в этом всем, я не смогу научиться это делать?
Ну либо же нужно изучать материал программирования
А наоборот если файл replace.dat пуст и из блокнота нужно в него записать данные?
Такой же способ подойдет?
Если идти именно по предложенному алгоритму, то какие-то навыки программирования всё-таки понадобятся. Возможно есть уже готовые универсальные программы с дружелюбным интерфейсом для такого “стягивания” данных. Вообще этот способ можно рассматривать как костыль, т.к. я думал, что предполагается единовременное извлечение замен. Если же нужно заполнять и извлекать данные постоянно, то лучше бы “сломать” шифрование replace.dat и работать с файлом напрямую, но у меня недостаточно знаний для такого.
Скорее всего подойдет, но какие точно нужны команды не знаю.
Увы сломать шифрование я думаю не возможно, это же программа от яндекса )
Шифрование это когда человек задает пароль, и потом без ввода этого пароля не расшифровать.
Тут видимо не тот случай. Тут либо вообще нет шифрования, просто данные записаны не текстом, и надо разобраться что в каком порядке в каком виде, либо шифрование есть, но пароль можно где-то достать поковырявшись в программе или ее файлах.
И в яндексе есть много разных людей и проектов. Вряд ли там выделяют много ресурсов на разработку и проверку этой программы, она не приносит деньги. И тут же явно нет цели как-то сильно защитить этот файл, тогда бы он не открывался в пунто свитчере после просто копирования на другой комп.
Значит нужно поискать людей которые мне за деньги помогут разобраться как расшифровать файл чтобы без проблем забирать и записывать данные в этот файл )
Наверно проще будет найти того, кто сделает способом выше.
Примерно так: заменить на пустой файл автозамен (из свежеустановленного пунто), запустить, программно нажимать “Добавить” и вводить данные из текстового файла.
Не мгновенно, но намного быстрее ручного ввода.
Повезло наткнуться на нужную функцию в отладчике. Оказалось простое XOR-шифрование. Каждая замена записана в файле в формате: общая длина замены (4 байта); неизвестный байт (не понял, что он хранит, но если записать ноль, то ПунтоСвитчер не жалуется); две нультерминированные UTF-16LE строки, зашифрованные XOR-шифрованием с последовательностью rand с фиксированным seed.
Попробую что-нибудь почитать на эту тему, очень много не понятных для меня слов здесь прозвучало )
Вот питоновский скрипт для кодирования/декодирования:
from struct import *
from codecs import open
def xor_bytes(bb):
seed = 0x91DAFA48
res = bytearray()
for b in bb:
seed = (seed * 214013 + 2531011) & 0xFFFFFFFF
res.append(b ^ ((seed >> 16) & 0xFF))
return bytes(res)
# dat -> txt
with open('replace.dat', 'rb') as f, open('replace-decoded.txt', 'w', encoding = 'utf-8') as g:
f.read(4) # signature
while True:
length_bytes = f.read(4)
if not length_bytes:
break
length = unpack('<I', length_bytes)[0]
f.read(1) # ignore one byte
g.write(';'.join(xor_bytes(f.read(length - 5)).decode('utf-16-le').split('\x00')[:-1]) + '\n')
# txt -> dat
with open('replace-decoded.txt', 'r', encoding = 'utf-8') as g, open('replace-encoded.dat', 'wb') as f:
f.write(b'PSRF')
for replace in g:
replace_bytes = bytearray()
for r in replace.strip().split(';'):
replace_bytes.extend(r.encode('utf-16-le'))
replace_bytes.extend(b'\x00\x00')
f.write(pack('<I', len(replace_bytes) + 5))
f.write(b'\x00') # ignored byte
f.write(xor_bytes(replace_bytes))