Permalink
Browse files

...

1 parent aeeeff3 commit 0f08d46cd3624a24461af2de9594f1c26ce21ff8 @dennis714 committed Dec 25, 2016
View
@@ -1,3 +1,5 @@
+\label{CCppBooks}
+
\begin{itemize}
\item \KRBook
@@ -255,7 +255,29 @@ \subsection{Modifying arguments}
Theoretically, after the \gls{callee}'s return,
the \gls{caller} could get the modified argument and use it somehow.
Maybe if it is written directly in assembly language.
-But the \CCpp languages standards don't offer any way to access them.
+
+For example, code like this will be generated by usual \CCpp compiler:
+
+\begin{lstlisting}
+ push 456 ; will be b
+ push 123 ; will be a
+ call f ; f() modifies its first argument
+ add esp, 2*4
+\end{lstlisting}
+
+We can rewrite this code like:
+
+\begin{lstlisting}
+ push 456 ; will be b
+ push 123 ; will be a
+ call f ; f() modifies its first argument
+ pop eax
+ add esp, 4
+ ; EAX=1st argument of f() modified in f()
+\end{lstlisting}
+
+Hard to imagine, why anyone would need this, but this is possible in practice.
+Nevertheless, the \CCpp languages standards don't offer any way to do so.
% sections
\input{OS/calling_conventions/ptr_to_argument/main_EN}
@@ -262,7 +262,29 @@ \subsection{Модификация аргументов}
Теоретически, после возврата из \gls{callee},
функция-\gls{caller} могла бы получить модифицированный аргумент и использовать его как-то.
Может быть, если бы она была написана на языке ассемблера.
-Но стандарты языков \CCpp не предлагают никакого способа доступиться к ним.
+
+Например, такой код генерирует обычный компилятор \CCpp:
+
+\begin{lstlisting}
+ push 456 ; will be b
+ push 123 ; will be a
+ call f ; f() modifies its first argument
+ add esp, 2*4
+\end{lstlisting}
+
+Мы можем переписать так:
+
+\begin{lstlisting}
+ push 456 ; will be b
+ push 123 ; will be a
+ call f ; f() modifies its first argument
+ pop eax
+ add esp, 4
+ ; EAX=1st argument of f() modified in f()
+\end{lstlisting}
+
+Трудно представить, кому может это понадобиться, но на практике это возможно.
+Так или иначе, стандарты языков \CCpp не предлагают никакого способа это сделать.
% sections
\input{OS/calling_conventions/ptr_to_argument/main_RU}
@@ -1,3 +1,17 @@
\myindex{x86!\Instructions!LOOP}
\item[LOOP] (M) \RU{\glslink{decrement}{декремент}}\EN{\gls{decrement}} CX/ECX/RCX,
\RU{переход если он всё еще не ноль}\EN{jump if it is still not zero}.
+
+\RU{Инструкцию LOOP очень часто использовали в DOS-коде, который работал внешними устройствами.
+Чтобы сделать небольшую задержку, делали так:}%
+\EN{LOOP instruction was often used in DOS-code which works with external devices.
+To add small delay, this was done:}
+
+\begin{lstlisting}
+ MOV CX, nnnn
+LABEL: LOOP LABEL
+\end{lstlisting}
+
+\RU{Недостаток очевиден: длительность задержки сильно зависит от скорости \ac{CPU}.}%
+\EN{Drawback is obvious: length of delay depends on \ac{CPU} speed.}
+
@@ -46,6 +46,8 @@ \section{Constants}
See also the precomputed table for CRC32: \myref{sec:CRC32}.
+In tableless CRC algorithms well-known polynomials are used, for example, 0xEDB88320 for CRC32.
+
\subsection{Magic numbers}
\label{magic_numbers}
@@ -164,6 +166,13 @@ \subsubsection{DHCP}
.text:000007FF648082D1 jnz loc_7FF648173AF
\end{lstlisting}
+\subsection{Specific constants}
+
+Sometimes, there is a specific constant for some type of code.
+For example, the author once dug into a code, where number 12 was encountered suspiciously often.
+Size of many arrays is 12, or multiple of 12 (24, etc).
+As it turned out, that code takes 12-channel audio file at input and process it.
+
\subsection{Searching for constants}
It is easy in \IDA: Alt-B or Alt-I.
@@ -45,6 +45,8 @@ \section{Константы}
См. также таблицу CRC32: \myref{sec:CRC32}.
+В бестабличных алгоритмах CRC используются хорошо известные полиномы, например 0xEDB88320 для CRC32.
+
\subsection{Магические числа}
\label{magic_numbers}
@@ -157,6 +159,13 @@ \subsubsection{DHCP}
.text:000007FF648082D1 jnz loc_7FF648173AF
\end{lstlisting}
+\subsection{Специфические константы}
+
+Иногда, бывают какие-то специфические константы для некоторого типа кода.
+Например, однажды автор сих строк пытался разобраться с кодом, где подозрительно часто встречалось число 12.
+Размеры многих массивов также были 12, или кратные 12 (24, итд).
+Оказалось, этот код брал на вход 12-канальный аудиофайл и обрабатывал его.
+
\subsection{Поиск констант}
В \IDA это очень просто, Alt-B или Alt-I.
@@ -79,6 +79,22 @@ \chapter{\RU{Поиск в коде того что нужно}
\EN{\input{digging_into_code/identification/exec_EN}}
\RU{\input{digging_into_code/identification/exec_RU}}
% binary files might be also here
+
+\EN{\section{Communication with outer world (function level)}
+
+It's often advisable to track function arguments and return values in debugger or \ac{DBI}.
+For example, the author once tried to understand meaning of some obscure function, which happens to be incorrectly
+implemented bubble sort.
+(It worked correctly, but slower.)
+Meanwhile, watching inputs and outputs of this function helps instantly to understand what it does.}%
+\RU{\section{Связь с внешним миром (на уровне функции)}
+
+Очень желательно следить за аргументами ф-ции и возвращаемыми значениями, в отладчике или \ac{DBI}.
+Например, автор этих строк однажды пытался понять значение некоторой очень запутанной ф-ции, которая, как потом оказалось,
+была неверно реализованной пузырьковой сортировкой.
+(Она работала правильно, но медленнее.)
+В то же время, наблюдение за входами и выходами этой ф-ции мгновенно помогает понять, что она делает.}
+
\EN{\input{digging_into_code/communication_win32_EN}}
\RU{\input{digging_into_code/communication_win32_RU}}
\input{digging_into_code/strings}
@@ -128,3 +128,21 @@ \section{\SignedNumbersSectionName}
\input{fundamentals/MUL_IMUL_EN}
\input{fundamentals/one_more_EN}
+A table of some negative and positive values (\ref{signed_tbl}) looks like thermometer with Celsius scale.
+This is why addition and subtraction works equally well for both signed and unsigned numbers:
+if the first addend is represented as mark on thermometer, and one need to add a second addend,
+and it's positive, we just shift mark up on thermometer by the value of second addend.
+If the second addend is negative, then we shift mark down to absolute value of the second addend.
+
+Addition of two negative numbers works as follows.
+For example, we need to add -2 and -3 using 16-bit registers.
+-2 and -3 is 0xfffe and 0xfffd repsectively.
+If we add these numbers as unsigned, we will get 0xfffe+0xfffd=0x1fffb.
+But we work on 16-bit registers, so the result is \IT{cut off}, the first 1 is dropped,
+0xfffb is left, and this is -5.
+This works because -2 (or 0xfffe) can be represented using plain English like this:
+``2 lacks in this value up to maximal value in 16-bit register + 1''.
+-3 can be represented as ``\dots 3 lacks in this value up to \dots''.
+Maximal value of 16-bit register + 1 is 0x10000.
+During addition of two numbers and \IT{cutting off} by $2^{16}$ modulo, $2+3=5$ \IT{will be lacking}.
+
@@ -9,6 +9,7 @@ \section{\SignedNumbersSectionName}
Вот таблица некоторые значений байтов:
+\label{signed_tbl}
\begin{center}
\begin{tabular}{ | l | l | l | l | }
\hline
@@ -123,3 +124,21 @@ \section{\SignedNumbersSectionName}
\TT{CBW/CWD/CWDE/CDQ/CDQE} (\myref{ins:CBW_CWD_etc}), \TT{MOVSX} (\myref{MOVSX}), \TT{SAR} (\myref{ins:SAR}).
\end{itemize}
+Таблица некоторых отрицательных и положительных значений (\ref{signed_tbl}) напоминает термометр со шкалой по Цельсию.
+Вот почему сложение и вычитание работает одинаково хорошо и для знаковых и беззнаковых чисел:
+если первое слагаемое представить как отметку на термометре, и нужно прибавить второе слагаемое,
+и оно положительне, то мы просто поднимаем отметку вверх на значение второго слагаемого.
+Если второе слагаемое отрицательное, то мы опускаем отметку вниз на абсолютное значение от второго слагаемого.
+
+Сложение двух отрицательных чисел работает так.
+Например, нужно сложить -2 и -3 используя 16-битные регистры.
+-2 и -3 это 0xfffe и 0xfffd соответственно.
+Если сложить эти два числа как беззнаковые, то получится 0xfffe+0xfffd=0x1fffb.
+Но мы работаем с 16-битными регистрами, так что результат \IT{обрезается}, первая единица выкидывается,
+остается 0xfffb, а это -5.
+Это работает потому что -2 (или 0xfffe) можно описать простым русским языком так:
+``в этом значении не достает двух до максимального значения в регистре + 1''.
+-3 можно описать ``\dots не достает трех до \dots''.
+Максимальное значение 16-битного регистра + 1 это 0x10000.
+При складывании двух чисел, и \IT{обрезании} по модулю $2^{16}$, \IT{не хватать} будет $2+3=5$.
+
@@ -78,6 +78,17 @@ \subsection{\CCpp}
\input{patterns/12_FPU/2_passing_floats/main}
\input{patterns/12_FPU/3_comparison/main}
+\subsection{Some constants}
+
+It's easy to find representations of some constants in Wikipedia for IEEE 754 encoded numbers.
+It's interesting to know that 0.0 in IEEE 754 is represented as 32 zero bits (for single precision) or 64 zero bits
+(for double).
+So in order to set a floating point variable to 0.0 in register or memory, one can use \MOV or \TT{XOR reg, reg} instruction.
+\myindex{\CStandardLibrary!memset()}
+This is suitable for structures where many variables present of various data types.
+With usual memset() function one can set all integer variables to 0, all boolean variables to \IT{false},
+and all floating point variables (of any precision) to 0.0.
+
\subsection{Stack, calculators and reverse Polish notation}
\myindex{Reverse Polish notation}
@@ -74,6 +74,17 @@ \subsection{\CCpp}
\input{patterns/12_FPU/2_passing_floats/main}
\input{patterns/12_FPU/3_comparison/main}
+\subsection{Некоторые константы}
+
+В Wikipedia легко найти представление некоторых констант в IEEE 754.
+Любопытно узнать, что 0.0 в IEEE 754 представляется как 32 нулевых бита (для одинарной точности) или 64 нулевых бита
+(для двойной).
+Так что, для записи числа 0.0 в переменную в памяти или регистр, можно пользоваться инструкцией \MOV, или \TT{XOR reg, reg}.
+\myindex{\CStandardLibrary!memset()}
+Это тем может быть удобно, что если в структуре есть много переменных разных типов, то обычной ф-ций memset()
+можно установить все целочисленные переменные в 0, все булевы переменные в \IT{false}
+и все переменные с плавающей точкой (любой точности) в 0.0.
+
\subsection{Стек, калькуляторы и обратная польская запись}
\myindex{Обратная польская запись}
@@ -21,4 +21,22 @@ \section{\Arrays}
\EN{\input{patterns/13_arrays/55_month_2D/main_EN}}
\RU{\input{patterns/13_arrays/55_month_2D/main_RU}}
\input{patterns/13_arrays/conclusion}
+
+\myindex{Hex-Rays}
+
+\RU{\section{Кстати}
+
+Итак, указатель на массив и адрес первого элемента --- это одно и то же.
+Вот почему выражения \TT{ptr[0]} и \TT{*ptr} в \CCpp равноценны.
+Любопытно что Hex-Rays часто заменяет первое вторым.
+Он делает это в тех случаях, когда не знает, что имеет дело с указателем на целый массив,
+и думает, что это указатель только на одну переменную.}%
+\EN{\section{By the way}
+
+So, pointer to an array and address of a first element---is the same thing.
+This is why \TT{ptr[0]} and \TT{*ptr} expressions are equivalent in \CCpp.
+It's interesting to note that Hex-Rays often replaces the first by the second.
+It does so when it have no idea that it works with pointer to the whole array,
+and thinks that this is a pointer to single variable.}
+
\input{patterns/13_arrays/exercises}
View
@@ -1,3 +1,4 @@
+% TODO to be synced with EN version
\section*{Vorwort}
Es gibt verschiedene verbreitete Interpretationen des Begriffs Reverse Engineering:\\
View
@@ -29,6 +29,11 @@ \subsection*{Topics touched upon}
OpenMP (\myref{openmp}),
SEH (\myref{sec:SEH}).
+\subsection*{Prerequisites}
+
+Basic C \ac{PL} knowledge.
+Recommended reading: \myref{CCppBooks}.
+
\subsection*{Exercises and tasks}
\dots
View
@@ -1,3 +1,4 @@
+% TODO to be synced with EN version
\section*{Pr\'ologo}
Existen muchos significados populares para el t\'ermino \q{\gls{reverse engineering}}:
View
@@ -1,3 +1,4 @@
+% TODO to be synced with EN version
\section*{Préface}
Il existe plusieurs définitions pour l'expression \q{\gls{ingénierie inverse ou rétro-ingénierie}} :
View
@@ -1,3 +1,4 @@
+% TODO to be synced with EN version
\section*{Prefazione}
Ci sono diversi significati per il termine \q{\gls{reverse engineering}}:
View
@@ -1,3 +1,4 @@
+% TODO to be synced with EN version
\section*{Voorwoord}
Er zijn verschillende populaire betekenissen voor de term \q{\gls{reverse engineering}}:
View
@@ -29,6 +29,11 @@ \subsection*{Затронутые темы}
OpenMP (\myref{openmp}),
SEH (\myref{sec:SEH}).
+\subsection*{Желательные знания перед началом чтения}
+
+Очень желательно базовое знание \ac{PL} Си.
+Рекомендуемые материалы: \myref{CCppBooks}.
+
\subsection*{Упражнения и задачи}
\dots

0 comments on commit 0f08d46

Please sign in to comment.