Можно ли проанализировав код на примере сравнения двух файлов до и после, перенести алгоритм на другой файл примерно похожий предположительно, но с другими адресами? На что обратить внимание? Что тут важно иметь ввиду? Ну, тут понятно, наг скрин обойти. Хотя не понятно как это можно было изначально найти. Здесь тоже переход куда-то, стрелка обрывается, а переходить джампом я неуверен как правильно. Видимо сюда и был переход, хотя адрес джампа не совсем верный, почему? Я не настолько понимаю ассемблер, и сравнивал в основном байты внутри файлов. Видимо адресация другая и на новом файле не получилось это повторить. Хотя я нашёл все похожие команды. Особенно сложно с третьим скриншётом, как найти его адресацию? Кстати, в новом файле нету столько места как на третьем скриншёте чтобы весь код уместить, там в два раза нулей меньше, а дальше какой-то код к сожалению)) Вобщем тут два файла, оригинал, изменённый, а третьий целевой, скажем более новая версия приложения. --- Сообщение объединено, 28 май 2024 --- Exception Offset: PCH_42_FROM_ntdll+0x00000000000979FA Exception Code: c0000005 Новая версия с другими адресами. Так как 3-й кусок кода некуда было записать, выбрал места побольше где нули записал туда эти 16 байтов кода. Все джампы поправил правильно. 3-й кусок кода возвращается, кстати, в продолжение второго куска, что вроде бы логично. Наверное кудато не туда записал, а что нельзя по желанию выбрать место для джампа? Запрещённая область памяти чтоли? --- Сообщение объединено, 28 май 2024 --- Кстати, идея, а можно этот 16-байтов кусками где-то втиснуть и джампами соединить в непрерывный код? А вобще что он делает, на что похоже? Вобщем push rdi потом идёт 2-й кусок.
Можно. Разными способами, в т.ч. найдя процедуру, вызов которой приводит к нагскрину и наугад потыкав ветвления, пропускающие ее. Это по всей видимости весь метод объекта целиком заткнут безусловным переходом в какое-нибудь return true из другого метода или из него же самого. Если в оригинале нули, а в патче код, значит это врезка. Почему адрес неверный? На картинке такого не видно. Третий скриншот - отсебятина того, кто делал патч. Искать надо то, что оно лечит. То есть безусловный переход в эту врезку. А искать удобней всего по характерным вызовам апи или редким константам где-нибудь около нужного участка кода. Так и делается, если лень или что-то мешает расширить/добавить секцию кода. push <register>/sub rsp,<val> это типичный пролог процедуры. Сохранение значений регистров, которые будут искаверканы, выделение стек фрейма под локальные переменные, а в х64 еще и аргументы вызываемых процедур.
Врезка Там просто были нули свободные, а новая версия приложения уже перекампилированая и там теперь затык, меньше нулей оказалось. Я впервые этим занимаюсь, ничего не понимаю, просто тупо код перенёс)
Ладно, фиг с этой защитой, а вот крашится время от времени почему-то. Сделано на JUCE. Во время запуска я заметил из одного процесса .exe появляется второй процесс .exe --proc987654... с каким-то параметром типа того. Интересно что за прикол? Я вроде у Sysinternals видел когда из одного EXE появлялся второй либо 32 либо 64 по необходимости, но там хоть понятно. Кстати, вот на этом и крашится я думаю. Матрёшка)) --- Сообщение объединено, 31 май 2024 --- Пардон, вот --giglad_progress:p50178566ee07200b параметр
если бы я собирался снять защиту, то во времена w95 сделал бы слепок реестра до и после инсталляции и запуска программы, и сравнил бы что и куда пишется раз они предлагают полноценный триал с лимитом времени, значит где-то в системе ставится метка в момент начала триала и после проверяется, не пора ли душить небогатого пользователя ) раньше был инструмент RegSnap и regmon от кажется Sysinternals другой вариант - поставить на виртуальную машину и аналогично сравнить что и куда пишет в винде не так много вариантов, где именно скрыть метку - это может быть и обычный файл с атрибутом системный и скрытый, и альтернативный поток к имеющимся традиционным файлам, но например в загрузчик или в пустые резервные сектора recovery винда понятно триальному приложению записать не даст если приложение не работает без интернета, вероятно что триал хранится на их домашнем сервере и ничто не мешает приложению куски кода считывать оттуда же для работы каждый раз в память, но не на диск пользователя. это плохо/сложно ломается ( судя по JUCE если написать свой VST пустышку, можно создать ситуацию, когда приложение запустит его код в этот момент если сегменты кода приложения readable, можно посмотреть и сдампить, как вариант что касается разницы между версиями в заполненных нулями кусочках, это скорее всего padding то есть выравнивание компилятором адресов начала процедур до кратного степени двойки. 16, 32...