Что такое пропатчить программу

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Необходимо обновить браузер или попробовать использовать другой.

Теоретические основы крэкинга: Глава 12. Патчить или не патчить?

Дата публикации 27 июн 2005

Теоретические основы крэкинга: Глава 12. Патчить или не патчить? — Архив WASM.RU

  1. Использование пространства между процедурами или массивами. Во многих компиляторах для повышения быстродействия по умолчанию включены опции выравнивания начала процедур и массивов. К примеру, если процедуры выровнены по границам 16-байтных областей, Вы можете обнаружить до 15 байт свободного места перед или после каждой процедуры. Найти такие промежутки несложно — они инициализированы последовательностью одинаковых байт, обычно с кодом 0 или 90h (этому коду соответствует команда nop), реже — 0ССh (команда int3) или 0FFh. В такую область вполне возможно вписать пару-тройку команд для загрузки данных в регистры или изменения значения переменной. Поскольку процедуры встречаются достаточно часто, передать управление на такой блок и затем вернуться обратно, скорее всего, получится при помощи двухбайтного варианта команды jmp, что сведет к минимуму расход памяти на переходы туда-обратно. Кроме того, при помощи все тех же двухбайтных переходов можно связать воедино несколько таких свободных кусков и таким образом увеличить количество команд. Недостатки этого метода: без ухищрений невозможно вписать в программу достаточно длинную последовательность команд; связывать вручную свободные куски довольно неудобно; нет никакой гарантии, что поблизости окажется достаточно длинный кусок свободной памяти; при включенной оптимизации по размеру компилятор может размещать процедуры вплотную, что сделает данный метод неприменимым. Кроме того, практически невозможен вызов функции, не импортируемой явным образом: Вам просто надоест вручную сооружать «обвязку» для вызова GetProcAddress, параллельно размазывая ее по щелям между процедурами.
  2. Использование места, высвободившегося после «вывода из обращения» защитных процедур или ненужных тестовых строк. В процессе взлома в программах нередко обнаруживаются «лишние» защитные процедуры, которые крэкеру приходится просто отключать, а также всевозможные надписи, предлагающие обменять некоторую сумму денежных единиц на серийный номер или ключевой файл. При необходимости память, занимаемая этими процедурами и надписями, может быть использована для размещения небольших блоков кода. Возможен и другой вариант использования этого метода — исключить из программы какую-нибудь функцию, которая Вам заведомо не понадобится, а на занимаемое ей место поместить собственный код. Кроме того, есть смысл исследовать подфункции вызываемой функции: некоторые из них могут использоваться исключительно внутри удаляемой функции, и потому тоже могут послужить источником дополнительных байтов. Недостатки метода: не всегда возможно получить достаточный объем памяти; нужна крайняя аккуратность при переписывании команд, содержащих явное указание адреса в памяти. Метод в принципе неприменим, если Вы используете крэкинг «в мирных целях», то есть Ваши задачи предполагают не выламывание из программы защитных процедур, а только лишь усовершенствование программы за счет добавления в нее собственного кода.
  3. Размещение кода в неиспользуемых областях в концах секций. Программисты на ассемблере под Win32 наверняка хорошо знакомы со следующим эффектом: при добавлении в программу новых строк ее размер до поры-до времени не меняется, а потом вдруг скачкообразно увеличивается на полкилобайта, а то и больше (конкретное число зависит от настроек линковщика). Причина этого эффекта в том, что код и данные в программах под Win32 (да и не только под Win32) расположены внутри исполняемого файла в секциях, и размеры этих секций должны быть кратны определенному (и довольно большому) числу байт. Нередки ситуации, когда реальный размер кода программы или ее инициализированных данных на несколько десятков, а то и сотен байт меньше, чем размер выделенной для этого кода секции, и кусок памяти в «хвосте» секции ничем полезным не занят. А если в программе есть «лишние» байты, то почему бы не использовать их для своих целей? Недостатки метода: объем неиспользованного пространства в конце секции совершенно непредсказуем и может колебаться от нуля до нескольких килобайт; следует быть крайне осторожным при записи данных в конец секции инициализированных данных, чтобы случайно не испортить эти самые данные: к примеру, свободное место и длинный массив байтов, инициализированный нулями, внешне выглядят совершенно одинаково.
  4. Расширение существующих секций или создание новых. При таком подходе в принципе невозможно случайно разрушить полезные данные — весь Ваш код будет размещаться в областях, которых в непатченой программе даже не существовало. Более того, таким способом можно внедрить собственный код даже в упакованную программу, если распаковщик не содержит специальных средств для контроля целостности исходного файла (в этом случае лучше создать отдельную секцию и размещать свой код в ней). Размер внедряемого кода при использовании этого метода ограничен разве что здравым смыслом и объемом памяти ЭВМ. Основной недостаток заключается в том, что создание или расширение секций предполагает модификацию PE-заголовка и изменение размеров файла, из-за чего антивирусные программы могут не слишком благосклонно отнестись к таким переменам. Кроме того, поскольку размер файла изменяется за счет вставок в середину, возможны проблемы с созданием исполняемых файлов, выполняющих автоматический патчинг (такие файлы в просторечии называются «крэками»). Большинство утилит, создающих такие файлы, ограничивается побайтным сравнением с оригиналом и потому «не переваривают» вставку даже одного-единственного байта в середину программы. Кроме того, если Вам потребуется вызвать функцию API, которая отсутствует в таблице импорта, Вам придется либо править эту таблицу, либо получать адрес функции при помощи вызова GetProcAddress, что не слишком удобно. Этот недостаток в полной свойственен и трем предыдущим стратегиям патчинга, причем в еще большей мере — по причине ограниченного объема памяти, который эти стратегии позволяют получить. Кроме того, операции по расширению и вставке секций технически очень сложно выполнить в памяти над загруженной программой, поскольку это требует очень глубоких знаний системы и весьма значительных трудозатрат, совершенно не адекватных получаемому результату.
  5. Подгрузка кода, размещенного во внешних модулях. Это наименее «жесткий» по отношению к модифицируемой программе метод внедрения кода. Идея метода заключается в том, чтобы вынести весь добавляемый в программу код во внешний модуль (если речь идет про Windows — то в DLL), а потом «попросить» программу загружать этот внешний модуль вместо одной из библиотек, например, исправив один-единственный байт в имени загружаемой DLL. «Подменная» DLL с нашим кодом вклинивается между программой и «настоящей» библиотекой, причем в функции инициализации DLL можно разместить что-нибудь полезное, например, код патчинга основного процесса. Более подробно методы внедрения модулей мы рассмотрим чуть позже, а пока отметим, что при использовании данного метода Вы получаете наиболее широкий выбор инструментария для написания внедряемого кода: от шестнадцатеричного редактора до самых современных RAD-средств (в отличие от предыдущих четырех стратегий, где Вашим основным инструментом будет ассемблер, встроенный внутрь редактора или отладчика). Главный недостаток заключается в необходимости держать этот самый внешний модуль рядом с программой, что не всегда удобно.
