Этот сайт создан как клуб русификаторщиков. Для нас существуют три основных правила.
1. Мы никому и ничего не должны!
2.Один пришедший на сайт толковый русификаторщик дороже всех пользователей.
3. Мы делаем русификаторы для своего сайта, но в оригинале ими могут пользоваться все в интернете.
Абсолютно ничего не понял, просто тупо выполнил действия указанные вами в сообщении "Один из вариантов обхода" и все заработало, в том числе и файл, несколько строк которого было переведено в Radialix. То есть, проблема снята. Большое спасибо! Ваша логика мне если понятна, то весьма смутно. Я полз другим путем. Пытался найти различия в результатах трассировки оригинальной и измененной программы. Для чего мне и потребовалось в первую очередь снять защиту от отладчика. Мой путь мог оказаться слишком длинным, возможно посмертным. Дальше не просьба и, даже, не пожелание, а так, просто надежда, что вы найдете время и у вас появится желание популярно описать ваши рассуждения и практические действия по снятию защиты. С уважением, Николай.
Вряд ли вы дождетесь от меня вменяемого описания или рассуждения, потому как не умею облекать непрерывный поток мыслей в доступную для чтения и осмысливания форму. Вот элементарно, как начать? С чего? То что делаешь порою интуитивно, на словах может превратиться в очередной том "Война и Мир". Сложно все это, да и не нужно.
Если коротко: обратил внимание, что под ВМ также нельзя запустить процесс наблюдения, клики по кнопке Start ни к чему не приводят, т.е. поведение программы аналогичное, как и после изменений в коде. Поэтому начал искать все что связано с кнопкой и её ID. Расставил в отладчике ловушки и начал смотреть, где программа тормознет при клике на кнопку. Далее сравнивал, что происходит на нужном участке с исходным и измененным (или под ВМ) файлом. Единственная и серьезная засада была в том, что логика работы программы под отладчиком была другая и вела в ложном направлении. Я с подобным столкнулся в первые и на время завис, т.к. не мог решить палево программой работы под отладчиком. Потом еще раз пересмотрел участки кода с момента клика по кнопке.
При клике мы приходим сюда:
Регистр RCX обнуляется и по указанным адресам в памяти записываются нули, а нажатие кнопки... ни к чему не приводит. Т.е. по логике должны быть какие-то адреса или ссылки, которые ведут к обработчику событий, как наше нажатие на кнопку.
Листаю код и выше вижу точно такой же участок, но уже с адресами. Тем более, что начальный адрес, который идет в RAX, и там и тут один и тот же. Можно быстрее все найти, если задать поиск перекрестных ссылок на него.
Я взял и перенаправил джампом выполнение программы сюда. В итоге кнопка заработала и остальные 3-и функции (какие? - ХЗ) тоже.
Я понимаю, невозможно облечь интуицию в письменную форму, разве что, одним словом -"догадался". Но практический опыт можно, еще легче: вопрос - ответ (мой опус - борцу с крякозябликами. Мне задавали раньше вопросы, а я потом объединил ответы в одной статье). Я не знаю, кто вы по образованию, я всю жизнь проработал прорабом-электриком, а радиотехника и потом компьютеры - чисто на любительском уровне. Поэтому я не всегда могу понять некоторые термины и сокращения, даже если они общеприняты (сам я, стараюсь не использовать сокращений и, если есть возможность, не использовать сленг и транскрипцию английских терминов). Я тоже пытался отследить работу программы после щелчка по кнопке "Старт" - сравнивал журналы трассировки. Бесполезное дело, сначала нужно снять защиту от отладчика. Теперь вопросы (это общие вопросы, не по конкретной программе):
Цитата: Krig
под ВМ также нельзя запустить
Что такое ВМ? Чтобы найти код, отвечающий за щелчок по кнопке, я поставил контрольные точки на все команды RET, затем щелкал по кнопке и последовательно удалял их, пока не нашел нужный код. Как Вы нашли этот код? Как Вы считаете, может ли программа узнать об установленной контрольной точке до ее срабатывания (считаем, что программа пока не знает, что она загружена в отладчике)
Чтобы найти код, отвечающий за щелчок по кнопке, я поставил контрольные точки на все команды RET, затем щелкал по кнопке и последовательно удалял их, пока не нашел нужный код.
Ну, ничего так. Нормальные герои всегда идут в обход (из кф. Айболит-66). Главное результат.
Цитата: NNK_RTR
Как Вы нашли этот код?
Если коротко: в любой программе каждый ресурс (иконки, диалоги, строки, элементы управления и т.п.) и событие (ввод текста, клики мышкой, нажатия кнопок и прочее) имеет идентификатор ID. Вот по такому идентификатору можно найти и отследить конкретный ресурс или событие.
ID интересующего ресурса можно узнать: 1) В любом редакторе ресурсов, если об этом позаботился программист и допускает язык программирования, на котором написана программа. 2) С помощью оконных сканеров. Посмотрите статью "Программы для работы с окнами приложений", автор ManHunter. 3) В отладчике по строке на элементе управления.
ID событий - это сообщения, которые используются для создания и управления окнами, например WM_ACTIVATE, WM_CLOSE и т.д. (см. справочник по WinAPI). В зависимости от цели берется конкретное сообщение, а точнее его ID.
В данном конкретном случае я смотрел сообщение WM_COMMAND. При его вызове смотрим, чтобы значение параметра wParam совпадало с идентификатором элемента управления, событие которого мы хотим отловить. Далее управление передается на системные функции и по возврату обратно в основной код программы мы будем находиться на участке в коде, который должен направить на исполняемую для данного ID элемента функцию. Как было сказано ранее, по адресу перехода в памяти записаны нули, поэтому ничего не происходит.
Ну вот, все стало ясно. Вы прекрасно можете популярно разъяснять. (Не хуже Касперского, который мышъях. Это относительно статьи) Я пытался найти с помощью оконного шпиона идентификатор кнопки, но она на панели инструментов и шпион показывает идентификатор панели инструментов, тогда я попытался перехватить сообщение при щелчке мыши по панели инструментов. Видимо панель инструментов не обрабатывает это событие - ничего не вышло. Лет 10 - 15 назад я что-то встречал относительно поиска идентификаторов кнопок на панели инструментов. Тогда мне это было не нужно...
Как Вы считаете, может ли программа узнать об установленной контрольной точке до ее срабатывания (считаем, что программа пока не знает, что она загружена в отладчике)
Тут не имеет значения как считаю я, потому что это один из вариантов защиты приложения от работы под отладчиком. Что такое "контрольная точка"? Это исскуственная установка прерывания - INT3 (0xCC). Программа может проверять наиболее важные участки кода на наличие команд прервания, которых там быть не должно и попросту игнорировать их или делать что-то другое, в общем как пожелает программист.