Punto Switcher replace.dat

Можно ли как то достать автозамены из этого файла?
Сам файл очевидно зашифрован, а руками переписывать автозамены ну уж очень долго. Возможно есть какой то способ извлечь автозамены из этого файла?

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 КБ)

2 лайка

Подскажешь как ты это сделал?

Сможешь меня научить так же делать?

Скачал первый попавшийся Punto Switcher;
Подсунул ему replace.dat;
Открыл окно настроек и перешел на вкладку “Автозамена”;
С помощью Microsoft Spy++ нашел окно-диалог (в Finder Tool есть “прицел”, которым нужно тыкнуть в искомое окно), развернув его детей, нашел SysListView32 и взял его хендл;
Взял код (winapi - Win32- Getting ListView Control content from another application - Stack Overflow), переписал на питон (ради интереса), подставил хендл;
Добавил вывод в файл.

1 лайк

Я так понимаю если я не программист и не шарю в этом всем, я не смогу научиться это делать?
Ну либо же нужно изучать материал программирования

А наоборот если файл replace.dat пуст и из блокнота нужно в него записать данные?
Такой же способ подойдет?

Если идти именно по предложенному алгоритму, то какие-то навыки программирования всё-таки понадобятся. Возможно есть уже готовые универсальные программы с дружелюбным интерфейсом для такого “стягивания” данных. Вообще этот способ можно рассматривать как костыль, т.к. я думал, что предполагается единовременное извлечение замен. Если же нужно заполнять и извлекать данные постоянно, то лучше бы “сломать” шифрование replace.dat и работать с файлом напрямую, но у меня недостаточно знаний для такого.

Скорее всего подойдет, но какие точно нужны команды не знаю.

Увы сломать шифрование я думаю не возможно, это же программа от яндекса )

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

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

Значит нужно поискать людей которые мне за деньги помогут разобраться как расшифровать файл чтобы без проблем забирать и записывать данные в этот файл )

Наверно проще будет найти того, кто сделает способом выше.
Примерно так: заменить на пустой файл автозамен (из свежеустановленного пунто), запустить, программно нажимать “Добавить” и вводить данные из текстового файла.
Не мгновенно, но намного быстрее ручного ввода.

Повезло наткнуться на нужную функцию в отладчике. Оказалось простое XOR-шифрование. Каждая замена записана в файле в формате: общая длина замены (4 байта); неизвестный байт (не понял, что он хранит, но если записать ноль, то ПунтоСвитчер не жалуется); две нультерминированные UTF-16LE строки, зашифрованные XOR-шифрованием с последовательностью rand с фиксированным seed.

2 лайка

Попробую что-нибудь почитать на эту тему, очень много не понятных для меня слов здесь прозвучало )

Вот питоновский скрипт для кодирования/декодирования:

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))
2 лайка