Читайте также:
Программа miflash unlock не видит телефон в режиме fastboot

FAddr: call ExitProcess ; Нужная нам функция
mov eax, dword ptr [FAddr+2] ; Читаем из памяти адрес функции
push 0 ; Помещаем на стек параметр вызова
call [eax] ; Вызываем «одалживаемую» функцию

Урок 1 — Начало работы с программой. Патч приборов

Как написать #patch для исполняемого файла

Однако вызовами статически импортированных функций API возможности метода «функций взаймы» отнюдь не ограничиваются. «Заимствовать» из исследуемой программы можно совершенно любые функции — от элементарного сравнения строк до функций извлечения файлов из архива неизвестного формата или генерации серийных номеров (изредка встречаются программы с такой ошибкой в защите). Единственное, что для этого необходимо — выяснить тип передаваемых функции параметров и используемое соглашение вызова.

Однако нужно понимать, что заимствование функций из программы или из несистемных DLL не вполне известного назначения — операция более опасная, чем использование импортированных функций документированных API. Дело в том, что работа функций API не привязана ни к каким переменным и функциям внутри программы (если, конечно, не считать callback-функции), а вот к функциям программы это в общем случае не относится.

Их работа может зависеть от состояния локальных или глобальных переменных, а также других объектов, созданных в процессе работы программы; более того — сами программные вызовы тоже вполне могут изменять состояние переменных, критически важных для работы программы. Поэтому если какой-либо объект в момент вызова окажется в «неправильном» состоянии, результат вызова будет совершенно непредсказуем.

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

