-
Notifications
You must be signed in to change notification settings - Fork 762
/
main.tex
executable file
·243 lines (174 loc) · 8.68 KB
/
main.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
% done
\documentclass[11pt,a4paper,oneside]{book}
\usepackage{cmap}
\ifdefined\RUSSIAN
\usepackage[english,russian]{babel}
\else
\usepackage[russian,english]{babel}
\fi
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\usepackage{url}
\usepackage{graphicx}
\usepackage{listingsutf8}
\usepackage[cm]{fullpage}
\usepackage{color}
\usepackage{fancyvrb}
\usepackage{xspace}
\usepackage{framed}
\usepackage{ccicons}
\usepackage{amsmath}
\usepackage[]{hyperref} % should be last
\definecolor{lstbgcolor}{rgb}{0.94,0.94,0.94}
\include{macros}
\include{common_URLS}
\newcommand{\TITLE}{\IFRU{Краткое введение в reverse engineering для начинающих}
{Quick introduction to reverse engineering for beginners}}
\newcommand{\AUTHOR}{\IFRU{Денис Юричев}{Dennis Yurichev}}
\newcommand{\EMAIL}{dennis@yurichev.com}
\newcommand{\VERSION}{0.6} % version WHICH IS PREPARED NOW. 0.2 mean 0.19999(9)
\hypersetup{
pdftex,
colorlinks=true,
allcolors=blue,
pdfauthor={\AUTHOR},
pdftitle={\TITLE}
}
\selectlanguage{english}
\lstset{
backgroundcolor=\color{lstbgcolor},
basicstyle=\footnotesize\ttfamily,
breaklines=true,
frame=single,
inputencoding=cp1251,
basicstyle=\ttfamily,
columns=fullflexible,keepspaces,
}
\renewcommand{\ttdefault}{cmtt} % need it here?
\newcommand{\SignedNumbersSectionName}{\IFRU{Представление знака в числах}
{Signed number representations}}
\newcommand{\DivisionByNineSectionName}{\IFRU{Деление на 9}{Division by 9}}
\newcommand{\WorkingWithFloatAsWithStructSubSubSectionName}{\IFRU
{Работа с типом float как со структурой}{Working with the float type as with a structure}}
\begin{document}
\VerbatimFootnotes
\frontmatter
\begin{titlepage}
\begin{center}
\vspace*{\fill}
\LARGE \TITLE
\vspace*{\fill}
\large \AUTHOR
\large \TT{<\EMAIL>}
\vspace*{\fill}
\vfill
\ccbyncnd
\copyright 2013, \AUTHOR.
\IFRU{Это произведение доступно по лицензии Creative Commons «Attribution-NonCommercial-NoDerivs»
(«Атрибуция — Некоммерческое использование — Без производных произведений») 3.0 Непортированная.
Чтобы увидеть копию этой лицензии, посетите}
{This work is licensed under the Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Unported License.
To view a copy of this license, visit} \url{http://creativecommons.org/licenses/by-nc-nd/3.0/}.
\IFRU{Версия этого текста}{Text version} \VERSION{} ({\large \today}).
\end{center}
\end{titlepage}
\tableofcontents
\cleardoublepage
\include{preface}
\mainmatter
\chapter{\IFRU{Паттерны компиляторов}{Compiler's patterns}}
\IFRU
{Когда я учил Си, а затем Си++, я просто писал небольшие куски кода, компилировал и смотрел что
получилось на ассемблере, так мне понять было намного проще. Я делал это такое количество раз,
что связь между кодом на \CCpp и тем что генерирует компилятор вбилась мне в подсознание достаточно
глубоко, поэтому я могу глядя на код на ассемблере сразу понимать, в общих чертах, что там было написано
на Си. Возможно это поможет кому-то еще, попробую описать некоторые примеры.}
{When I first learn C and then C++, I was just writing small pieces of code, compiling it and see what
is producing in assembler, that was an easy way to me. I did it a lot times and relation
between \CCpp code and what compiler produce was imprinted in my mind so deep so that
I can quickly understand what was in C code when I look at produced x86 code.
Perhaps, this method may be helpful for anyone else, so I'll try to describe here some examples.}
% TODO: english/russian version is also present: URL
\include{helloworld/hw}
\include{stack/stack}
\include{printf/printf}
\include{scanf/scanf}
\include{passing_arguments/passing_arguments}
\include{return_results/return_results}
\include{jcc/jcc}
\include{switch/switch}
\include{loops/loops}
\include{strlen/strlen}
\include{division_by_9/division_by_9}
\include{FPU/FPU}
\include{arrays/arrays}
\include{bitfields/bitfields}
\include{structs/structs}
\include{classes/classes}
% TODO: RTTI
\include{unions/unions}
\include{pointers_to_functions/pointers_to_functions}
\include{SIMD/SIMD}
\include{x64/x64}
\chapter{\IFRU{Еще кое-что}{Couple things to add}}
\include{LEA}
\include{prolog_epilog}
\include{npad}
\include{signed_numbers}
\include{calling_conventions}
\include{digging_into_code/digging_into_code}
\include{tasks/tasks}
\include{tools}
\include{reading}
\chapter{\IFRU{Еще примеры}{More examples}}
\include{qr9/qr9}
\include{sapgui/sapgui}
\chapter{\IFRU{Прочее}{Other things}}
\section{\IFRU{Аномалии компиляторов}{Compiler's anomalies}}
\IFRU{Intel C++ 10.1 которым скомпилирован Oracle RDBMS 11.2 Linux86, может сгенерировать два \JZ идущих подряд,
причем на второй \JZ нет ссылки ниоткуда. Второй \JZ таким образом, не имеет никакого смысла.}
{Intel C++ 10.1, which was used for Oracle RDBMS 11.2 Linux86 compilation, may emit two \JZ in row,
and there are no references to the second \JZ. Second \JZ is thus senseless.}
\IFRU{Например, kdli.o из}{For example, kdli.o from} libserver11.a:
\begin{lstlisting}
.text:08114CF1 loc_8114CF1: ; CODE XREF: __PGOSF539_kdlimemSer+89A
.text:08114CF1 ; __PGOSF539_kdlimemSer+3994
.text:08114CF1 8B 45 08 mov eax, [ebp+arg_0]
.text:08114CF4 0F B6 50 14 movzx edx, byte ptr [eax+14h]
.text:08114CF8 F6 C2 01 test dl, 1
.text:08114CFB 0F 85 17 08 00 00 jnz loc_8115518
.text:08114D01 85 C9 test ecx, ecx
.text:08114D03 0F 84 8A 00 00 00 jz loc_8114D93
.text:08114D09 0F 84 09 08 00 00 jz loc_8115518
.text:08114D0F 8B 53 08 mov edx, [ebx+8]
.text:08114D12 89 55 FC mov [ebp+var_4], edx
.text:08114D15 31 C0 xor eax, eax
.text:08114D17 89 45 F4 mov [ebp+var_C], eax
.text:08114D1A 50 push eax
.text:08114D1B 52 push edx
.text:08114D1C E8 03 54 00 00 call len2nbytes
.text:08114D21 83 C4 08 add esp, 8
\end{lstlisting}
\IFRU{Еще там же:}{From the same code:}
\begin{lstlisting}
.text:0811A2A5 loc_811A2A5: ; CODE XREF: kdliSerLengths+11C
.text:0811A2A5 ; kdliSerLengths+1C1
.text:0811A2A5 8B 7D 08 mov edi, [ebp+arg_0]
.text:0811A2A8 8B 7F 10 mov edi, [edi+10h]
.text:0811A2AB 0F B6 57 14 movzx edx, byte ptr [edi+14h]
.text:0811A2AF F6 C2 01 test dl, 1
.text:0811A2B2 75 3E jnz short loc_811A2F2
.text:0811A2B4 83 E0 01 and eax, 1
.text:0811A2B7 74 1F jz short loc_811A2D8
.text:0811A2B9 74 37 jz short loc_811A2F2
.text:0811A2BB 6A 00 push 0
.text:0811A2BD FF 71 08 push dword ptr [ecx+8]
.text:0811A2C0 E8 5F FE FF FF call len2nbytes
\end{lstlisting}
\IFRU{Возможно, это ошибка его кодегенератора, не выявленная тестами
(ведь результирующий код и так работает нормально).}
{It's probably code generator bug wasn't found by tests, because,
resulting code is working correctly anyway.}
\include{tasks_answers/tasks_answers}
\end{document}