ИДАЗПСД

Инструмент для автоматической замены предоставляемых счетчику данных (ИДАЗПСД)
  1. Оффлайн

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 929

    Создано тем: 79

    Рейтинг: 8

    Репа: (131|131|0)

    Баллы: 1596

    Был: 2024-04-28 00:36

    Лайков: 140

    Цитата: NNK_RTR
    Интерфейс моего инструмента полностью изменен. Учтены если не все, то почти все Ваши замечания. Пока все это только в разработке. Посмотрите пожалуйста
    ScanStCounter
    Может еще что ни будь подскажите.

    Скачал вашу работу. Эх... dontknow

    Попытка №1
    1) Загрузил файл SUFDesign.exe
    2) Указал кодировку Windows-1251
    3) Импортировал строки из файла SetupFactory.rdmp - все строки со статусом ОК
    4) Нажал "Подготовка" - Ошибка

    Попытка №2
    1) Загрузил файл SUFDesign.exe
    2) Указал кодировку Windows-1251
    3) Создал список вручную, введя только те строки, для которых необходимо изменить счетчики
    4) Нажал "Подготовка" - та же самая Ошибка

    ИДАЗПСД

    Несмотря на ошибку в обеих случаях, закрываю её и нажимаю "Записать в файл".
    Снова выскакивает тоже сообщение. Ну а в файл естественно ничего не записалось.

    Замечания: mail1_mini
    1) Начальное окно "Увлекательный рассказ" не отключается, плюс оно убеждает пользователя в том, что перед ним игрушка, а не серьезный инструмент. Во-вторых позиция вывода этого окна где-то с краю. Обычно вывод главного окна программы позиционируют по центру (свойство Position = poScreenCenter), а все его дополнительные окна и сообщения привязывают к позиции главного окна (свойство Position = poMainFormCenter). В данном случае я в редакторе ресурсов сразу же добавил формам TMainForm и TScreenForm свойство Position = poScreenCenter. Сразу намного улучшилось общее восприятие программы.

    2) Заголовок "Английский текст" желательно заменить на "Исходный текст", т.к. текст может быть не только на английском.

    3) Заголовок "Русский текст" желательно заменить на "Перевод", т.к. текст могут переводить не только на русский, а любой другой, например, на украинский.

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

    5) Кнопка с картинкой "Запомнить" - почему бы просто не сделать кнопку "Добавить в список", ну или просто "Добавить".

    6) Сохранение списка строк в каких-то НЕХ-кодах, что не дает возможности его ни отредактировать, ни дополнить. Зачем?
    Не проще ли было бы использовать что-то типа INI-формата:


    Encoding=UTF-8
    Source001="String"
    Translate001="String"
    Lenght001=XX
    Source002="String"
    Translate2="String"
    Lenght002=XX


    Вы сами создаете себе трудности, а затем стойко пытаетесь их преодолеть. Я понимаю, что так вы хотели сохранить кодировку строк, но можно же просто сохранить документ в нужной кодировке Windows-1251, UTF-8 и т.д.

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

    Спасибо.

    Кто ищет, тот всегда найдет!

    20 января 2024 - 16:54 / #21
  2. Оффлайн

    Автор темы

    NNK_RTR

    Звание: Бывалый

    Мастер

    Сообщений: 282

    Создано тем: 52

    Рейтинг: 5

    Репа: (61|61|0)

    Баллы: 1801

    Был: 2024-05-05 08:51

    Лайков: 87

    Спасибо за потраченное время.
    Инструмент не готов для выхода в свет.
    Начальное окно (Вы так его назвали) по моему замыслу должно служить некоторым подобием мастера (должно помочь ознакомиться с инструментом)
    Оно будет привязано к верхнему правому краю главного окна, чтобы не мешать пользователю выполнять действия. Легкомысленный тон (стиль) выбран преднамеренно, чтобы показать - это не сложный для освоения прибор, не требует специальных знаний и навыков...
    Окно закрывается системной кнопкой, а переключатель "Хватит меня учить" - аналог "Не открывать это окно при следующем запуске"

    На этом этапе инструмент может то, что мог ИДАЗПСД (немножко больше, в FontLab есть еще один вариант, допускающий удлинение строк до 65535 байтов).
    В ИДАЗПСД была функция анализа, она была довольно строгая (поэтому требовалось не больше 3 сток). Если все эти проверки включить в этап подготовки, то процесс значительно замедлится (на 200 строк FontLab требовалось больше 10 минут).
    Конечно же, я разберусь с появлением ошибки, тем более SUFDesign.exe Вы мне передали. Явное переполнение типа integer. Посмотрю, возможно нужно перейти на тип Cardinal или добавить проверку.
    Кстати, файл Вы мне передали, но попытка найти в интернете программу целиком не удалась, предлагают какую-то ерунду. чтобы составить алгоритм, мне нужно запустить программу в отладчике, чтобы проверить результат, тоже нужна исполнимая программа.

    Замечание 2, 3 и 5 легко принимаются и легко исправляются (5 сложнее - не люблю работать с картинками)

    Замечание 4 - сложное. ИДАЗПСД весьма строго ограничивал пользователя - стал недоступным и все. Только перезапускать.
    Тут, я по Вашему же "ворчанию", предположил, что пользователь с головой и не будет работать с файлом, в котором таких строк явно нет.
    Поэтому я разрешил пользователю работать со списком строк без загруженного файла (мало ли с какой целью). Другое дело кодировка. При попытке изменить кодировку существующего или загружаемого списка строк, пользователю будет предоставлена возможность преобразовать.
    Я заранее не могу знать, загрузил ли пользователь соответствующий файл первоначально, может он загрузит его позже. И что я должен сделать с подготовкой - очистить список строк?. Писать сообщение? Автоматически выполнять подготовку? В конце концов, ничего страшного не произойдет - перед записью в файл выполняется укороченный вариант подготовки - без составления отчета и изменений в столбце "Ошибки".

    6 - это основополагающее - мне встречался требующий перевода текст (не строка, а текст) Все строки хранятся и обрабатываются в типе TStringList. Он может содержать только строки и не может текст. Если записывать текст в виде кода, тогда это будет строка (изначально я работал с компонентами Memo и чтобы была возможность работать с текстом, составлялся список строк в специальном формате и сохранялся в файле "Source.txt", а когда Вы подсказали мне компонент TVirtualStringTree, который может содержать в ячейках текст, тогда и был выбран TStringList
    И вообще, не предполагается, что пользователь будет в ручную редактировать эти файлы. Все они четко связаны между собой и редактировать запрещено. (наверно нужно добавить им атрибут "только для чтения"

    Я думаю, что Вы воспринимаете мою писанину правильно. Я не оправдываюсь, я объясняю свою логику. Так же, как и Ваши замечания, предложения и критику, я воспринимаю не как "придирку", а как добрый совет, приемлемое или неприемлемое предложение. Вы мне очень помогаете.
    Спасибо Вам
    С уважением, Николай
    Leserg нравится это сообщение.
    20 января 2024 - 19:43 / #22
  3. Оффлайн

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 929

    Создано тем: 79

    Рейтинг: 8

    Репа: (131|131|0)

    Баллы: 1596

    Был: 2024-04-28 00:36

    Лайков: 140

    Цитата: NNK_RTR
    Кстати, файл Вы мне передали, но попытка найти в интернете программу целиком не удалась, предлагают какую-то ерунду. чтобы составить алгоритм, мне нужно запустить программу в отладчике, чтобы проверить результат, тоже нужна исполнимая программа.

    Есть такой ресурс - Internet Archive - архив интернета по годам и датам. Можно найти то, что якобы уже давно кануло в Лету (например, сайт не существует, перехал на другой домен, на сайте доступна только актуальная версия программы). Конечно же ресурс НЕ содержит ВСЕ и пополняется только за счет пользователей.
    Ссылка на инсталлятор из официального источника с интернет архива.
    Сообщение отредактировал Leserg 20 января 2024 - 22:21

    Кто ищет, тот всегда найдет!

    20 января 2024 - 22:20 / #23
  4. Оффлайн

    Автор темы

    NNK_RTR

    Звание: Бывалый

    Мастер

    Сообщений: 282

    Создано тем: 52

    Рейтинг: 5

    Репа: (61|61|0)

    Баллы: 1801

    Был: 2024-05-05 08:51

    Лайков: 87

    В FontLab 8_RUS.exe (64) на строку «Шрифт:» существует 3 ссылки:
    00007FF77CDED9AA	45:33C9	xor r9d,r9d	
    00007FF77CDED9AD	4C:8D05 4CF6FF02	lea r8,qword ptr ds:[7FF77FDED000]	00007FF77FDED000:"Шрифт:"


    00007FF77D3A7D50	45:33C9	xor r9d,r9d	
    00007FF77D3A7D53	4C:8D05 A652A402	lea r8,qword ptr ds:[7FF77FDED000]	00007FF77FDED000:"Шрифт:"


    00007FF77D711020	BA 05000000	mov edx,5	
    00007FF77D711025	48:8D0D D4BF6D02	lea rcx,qword ptr ds:[7FF77FDED000]	00007FF77FDED000:"Шрифт:"


    Адреса команды lea в файле: 105CFAD, 1617353, 1980625 соответственно.

    Ссылки: 02FFF64C, 02A452A6, 026DBFD4 соответственно.

    Адрес строки: 03C98200 (в файле)

    В отличии от 32-разрядной версии FontLab 8 (в ней, чтобы найти ссылку, нужно к адресу строки нужно добавлять заранее вычисленное постоянное значение), здесь это значение плавает и четко зависит от смещения команды и смещения строки.
    (чем больше «расстояние» между смещением команды и смещением строки, тем значение ссылки больше)

    Зная адрес ссылки и адрес строки можно легко вычислить значение некоторую постоянную:
    (ссылка - (Адрес строки – адрес команды) = постоянная = 02FFF64C - (03C98200 - 0105CFAD) = 02FFF64C - 2C3B256 = 003C43F9

    Теперь, зная ссылку и адрес команды можно вычислить соответствующий адрес строки
    (Адрес строки = ссылка + адрес команды - постоянная величина = 02FFF64C + 0105CFAD - 003C43F9 = 03C98200)
    (это верно для десятка проверенных строк)

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

    1. В цикле ищем команду lea – 4c8d0d и проверяем, чтобы перед ней стояло значение, соответствующее размеру оригинальной строки.
    (для строки «Шрифт:» ищем цепочку 00 00 00 05 4c 8d 0d)
    2. Если такая цепочка нашлась, то проверяем, соответствует ли значение ссылки адресу строки (все данные для вычисления есть). Если соответствует, значит значение счетчика можно изменить, если нет, ищем дальше.

    Я уже было начал искать возможность вычисления постоянной на основе данных РЕ-заголовка, но вспомнил про Radialix, он же каким-то способом находит ссылки (впрочем, может этим занимается IDA). Не используется же придуманный мной алгоритм.
    Не могу себе представить, как можно только на основе адреса строки найти ссылку! Строка одна, а ссылок на нее несколько и все разные. Как можно заранее знать, сколько на строку ссылок и адреса команд, которые используют (загружают) строку по этой ссылке.

    Может у кого-то есть идеи, может кто-то может описать механизм, которым пользуется Radialix (или IDA) или тот же отладчик.
    (Понятно, что «кого-то» и «кто-то» это Leserg)

    С уважением, Николай
    23 января 2024 - 12:47 / #24
  5. Оффлайн

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 929

    Создано тем: 79

    Рейтинг: 8

    Репа: (131|131|0)

    Баллы: 1596

    Был: 2024-04-28 00:36

    Лайков: 140

    Цитата: NNK_RTR
    Может у кого-то есть идеи, может кто-то может описать механизм, которым пользуется Radialix (или IDA) или тот же отладчик.
    (Понятно, что «кого-то» и «кто-то» это Leserg)

    agent

    Я не имею ни малейшего понятия, как это делают Radialix (или IDA) или тот же отладчик.
    За мою практику локализации (с 2004 года) мне ни разу не приходилось корректировать счетчики в более чем 10-15 строк. Обычно от 1 до 7 и с этим очень просто справится в отладчике. Чуть позже я разобрался, как искать ссылки в 32-рязрядных приложениях. Но что касается 64-разрядных приложений - здесь я пас. Информации ноль. А формулы расчета для 32-разрядных приложениях не подходят для 64-разрядных - данные никак не бьются. Чес слово - пёс его знает.

    Касательно данной программы и примера строки "Font:". В НЕХ редакторе хорошо видно, что адрес в команде LEA - это дистанция между командой и строкой, плюс 200 - некая константа, действительная только для этого файла. Но это тоже можно рассчитать не базе известных значений VA и RAW в секциях.

    ИДАЗПСД

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

    Цитата: NNK_RTR
    Решил попробовать решить проблему следующим алгоритмом:
    1. В цикле ищем команду lea

    Это в корне не верно. Так можно найти данные, которые никоим образом не относятся к строке (и к строкам вообще). Как итог - повреждение программы.

    Вот такие пироги. bang

    Кто ищет, тот всегда найдет!

    24 января 2024 - 19:40 / #25
  6. Оффлайн

    Автор темы

    NNK_RTR

    Звание: Бывалый

    Мастер

    Сообщений: 282

    Создано тем: 52

    Рейтинг: 5

    Репа: (61|61|0)

    Баллы: 1801

    Был: 2024-05-05 08:51

    Лайков: 87

    Теперь мне стало понятно (точнее, думаю, что стало понятно) почему Radialix находит ссылки в FontLab 8 - 32 самостоятельно (без IDA), а в FontLab 8 - 64, без IDA он слеп. Отладчик загружает файл, а IDA имитирует загрузку. Другими словами, ссылками занимается загрузчик.
    Мне абсолютно не понятен этот механизм. В Интернете информации не нашел (толковой и понятной). Загрузка DLL - пусть не в деталях, но в целом понятна.
    Неужели загрузчик глубоко вникает в файл и исследует и корректирует все ссылки, ведущие в другую секцию?!

    Это сейчас, (во время написания) пришло мне в голову:
    При остановке отладчика на системной точке останова все секции уже загружены, переведенные строки присутствуют, но ссылок на них еще нет (отладчик найти не может). После остановки на точке входа, ссылки уже есть. (отладчик их с удовольствием находит).
    Не здесь ли собака порылась (или зарыта)!
    Прервал писанину и проверил - код (команды) выглядит, как обычно и переход в дамп по константе приводит куда нужно (у меня на команды стоят точки останова, поэтому нашел команду быстро)
    По всей вероятности, в промежуток между системной точкой останова и остановкой на точке входа, загружаются библиотеки (во всех случаях, на странице "Карта памяти" их стало значительно больше.
    В общем, проблема, но я надеюсь, что вникать не придется.

    Цитата: Leserg
    Это в корне не верно. Так можно найти данные, которые никоим образом не относятся к строке (и к строкам вообще). Как итог - повреждение программы

    Не думаю. Код должен быть уникальным.
    Я вручную проверил свой алгоритм на разных строках (всего 5). Ошибки не было. Можно ужесточить проверку - проверять, какая именно команда передает показания счетчика. (Возможно MOV или LEA). По большому счету, ошибки в принципе не может быть:
    Команда LEA RCX [02A452A6] загрузит в RCX эффективный (действительный) адрес строки (или чего угодно). Поскольку по этому адресу находится переведенная строка, то ее адрес и будет загружен. Причем будет загружен во всех случаях, изменю я показания счетчика или нет.

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

    На Вашем скриншоте расстояние между адресом команды и адресом строки ближе, и вычисленная Вами постоянная меньше (200).
    Завтра посмотрю, меняется ли эта постоянная в пределах секции (в оригинальном файле) по идее - нет (на то она и постоянная), может найду такую команду со ссылкой на соседнюю секцию и попробую понять как постоянная изменяется, в зависимости от секции, в которой расположен источник.
    24 января 2024 - 22:04 / #26
  7. Оффлайн

    Автор темы

    NNK_RTR

    Звание: Бывалый

    Мастер

    Сообщений: 282

    Создано тем: 52

    Рейтинг: 5

    Репа: (61|61|0)

    Баллы: 1801

    Был: 2024-05-05 08:51

    Лайков: 87

    Разобрался я в конце концов с озвученной выше проблемой, то есть, нашел способ вычисления постоянной на основе извлеченных из РЕ-заголовка данных.
    Основная ошибка была в том, что я ссылки воспринимал, как прямые, а они относительные - к адресу команды нужно добавить величину ссылки, чтобы перейти на адрес строки.
    Спасибо форумчанам за "активную" помощь!
    Если кому интересен ход и результат моих размышлений, то с ним можно ознакомиться ЗДЕСЬ

    С уважением, Николай.
    Leserg нравится это сообщение.
    27 января 2024 - 20:09 / #27
  8. Оффлайн

    Leserg

    Звание: Ветеран

    Команда сайта

    Сообщений: 929

    Создано тем: 79

    Рейтинг: 8

    Репа: (131|131|0)

    Баллы: 1596

    Был: 2024-04-28 00:36

    Лайков: 140

    Цитата: NNK_RTR
    Разобрался я в конце концов с озвученной выше проблемой

    Молодец! Плюс Вам в карму. ok2

    Цитата: NNK_RTR
    Спасибо форумчанам за "активную" помощь!

    "Всегда рады помочь." beggar

    Цитата: NNK_RTR
    что я ссылки воспринимал, как прямые, а они относительные

    Адресация бывает прямая, непосредственная, регистровая, косвенная, неявная (относительная).
    biggrin
    NNK_RTR, Смотрящий нравится это сообщение.

    Кто ищет, тот всегда найдет!

    28 января 2024 - 15:05 / #28

Статистика форума, пользователей онлайн: 0 (за последние 20 минут)

---
Создано тем
1177
Всего сообщений
15352
Пользователей
17856
Новый участник
Daniel7375ysk