Патчинг позволяет решать и обратную задачу: «отклонение» вызовов из исследуемой программы на внедряемый крэкером код. Цели этой операции могут быть различными:

Как Вы можете видеть, приведенный список возможных целей покрывает весьма широкую область — от предотвращения нежелательных вызовов до наблюдения за вызовами функций (частным случаем этого являются API-шпионы). Собственно, некоторые техники, используемые в API-шпионах, и основаны на патчинге «переходников» к функциям API, осуществляемом сразу после загрузки программного модуля. Принцип действия большинства API-шпионов следующий:

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

Как я уже упоминал, сравнительно недавно в большом количестве появились навесные защиты, которые позволяют упрятывать любую программу и все необходимые для ее работы файлы в упакованном и зашифрованном виде внутрь одного-единственного EXE. При этом сама программа может обращаться к своим файлам как средствами Win32 API, так и при помощи высокоуровневых функций (которые по сути являются «обертками» для все тех же системных вызовов).

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

Читайте также:
Api ms win crt runtime l1 1 0 dll отсутствует как на компьютере запуск программы

Когда защищенная программа попытается обратиться к файлу, задача обработчиков заключается в том, чтобы проверить, к какому именно файлу происходит обращение, и либо передать это обращение операционной системе в неизменном виде (если программа обращается к файлу вне «хранилища»), либо имитировать работу системного вызова, но в действительности считывание данных осуществлять из упакованного «хранилища». Однако ирония судьбы заключается в том, что метод взлома полностью аналогичен методу защиты. Действительно, если разработчик «отклонил» вызовы функций работы с файлами на собственный код, то и почему бы и крэкеру не проделать ту же самую операцию? То есть вклинить между программой и обработчиком свой собственный «обработчик обработчика», который будет сбрасывать все «спрятанные» файлы в надежное место. Основную проблему составляет поиск входных и выходных точек этих обработчиков, но здесь могут помочь «особые приметы», которые способны выдать чужеродный код:

Все эти внедрения в чужой процесс, поиски переходников и прочее вполне способны повергнуть в шок начинающего. Это не страшно — даже если Вы никогда не напишете собственный API-шпион, знания о том, как они работают, вполне могут Вам пригодиться в дальнейшем. Как Вы уже догадались, написание приложений, перехватывающих системные вызовы — занятие далеко не самое простое и требующее определенных знаний и навыков. С другой стороны, большинство API-шпионов ограничиваются лишь ведением журнала системных вызовов и не позволяют активно вмешиваться в работу программы. Для начинающего крэкера, у которого есть желание перехватить какой-нибудь системный вызов, но нет опыта в системном программировании, это звучит как приговор. Но ведь так хочется иногда не только подсмотреть, откуда взялись те или иные параметры, но еще и поменять их «на лету», если они Вам чем-то не понравились…

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

