|
| 1 | +\chapter{\IFRU{Модификация исполняемых файлов}{Executable files patching}} |
| 2 | + |
| 3 | +\section{\IFRU{Текстовые строки}{Text strings}} |
| 4 | + |
| 5 | +\IFRU{Сишные строки проще всего модифицировать (если они не зашифрованы) в любом шестнадцатеричном редакторе} |
| 6 | +{C strings are most easily patched (unless they are encrypted) in any hex editor}. |
| 7 | +\IFRU{Эта техника доступна даже для тех, кто вовсе не разбирается в машинном коде и форматах исполняемых |
| 8 | +файлов}{This technique available even for those who are not aware of machine code and executabe file formats}. |
| 9 | +\IFRU{Новая строка не должна быть длиннее старой, потому что имеется риск затереть какую-то другую переменную |
| 10 | +или код}{New string should not be bigger than old, because it's a risk to overwrite some other value or code |
| 11 | +there}. |
| 12 | +\index{MS-DOS} |
| 13 | +\IFRU{Используя этот метод, очень много ПО было \IT{локализовано} во времена MS-DOS, как минимум, |
| 14 | +в странах бывшего СССР, в 80-х и 90-х} |
| 15 | +{Using this method, a lot of software was \IT{localized} in MS-DOS era, at least in ex-USSR countries in 80's |
| 16 | +and 90's}. |
| 17 | +\IFRU{Отсюда наличие очень странных аббревиатур и сокращений в \IT{локализованном} ПО: |
| 18 | +там просто не было места для более |
| 19 | +длинных строк}{It was a reason why so weird abbreviations was present in \IT{localized} software: it was no room for |
| 20 | +longer strings}. |
| 21 | + |
| 22 | +\index{Borland Delphi} |
| 23 | +\IFRU{В строках в Delphi, длина строки также должна быть поправлена, если нужно} |
| 24 | +{As of Delphi strings, a string size should also be corrected, if needed}. |
| 25 | + |
| 26 | +\section{x86\IFRU{-код}{ code}} |
| 27 | + |
| 28 | +\IFRU{Часто необходимые задачи}{Frequent patching tasks are}: |
| 29 | + |
| 30 | +\begin{itemize} |
| 31 | + |
| 32 | +\item \IFRU{Часто нужно просто запретить исполнение какой-либо инструкции} |
| 33 | +{One of the most frequently job is to disable some instruction}. |
| 34 | +\IFRU{И чаще всего, это можно сделать заполняя её байтом}{It is often done by filling it by byte} |
| 35 | +\TT{0x90} (\ac{NOP}). |
| 36 | + |
| 37 | +\item \IFRU{Условные переходы, имеющие опкод вроде}{Conditional jumps, which have opcode like} \TT{74 xx} (\JZ), |
| 38 | +\IFRU{так же могут быть заполнены двумя \ac{NOP}-ами}{may also be filled by two \ac{NOP}s}. |
| 39 | +\IFRU{Также возможно запретить исполнение условного перехода записав 0 во второй байт} |
| 40 | +{It is also possible to disable conditional jump by writing 0 at the second byte} (\IT{jump offset}). |
| 41 | + |
| 42 | +\item \IFRU{Еще одна часто необходимая задача это сделать условный переход всегда срабатывающим} |
| 43 | +{Another frequent job is to make conditional jump to trigger always}: |
| 44 | +\IFRU{это возможно при помощи записи}{this can be done by writing} \TT{0xEB} \IFRU{вместо опкода, это значит} |
| 45 | +{instead of opcode, it mean} \JMP. |
| 46 | + |
| 47 | +\index{stdcall} |
| 48 | +\item \IFRU{Исполнение ф-ции может быть запрещено, если записать}{A function execution can be disabled by writing} |
| 49 | +\RETN (0xC3) \IFRU{в её начале}{at its beginning}. |
| 50 | +\IFRU{Это справедливо для всех ф-ций кроме}{This is true for all functions excluding} \TT{stdcall} |
| 51 | +(\ref{sec:stdcall}). |
| 52 | +\IFRU{При модификации ф-ций}{While patching} \TT{stdcall}\IFRU{, нужно в начале определить количество аргументов |
| 53 | +(например, отыскав \RETN в этой ф-ции), |
| 54 | +и использовать}{ functions, one should determine number of arguments (for example, |
| 55 | +by finding \RETN in this function), |
| 56 | +and use} \RETN \IFRU{с 16-битным аргументом}{with 16-bit argument} (0xC2). |
| 57 | + |
| 58 | +\item \IFRU{Иногда, запрещенная ф-ция должна возвращать}{Sometimes, a disabled functions should return} 0 \OrENRU 1. |
| 59 | +\IFRU{Это можно сделать при помощи}{This can be done by} \TT{MOV EAX, 0} \OrENRU \TT{MOV EAX, 1}, |
| 60 | +\IFRU{но это слишком многословно}{but it's slightly verbose}. |
| 61 | +\IFRU{Способ получше это}{Better way is} \TT{XOR EAX, EAX} (2 \IFRU{байта}{bytes}) \OrENRU |
| 62 | +\TT{XOR EAX, EAX / INC EAX} (3 \IFRU{байта}{bytes}). |
| 63 | + |
| 64 | +\end{itemize} |
| 65 | + |
| 66 | +\IFRU{ПО может быть защищено от модификаций}{A software may be protected against modifications}. |
| 67 | +\IFRU{Эта защита чаще всего реализуется путем чтения кода и вычисления контрольной суммы} |
| 68 | +{This protection is often done by reading executable code and doing some checksumming}. |
| 69 | +\IFRU{Следовательно, код должен быть прочитан перед тем как защита сработает}{Therefore, |
| 70 | +the code should be read before protection will be triggered}. |
| 71 | +\IFRU{Это можно определить установив брякпойнт на чтение памяти} |
| 72 | +{This can be determined by setting breakpoint on reading memory}. |
| 73 | + |
| 74 | +\index{tracer} |
| 75 | +\IFRU{В \tracer имеется опция BPM для этого}{\tracer has BPM option for this}. |
| 76 | + |
| 77 | +\IFRU{Релоки в исполняемых PE-файлах}{PE executable file relocs} (\ref{subsec:relocs}) |
| 78 | +\IFRU{не должны быть тронуты, потому что загрузчик Windows перезапишет ваш новый код} |
| 79 | +{should not be touched while patching, |
| 80 | +because Windows loader will overwrite a new code}. |
| 81 | +\index{Hiew} |
| 82 | +(\IFRU{Они выделяются серым в Hiew, например}{They are grayed in Hiew, for example}: |
| 83 | +\figname \ref{fig:scanf_ex3_hiew_1}). |
| 84 | +\IFRU{В качестве последней меры, можно записать \JMP для обхода релока, либо же придется модифицировать таблицу |
| 85 | +релоков}{As a last resort, it is possible to write jumps circumventing relocs, |
| 86 | +or one will need to edit relocs table}. |
| 87 | + |
0 commit comments