Skip to content

Commit

Permalink
bugfixes by Alexey Tretiakov
Browse files Browse the repository at this point in the history
  • Loading branch information
yurichev committed Sep 5, 2020
1 parent 7944c7b commit 983b942
Show file tree
Hide file tree
Showing 45 changed files with 77 additions and 74 deletions.
4 changes: 1 addition & 3 deletions OS/NT_critical_sections_RU.tex
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,8 @@ \subsection{Windows NT: Критические секции}
для обеспечения гарантии что только один тред будет иметь доступ к данным в один момент времени,
блокируя остальные треды и прерывания.


\par
Вот как объявлена структура \TT{CRITICAL\_SECTION}
объявлена в линейке OS \gls{Windows NT}:
Вот как структура \TT{CRITICAL\_SECTION} объявлена в линейке OS \gls{Windows NT}:

\begin{lstlisting}[caption=(Windows Research Kernel v1.2) public/sdk/inc/nturtl.h,style=customc]
typedef struct _RTL_CRITICAL_SECTION {
Expand Down
2 changes: 1 addition & 1 deletion OS/PE/main_DE.tex
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ \subsubsection{Betriebssystem-Version}
ladbar zu sein.

Die Tabelle mit Versionsnummern in der PE-Datei und die entsprechenden Windows-Codenamen
ist hier.
ist hier\footnote{\href{http://go.yurichev.com/17044}{Wikipédia}}.

\myindex{Windows!Windows NT4}
\myindex{Windows!Windows 2000}
Expand Down
2 changes: 1 addition & 1 deletion OS/PE/main_EN.tex
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ \subsubsection{OS version}
A PE file also specifies the minimal Windows version it needs in order to be loadable.

The table of version numbers stored in the PE file and corresponding Windows codenames is
here.
here\footnote{\href{http://go.yurichev.com/17044}{Wikipédia}}.

\myindex{Windows!Windows NT4}
\myindex{Windows!Windows 2000}
Expand Down
4 changes: 2 additions & 2 deletions OS/PE/main_RU.tex
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ \subsubsection{Версия ОС}
В PE-файле также задается минимальный номер версии Windows, необходимый для загрузки модуля.

Соответствие номеров версий в файле и кодовых наименований Windows, можно посмотреть
здесь.
здесь\footnote{\href{http://go.yurichev.com/17044}{Wikipédia}}.

\myindex{Windows!Windows NT4}
\myindex{Windows!Windows 2000}
Expand Down Expand Up @@ -449,7 +449,7 @@ \subsubsection{.NET}
\myindex{.NET}
Программы на .NET компилируются не в машинный код, а в свой собственный байткод.
\myindex{OEP}
Собственно, в .exe-файлы байткод вместо обычного кода, однако, точка входа (\ac{OEP})
Собственно, в .exe-файле байткод вместо обычного кода, однако, точка входа (\ac{OEP})
указывает на крохотный фрагмент x86-кода:

\begin{lstlisting}[style=customasmx86]
Expand Down
4 changes: 2 additions & 2 deletions OS/calling_conventions/main_RU.tex
Original file line number Diff line number Diff line change
Expand Up @@ -244,9 +244,9 @@ \subsection{Модификация аргументов}
Иногда программисты на \CCpp{} (и не только этих \ac{PL}) задаются вопросом,
что может случиться, если модифицировать аргументы?

Ответ прост: аргументы хранятся в стеке, именно там и будет происходит модификация.
Ответ прост: аргументы хранятся в стеке, именно там и будет происходить модификация.

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

\lstinputlisting[style=customc]{OS/calling_conventions/change_arguments.c}

Expand Down
2 changes: 1 addition & 1 deletion advanced/030_dbl_neg/main_RU.tex
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,6 @@
};
\end{lstlisting}

Компиляторы, компилирующие для \ac{CPU} у которых нет инструкции близкой в
Компиляторы, компилирующие для \ac{CPU} у которых нет инструкции близкой к
\INS{SET}, в этом случае, генерируют инструкции условного перехода, итд.

4 changes: 2 additions & 2 deletions advanced/250_toupper/MSVC_2013_x64_RU.asm
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ toupper PROC
movsx eax, BYTE PTR c$[rsp]
sub eax, 32
jmp SHORT $LN3@toupper
jmp SHORT $LN1@toupper ; артифакт компилятора
jmp SHORT $LN1@toupper ; артефакт компилятора
$LN2@toupper:
movzx eax, BYTE PTR c$[rsp] ; необязательное приведение типов
$LN1@toupper:
$LN3@toupper: ; артифакт компилятора
$LN3@toupper: ; артефакт компилятора
ret 0
toupper ENDP
4 changes: 2 additions & 2 deletions advanced/250_toupper/main_RU.tex
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

\ac{ASCII}-код символа \q{a} это 97 (или 0x61), и 65 (или 0x41) для символа \q{A}.

Разница (или расстояние) между ними в \ac{ASCII}-таблица это 32 (или 0x20).
Разница (или расстояние) между ними в \ac{ASCII}-таблице это 32 (или 0x20).

Для лучшего понимания, читатель может посмотреть на стандартную 7-битную таблицу \ac{ASCII}:

Expand Down Expand Up @@ -120,7 +120,7 @@ \subsubsection{GCC для ARM64}
\subsection{Используя битовые операции}
\label{toupper_bit}

Учитывая тот факт, что 5-й бит (считая с 0-его) всегда присутствует после проверки, вычитание его это просто
Учитывая тот факт, что 5-й бит (считая с 0-го) всегда присутствует после проверки, вычитание его это просто
сброс этого единственного бита, но точно такого же эффекта можно достичть при помощи обычного применения операции
``И'' (\myref{AND_OR_as_SUB_ADD}).

Expand Down
2 changes: 1 addition & 1 deletion advanced/310_obfuscation/main_RU.tex
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ \subsection{Виртуальная машина / псевдо-код}

Программист может также создать свой собственный \ac{PL} или \ac{ISA} и интерпретатор для него.

(Как версии Visual Basic перед 5.0, .NET or Java machines).
(Как версии Visual Basic перед 5.0, .NET или Java-машины.)

Reverse engineer-у придется потратить какое-то время для понимания деталей всех инструкций в \ac{ISA}.
Ему также возможно придется писать что-то вроде дизассемблера/декомпилятора.
Expand Down
4 changes: 2 additions & 2 deletions advanced/350_cpp/STL/map_set/main_RU.tex
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ \subsubsection{std::map и std::set}

\begin{itemize}
\item Все ключи всегда хранятся в отсортированном виде.
\item Могут хранится ключи любых типов.
\item Могут храниться ключи любых типов.
Алгоритмы для работы с двоичными деревьями не зависят от типа ключа,
для работы им нужна только функция для сравнения ключей.
\item Поиск заданного ключа относительно быстрый по сравнению со списками или массивами.
Expand Down Expand Up @@ -46,7 +46,7 @@ \subsubsection{std::map и std::set}
Операции вставки и удаления проводят дополнительную работу по обслуживанию дерева и сохранения его в сбалансированном
состоянии.

Известно несколько популярных алгоритмом балансировки, включая AVL-деревья и красно-черные деревья.
Известно несколько популярных алгоритмов балансировки, включая AVL-деревья и красно-черные деревья.
Последний дополняет узел значением \q{цвета} для упрощения балансировки, таким образом каждый узел может быть
\q{красным} или \q{черным}.

Expand Down
2 changes: 1 addition & 1 deletion advanced/350_cpp/STL/string/main_RU.tex
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ \subsubsection{std::string}
\myparagraph{Как устроена структура}

Многие строковые библиотеки \InSqBrackets{\CNotes 2.2} обеспечивают структуру содержащую ссылку
на буфер собственно со строкой, переменная всегда содержащую длину строки
на буфер собственно со строкой, переменную всегда содержащую длину строки
(что очень удобно для массы функций \InSqBrackets{\CNotes 2.2.1}) и переменную содержащую текущий размер буфера.

Строка в буфере обыкновенно оканчивается нулем: это для того чтобы указатель на буфер можно было
Expand Down
2 changes: 1 addition & 1 deletion advanced/370_neg_arrays/main_RU.tex
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ \subsection{Адресация некоторого блока с конца}
Это работает точно так же, как и трюк с адресацией строки с конца.

Проверять, не пересекаются ли структуры друг с другом легко:
просто убедится что адрес последнего элемента в \emph{heap} всегда меньше чем адрес последнего элемента в \emph{stack}.
просто убедиться, что адрес последнего элемента в \emph{heap} всегда меньше, чем адрес последнего элемента в \emph{stack}.

К сожалению, индекс $-0$ работать не будет,
т.к. способ представления отрицательных чисел (\emph{дополнительный код}, \myref{sec:signednumbers})
Expand Down
2 changes: 1 addition & 1 deletion advanced/450_more_ptrs/3_RU.tex
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ \subsection{Издевательство над указателями в ядр
\end{lstlisting}

Так что к \emph{lpId} применяется операция ``И'' c \emph{0xFFFF0000}, и если присутствуют какие-либо биты за младшими 16 битами,
исполняется первая часто ф-ции и (\emph{lpId} принимается за адрес строки).
исполняется первая часть ф-ции и (\emph{lpId} принимается за адрес строки).
Иначе --- вторая часть ф-ции (\emph{lpId} принимается за 16-битное значение).

Этот же код можно найти и в Windows 7, в файле kernel32.dll:
Expand Down
2 changes: 1 addition & 1 deletion advanced/450_more_ptrs/4_RU.tex
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ \subsubsection{Нулевой указатель на ф-цию}

Странно выглядит, но работает в Windows 7 x86.

Это часто используется в шеллкода, потому что оттуда трудно вызывать ф-ции из DLL по их именам.
Это часто используется в шеллкодах, потому что оттуда трудно вызывать ф-ции из DLL по их именам.
А \ac{ASLR} это контрмера.

И вот теперь что по-настоящему странно выглядит, некоторые программисты на Си для встраиваемых (embedded) систем, могут быть
Expand Down
2 changes: 1 addition & 1 deletion advanced/450_more_ptrs/62_EN.tex
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ \subsection{Pointer to a function: a common bug (or typo)}

\lstinputlisting[style=customc]{advanced/450_more_ptrs/62.c}

Since the function's name alone is interpreted as a pointer to function, or address,
Since the function's name alone is interpreted as a pointer to function, or its address,\\
the \verb|if(function_name)| statement is like \verb|if(true)|.

Unfortunately, a \CCpp compiler wouldn't issue a warning.
Expand Down
2 changes: 1 addition & 1 deletion advanced/450_more_ptrs/62_FR.tex
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ \subsection{Pointeur sur une fonction: un bogue courant (ou une typo)}

\lstinputlisting[style=customc]{advanced/450_more_ptrs/62.c}

Puisque le nom de la fonction seul est interprété comme un pointeur sur une fonction,
Puisque le nom de la fonction seul est interprété comme un pointeur sur une fonction,\\
ou une adresse, la déclaration \verb|if(function_name)| est comme \verb|if(true)|.

Malheureusement, un compilateur \CCpp ne va pas générer d'avertissement.
Expand Down
2 changes: 1 addition & 1 deletion advanced/450_more_ptrs/62_RU.tex
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ \subsection{Указатель на ф-цию: частая ошибка (или

\lstinputlisting[style=customc]{advanced/450_more_ptrs/62.c}

Т.к. имя ф-ции само по себе трактуется как указатель на ф-цию, или её адрес
Т.к. имя ф-ции само по себе трактуется как указатель на ф-цию, или её адрес,\\
выражение \verb|if(function_name)| работает как \verb|if(true)|.

К сожалению, компилятор с \CCpp не выдает предупреждение об этом.
Expand Down
2 changes: 1 addition & 1 deletion advanced/500_loop_optimizations/2_RU.tex
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ \subsection{Еще одна оптимизация циклов}
Как проверить, закончился ли цикл?
Просто сравните указатель с адресом сразу за концом массива, который, как случилось в нашем случае, это просто адрес
импортируемой из Glibc 2.0 ф-ции \TT{\_\_libc\_start\_main()}.
Такой когд иногда сбивает с толку, и это очень популярный оптимизационный трюк, поэтому я сделал этот пример.
Такой код иногда сбивает с толку, и это очень популярный оптимизационный трюк, поэтому я сделал этот пример.

Моя вторая версия очень близка к тому, что сделал GCC, и когда я компилирую её, код почти такой как и в первой версии,
но две первых инструкции поменены местами:
Expand Down
4 changes: 2 additions & 2 deletions advanced/550_more_structs/unsized_array_in_struct_RU.tex
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
\subsection{Безразмерный массив в структуре Си}

В некоторый win32-структурах мы можем найти такие, где последнее поле определено как массив из одного элемента:
В некоторых win32-структурах мы можем найти такие, где последнее поле определено как массив из одного элемента:

\begin{lstlisting}[style=customc]
typedef struct _SYMBOL_INFO {
Expand Down Expand Up @@ -79,6 +79,6 @@ \subsection{Безразмерный массив в структуре Си}
Деннис Ритчи (один из создателей Си) называет этот трюк \q{unwarranted chumminess with the C implementation}
(вероятно, подтверждая хакерскую природу трюка).

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

2 changes: 1 addition & 1 deletion advanced/600_memmove/main_EN.tex
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

The difference between these standard functions is that \emph{memcpy()} blindly copies a block to another place,
while \emph{memmove()} correctly handles overlapping blocks.
For example, you want to tug a string two bytes forward:
For example, you want to tug a string two bytes back:

% TODO TikZ
\begin{lstlisting}
Expand Down
1 change: 1 addition & 0 deletions advanced/600_memmove/main_FR.tex
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
un bloc à un autre endroit, alors que \emph{memmove()} gère correctement les blocs
qui se recouvrent.
Par exemple, si vous voulez déplacer une chaîne de deux octets en avant:
% to be sync: For example, you want to tug a string two bytes back:

% TODO TikZ
\begin{lstlisting}
Expand Down
2 changes: 1 addition & 1 deletion advanced/600_memmove/main_RU.tex
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
Разница между этими стандартными ф-циями в том, что
\emph{memcpy()} слепо копирует блок в другое место,
в то время как \emph{memmove()} корректно обрабатывает блоки, хранимые внахлест.
Например, вы хотите оттащить строку на два байта вперед:
Например, вы хотите оттащить строку на два байта назад:

% TODO TikZ
\begin{lstlisting}
Expand Down
10 changes: 5 additions & 5 deletions advanced/650_stack/1_RU.tex
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,8 @@ \subsection{Доступ к аргументам и локальным пере
На 32-битной Ubuntu 16.04 и GCC 5.4.0, я получил это:

\begin{lstlisting}
адрес main()=0x80484f8
адрес draw_text()=0x80484cb
§адрес§ main()=0x80484f8
§адрес§ draw_text()=0x80484cb
0x8048645 первый аргумент f()
0x8048628
0xbfd8ab98
Expand Down Expand Up @@ -97,11 +97,11 @@ \subsection{Доступ к аргументам и локальным пере
Таки работает:

\begin{lstlisting}
нашли
Собираемся нарисовать [Hello!] на 100:210
§нашли§
§Собираемся нарисовать [Hello!] на 100:210§
\end{lstlisting}

\myparagraph{Summary}
\myparagraph{Итог}

Это экстремально грязный хак, предназначенный для демонстрации внутренностей стека.
я никогда даже не видел и не слышал чтобы кто-то использовал такое в реальном коде.
Expand Down
2 changes: 1 addition & 1 deletion advanced/650_stack/2_RU.tex
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ \subsection{Возврат строки}
\end{lstlisting}

Так что когда \main вызывает \printf, он использует стек в месте, где выделен буфер в interim(),
и не затирает 100 байт с сообщение об ошибке внутри, потому что 8000 байт (или может быть меньше) это достаточно для всего,
и не затирает 100 байт с сообщением об ошибке внутри, потому что 8000 байт (или может быть меньше) это достаточно для всего,
что делает \printf и другие нисходящие ф-ции!

Это также может сработать, если между ними много ф-ций, например:
Expand Down
2 changes: 1 addition & 1 deletion advanced/800_win16/ex6_RU.tex
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ \subsection{\Example{} \#6}
\myindex{\CStandardLibrary!time()}
\myindex{\CStandardLibrary!localtime()}
Время в формате UNIX это 32-битное значение, так что оно возвращается в паре регистров \TT{DX:AX} и сохраняется
в двух локальны 16-битных переменных.
в двух локальных 16-битных переменных.
Потом указатель на эту пару передается в функцию
\TT{localtime()}.
Функция \TT{localtime()} имеет структуру \TT{struct tm} расположенную у себя
Expand Down
Loading

0 comments on commit 983b942

Please sign in to comment.