Одна из первых идей, которые приходят в голову, заключается в том, чтобы вместо «родной» DLL подсунуть свою собственную, которая содержала бы функции с такими же именами, что и «настоящая». Эта библиотека должна помимо вызова «родных» функций из оригинальной библиотеки выполнять еще и те операции, которые Вы в нее заложите. А уж в собственной DLL Вы вольны запрограммировать все, что угодно — от сбора статистики вызовов до анализа и подмены параметров функций. Такой подход к перехвату вызовов из DLL, основанный на подмене оригинальных библиотек, называется DLL wrapping’ом. Чисто технически создание подменной DLL выполняется следующим образом:

PUBLIC MessageBoxA
IsLoaded dd FALSE
aMessageBoxA dd 0
huser32 dd 0
u32 db «e:WindowsSystem32user32.dll»,0
nMessageBoxA db «MessageBoxA»,0
DllEntry proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
mov eax,TRUE
DllEntry Endp
CheckAndImport proc
.if !IsLoaded
mov IsLoaded,TRUE
invoke LoadLibrary,ADDR u32
mov huser32,eax
invoke GetProcAddress,huser32,ADDR nMessageBoxA
mov aMessageBoxA,eax
CheckAndImport endp

MessageBoxA::
; Адрес метки MessageBoxA и прочих аналогичных нужно включить в таблицу экспорта
; при помощи директив
; LIBRARY user32
; EXPORTS MessageBoxA,
; помещенных в def-файл
invoke CheckAndImport
; Здесь Вы можете разместить код, исполняемый перед вызовом перехватываемой функции
; Например, поменять местами заголовок и текст сообщения,
; как это сделано ниже
mov eax,[esp+8]
xchg [esp+12],eax
xchg [esp+8],eax
mov eax, MessageBoxA_

Источник: wasm.in

Что такое патч — для чего они нужны, могут ли нанести вред и какие патчи различают

Одно из главных достоинств постиндустриальной эпохи (это как?) — качество программных продуктов становится лучше.

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

Патч

Программное же обеспечение не только не устаревает, но и становится лучше, особенно то, которое создано ответственным разработчиком. Это возможно благодаря патчам, о которых дальше и пойдет речь.

Что такое патч

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

Слово patch на английском языке означает «заплатку». В изначальном значении это кусок кожи, нашиваемой на поврежденное место на одежде. Но в случае с программами патчи не только решают проблемы, но и делают ПО лучше.

Что такое патч

Патчи в первых компьютерных программах на самом деле были заплатками:

Порция информации

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

Чем это отличается от обновления

Патчем чаще всего обозначают мелкие исправления и улучшения. Размер таких пакетов информации редко превышает несколько сотен мегабайт.

Обновления же добавляют новые порции контента или серьезно влияют на внутреннюю структуру ПО. Они могут занимать несколько гигабайт.

Заплатка

В русском языке есть еще несколько терминов, означающих то же самое:

  1. Апдейт (от англ. update – обновление)
  2. Заплатка
  3. Багфикс (от англ. bug fix — исправление бага)
  4. Хотфикс (от англ. hotfix — быстрое исправление)
Читайте также:
Диск защищен от записи как снять защиту с USB флешки программа

Для чего нужны патчи

Из-за сложности программ в них таится куда больше ошибок, чем можно увидеть. Патчи используются в следующих случаях:

  1. Когда нужно исправить ошибку, о которой программа сообщает пользователю или ту, которая не дает совершить определенное действие.
  2. Когда необходимо решить неявную проблему. Например, долгая загрузка программы — это не всегда следствие сложных процессов. В исходном коде просто могут быть лишние строчки, создающие лишнюю нагрузку.
  3. Когда нужно адаптировать ПОдля взаимодействия с новыми аппаратными составляющими. Например, создатели мобильных игр используют патчи, чтобы задействовать 12 ГБ оперативной памяти в современных игровых смартфонах. Раньше таких спецификаций не существовало, а поэтому и необходимости в их поддержке не было.
  4. Когда нужно добавить новые функции. Это самый распространенный тип патчей, который принято называть обновлениями.

Видео на английском языке о том, почему патчи так важны:

Могут ли они нанести вред

Однозначно — да, могут. Программирование — это сложная дисциплина, где каждая строчка кода обязана взаимодействовать с сотней других.

Несмотря на то что патчи призваны решать проблемы, часто они приводят к новым багам, ошибкам и неполадкам в работе. Чтобы их не возникало, программисты должны проводить сложные тесты. Но на практике их делают не все.

Update

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

Классификация патчей

По типам различают:

  1. Бинарные.
    Такие обновления распространяются в виде исполняемых файлов, запуск которых влияет на исполняемый файл самой программы либо заменяя бинарный файл, либо переписывая куски кода внутри него.
  2. Патчи исходного кода.
    Такие обновления показывают различия в исходном коде программы и новых кусках, которые призваны решить проблемы или добавить новую функциональность. Такой вид патчинга используется в ПО с открытым исходным кодом (open-source software).
  3. Крупные(пакеты обновлений). Такие патчи включают очень много исправлений, которые применяются одновременно. Чаще всего этот термин используется по отношению к обновлениям операционных систем.

Пакеты обновлений

Другие разновидности

  1. Хотфикс— это небольшой набор информации, который зачастую решает один конкретный баг. Такие патчи могут выпускаться в течение пары часов после обнаружения ошибки.
  2. Point release– небольшие обновления для программ, которые одновременно исправляют несколько ошибок.
  3. Патчи безопасности— отдельная разновидность заплаток, исправляющих проблемы с безопасностью и предотвращающих потерю или утечку данных.
  4. Неофициальные— это обновления, выпускаемые не разработчиками ПО, а сторонними программистами. Распространено в программах с открытым кодом и компьютерных играх.
  5. Патчи для глаз— это уже из совсем другой оперы, но тем не менее, данные фичи весьма популярны у слабого пола и они их активно применяют.

Заключение

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

Сейчас это удел цифровых продуктов: операционных систем, игр и программ. Но на наших глазах зарождается индустрия, где физический продукт может становиться лучше с помощью программных обновлений. Лучший пример — автомобильная компания Tesla, Inc., которая делает свои машины безопаснее, быстрее и лучше с помощью патчей.

Удачи вам! До скорых встреч на страницах блога KtoNaNovenkogo.ru

Эта статья относится к рубрикам:

Вот помню раньше, еще до эпохи массового распространения интернета и автоматических обновлений, программное обеспечение тестировали гораздо тщательней.

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

Ваш комментарий или отзыв

Источник: ktonanovenkogo.ru

Что такое Патч и зачем он нужен?!

что такое патч

Многие из Вас, дорогие мои читатели, уже сталкивались с таким компьютерным термином, как «Патч». Но что это такое — внятно ответить сможет не каждый. И уж тем более, мало кто знает, откуда оно появилось. А ведь у него есть своя, довольно-таки интересная история.
Сейчас «Патч» (англ. Patch) обозначает файл или набор файлов, с помощью которых вносятся поправки в код программы с целью устранить в ней ошибки и уязвимости, либо для изменения каких-либо её параметров. Например, в игре патч может добавить дополнительные уровни, локации, изменить графическое оформление и тому подобное.

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

Само слово Патч (Patch)в переводе с английского означает «заплатка». Сам термин появился достаточно давно, ещё в то время, когда компьютеры использовали в качестве носителя информации перфокарты и перфоленты.

перфолента

Для самых юных читателей поясню: перфокарта — это бумажная карточка, на которую в специальной последовательности наносятся дырочки, представляющие собой код программы, которую компьютер считывает и преобразует в машинный код.
Перфолента — это практически тоже самое, только уже вместо карточки используется лента. В случае, если программист находил в программе ошибку — он вырезал в ленте проблемный кусок, а вместо него вклеивал исправленный. Вот этот, новый участок перфоленты и получил название «Патч», то есть заплатка.

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

Источник: set-os.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru