ebook img

Reverse Engineering for Beginners PDF

1387 Pages·2020·10.749 MB·English
Save to my drive
Quick download
Download
Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.

Preview Reverse Engineering for Beginners

____ | _ \ _____ _____ _ __ ___ ___ | |_) / _ \ \ / / _ \ '__/ __|/ _ \ | _ < __/\ V / __/ | \__ \ __/ |_| \_\___| \_/ \___|_| |___/\___| _____ _ _ | ____|_ __ __ _(_)_ __ ___ ___ _ __(_)_ __ __ _ | _| | '_ \ / _` | | '_ \ / _ \/ _ \ '__| | '_ \ / _` | | |___| | | | (_| | | | | | __/ __/ | | | | | | (_| | |_____|_| |_|\__, |_|_| |_|\___|\___|_| |_|_| |_|\__, | |___/ |___/ __ / _| ___ _ __ | |_ / _ \| '__| | _| (_) | | |_| \___/|_| ____ _ | __ ) ___ __ _(_)_ __ _ __ ___ _ __ ___ | _ \ / _ \/ _` | | '_ \| '_ \ / _ \ '__/ __| | |_) | __/ (_| | | | | | | | | __/ | \__ \ |____/ \___|\__, |_|_| |_|_| |_|\___|_| |___/ |___/ i Reverse Engineering for Beginners (Understanding Assembly Language) Why two titles? Read here: on page xvii. Dennis Yurichev <[email protected]> cba ©2013-2020, Dennis Yurichev. This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license. To view a copy of this license, visit https://creativecommons.org/licenses/by-sa/4.0/. Text version (November 9, 2020). The latest version (and Russian edition) of this text is accessible at https://beginners.re/. Call for translators! YoumaywanttohelpmewithtranslatingthisworkintolanguagesotherthanEnglish and Russian. Just send me any piece of translated text (no matter how short) and I’ll put it into my LaTeX source code. Do not ask, if you should translate. Just do something. I stopped responding “what should I do” emails. Also, read here. The language statistics is available right here: https://beginners.re/. Speed isn’t important, because this is an open-source project, after all. Your name will be mentioned as a project contributor. Korean, Chinese, and Persian languages are reserved by publishers. English and Russian versions I do by myself, but my English is still that horrible, so I’m very grateful for any notes about grammar, etc. Even my Russian is flawed, so I’m grateful for notes about Russian text as well! So do not hesitate to contact me: <[email protected]>. Ifyounoticedatypo,errororhaveanysuggestions,donothesitatetodropmeanote: <[email protected]>. Thanks! Abridged contents 1 Code Patterns 1 2 Important fundamentals 564 3 Slightly more advanced examples 592 4 Java 851 5 Finding important/interesting stuff in the code 903 6 OS-specific 947 7 Tools 1020 8 Case studies 1025 9 Examples of reversing proprietary file formats 1191 10 Dynamic binary instrumentation 1265 11 Other things 1276 12 Books/blogs worth reading 1301 13 Communities 1304 ii Afterword 1306 Appendix 1308 Acronyms Used 1345 Glossary 1352 Index 1355 Contents 1 Code Patterns 1 1.1 The method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 Some basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 1.2.1 A short introduction to the CPU . . . . . . . . . . . . . . . . . . . . . . 2 1.2.2 Numeral Systems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 1.2.3 Converting From One Radix To Another . . . . . . . . . . . . . . . . . 4 1.3 An Empty Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 1.3.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3.2 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3.3 MIPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 1.3.4 Empty Functions in Practice. . . . . . . . . . . . . . . . . . . . . . . . . 9 1.4 Returning Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.4.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.4.2 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.4.3 MIPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.5 Hello, world! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.5.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 1.5.2 x86-64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1.5.3 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 1.5.4 MIPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 1.5.5 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 1.5.6 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 1.6 Function prologue and epilogue . . . . . . . . . . . . . . . . . . . . . . . . . . 39 1.6.1 Recursion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 1.7 An Empty Function: redux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 1.8 Returning Values: redux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 1.9 Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 iii iv 1.9.1 Why does the stack grow backwards? . . . . . . . . . . . . . . . . . . 41 1.9.2 What is the stack used for? . . . . . . . . . . . . . . . . . . . . . . . . . 42 1.9.3 A typical stack layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 1.9.4 Noise in stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 1.9.5 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 1.10 Almost empty function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 1.11 printf() with several arguments . . . . . . . . . . . . . . . . . . . . . . . . . . 56 1.11.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 1.11.2 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 1.11.3 MIPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 1.11.4 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 1.11.5 By the way . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 1.12 scanf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 1.12.1 Simple example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 1.12.2 The classic mistake . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 1.12.3 Global variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 1.12.4 scanf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 1.12.5 Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 1.13 Worth noting: global vs. local variables . . . . . . . . . . . . . . . . . . . . 125 1.14 Accessing passed arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 1.14.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 1.14.2 x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 1.14.3 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 1.14.4 MIPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 1.15 More about results returning . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 1.15.1 Attempt to use the result of a function returning void . . . . . . . 137 1.15.2 What if we do not use the function result? . . . . . . . . . . . . . . 139 1.15.3 Returning a structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 1.16 Pointers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 1.16.1 Returning values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 1.16.2 Swap input values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 1.17 GOTO operator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152 1.17.1 Dead code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 1.17.2 Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 1.18 Conditional jumps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 1.18.1 Simple example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 1.18.2 Calculating absolute value. . . . . . . . . . . . . . . . . . . . . . . . . 177 1.18.3 Ternary conditional operator . . . . . . . . . . . . . . . . . . . . . . . 180 1.18.4 Getting minimal and maximal values . . . . . . . . . . . . . . . . . . 184 1.18.5 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 1.18.6 Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 1.19 Software cracking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 1.20 Impossible shutdown practical joke (Windows 7). . . . . . . . . . . . . . . 194 1.21 switch()/case/default . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 1.21.1 Small number of cases . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 1.21.2 A lot of cases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210 1.21.3 When there are several case statements in one block . . . . . . . 224 1.21.4 Fall-through . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229 1.21.5 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 Ifyounoticedatypo,errororhaveanysuggestions,donothesitatetodropmeanote: <[email protected]>. Thanks! v 1.22 Loops . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 1.22.1 Simple example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231 1.22.2 Memory blocks copying routine . . . . . . . . . . . . . . . . . . . . . 246 1.22.3 Condition check . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 1.22.4 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250 1.22.5 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252 1.23 More about strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 1.23.1 strlen() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 1.23.2 Boundaries of strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 1.24 Replacing arithmetic instructions to other ones . . . . . . . . . . . . . . . 267 1.24.1 Multiplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267 1.24.2 Division . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 1.24.3 Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 1.25 Floating-point unit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 1.25.1 IEEE 754 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 1.25.2 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 1.25.3 ARM, MIPS, x86/x64 SIMD . . . . . . . . . . . . . . . . . . . . . . . . . 276 1.25.4 C/C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 1.25.5 Simple example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 1.25.6 Passing floating point numbers via arguments . . . . . . . . . . . . 288 1.25.7 Comparison example . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 1.25.8 Some constants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329 1.25.9 Copying. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 1.25.10 Stack, calculators and reverse Polish notation . . . . . . . . . . . 330 1.25.11 80 bits? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 1.25.12 x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 1.25.13 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 1.26 Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 1.26.1 Simple example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331 1.26.2 Buffer overflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340 1.26.3 Buffer overflow protection methods . . . . . . . . . . . . . . . . . . . 348 1.26.4 One more word about arrays . . . . . . . . . . . . . . . . . . . . . . . 353 1.26.5 Array of pointers to strings . . . . . . . . . . . . . . . . . . . . . . . . 354 1.26.6 Multidimensional arrays . . . . . . . . . . . . . . . . . . . . . . . . . . 363 1.26.7 Pack of strings as a two-dimensional array . . . . . . . . . . . . . . 373 1.26.8 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 1.26.9 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378 1.27 Example: a bug in Angband . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379 1.28 Manipulating specific bit(s) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382 1.28.1 Specific bit checking . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382 1.28.2 Setting and clearing specific bits . . . . . . . . . . . . . . . . . . . . 387 1.28.3 Shifts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397 1.28.4 Setting and clearing specific bits: FPU1 example . . . . . . . . . . 397 1.28.5 Counting bits set to 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403 1.28.6 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421 1.28.7 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424 1.29 Linear congruential generator. . . . . . . . . . . . . . . . . . . . . . . . . . . 424 1Floating-PointUnit Ifyounoticedatypo,errororhaveanysuggestions,donothesitatetodropmeanote: <[email protected]>. Thanks! vi 1.29.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425 1.29.2 x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426 1.29.3 32-bit ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427 1.29.4 MIPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 428 1.29.5 Thread-safe version of the example. . . . . . . . . . . . . . . . . . . 431 1.30 Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431 1.30.1 MSVC: SYSTEMTIME example . . . . . . . . . . . . . . . . . . . . . . . 431 1.30.2 Let’s allocate space for a structure using malloc() . . . . . . . . . 435 1.30.3 UNIX: struct tm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438 1.30.4 Fields packing in structure . . . . . . . . . . . . . . . . . . . . . . . . . 451 1.30.5 Nested structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460 1.30.6 Bit fields in a structure . . . . . . . . . . . . . . . . . . . . . . . . . . . 463 1.30.7 Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 1.31 The classic struct bug . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 1.32 Unions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473 1.32.1 Pseudo-random number generator example . . . . . . . . . . . . . 474 1.32.2 Calculating machine epsilon . . . . . . . . . . . . . . . . . . . . . . . 478 1.32.3 FSCALE instruction replacement . . . . . . . . . . . . . . . . . . . . . 480 1.32.4 Fast square root calculation . . . . . . . . . . . . . . . . . . . . . . . . 482 1.33 Pointers to functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483 1.33.1 MSVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 1.33.2 GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491 1.33.3 Danger of pointers to functions . . . . . . . . . . . . . . . . . . . . . 496 1.34 64-bit values in 32-bit environment . . . . . . . . . . . . . . . . . . . . . . . 497 1.34.1 Returning of 64-bit value. . . . . . . . . . . . . . . . . . . . . . . . . . 497 1.34.2 Arguments passing, addition, subtraction . . . . . . . . . . . . . . . 498 1.34.3 Multiplication, division . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 1.34.4 Shifting right . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 507 1.34.5 Converting 32-bit value into 64-bit one . . . . . . . . . . . . . . . . 508 1.35 LARGE_INTEGER structure case. . . . . . . . . . . . . . . . . . . . . . . . . . 510 1.36 SIMD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513 1.36.1 Vectorization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514 1.36.2 SIMD strlen() implementation . . . . . . . . . . . . . . . . . . . . . 527 1.37 64 bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531 1.37.1 x86-64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531 1.37.2 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540 1.37.3 Float point numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540 1.37.4 64-bit architecture criticism . . . . . . . . . . . . . . . . . . . . . . . . 540 1.38 Working with floating point numbers using SIMD. . . . . . . . . . . . . . . 541 1.38.1 Simple example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541 1.38.2 Passing floating point number via arguments . . . . . . . . . . . . 549 1.38.3 Comparison example . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550 1.38.4 Calculating machine epsilon: x64 and SIMD . . . . . . . . . . . . . 553 1.38.5 Pseudo-random number generator example revisited . . . . . . . 554 1.38.6 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554 1.39 ARM-specific details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555 1.39.1 Number sign (#) before number . . . . . . . . . . . . . . . . . . . . . 555 1.39.2 Addressing modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555 1.39.3 Loading a constant into a register . . . . . . . . . . . . . . . . . . . . 556 Ifyounoticedatypo,errororhaveanysuggestions,donothesitatetodropmeanote: <[email protected]>. Thanks! vii 1.39.4 Relocs in ARM64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 559 1.40 MIPS-specific details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561 1.40.1 Loading a 32-bit constant into register . . . . . . . . . . . . . . . . . 561 1.40.2 Further reading about MIPS . . . . . . . . . . . . . . . . . . . . . . . . 563 2 Important fundamentals 564 2.1 Integral datatypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564 2.1.1 Bit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564 2.1.2 Nibble AKA nybble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565 2.1.3 Byte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566 2.1.4 Wide char . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566 2.1.5 Signed integer vs unsigned . . . . . . . . . . . . . . . . . . . . . . . . . 567 2.1.6 Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567 2.1.7 Address register . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569 2.1.8 Numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569 2.2 Signed number representations . . . . . . . . . . . . . . . . . . . . . . . . . . 572 2.2.1 Using IMUL over MUL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574 2.2.2 Couple of additions about two’s complement form . . . . . . . . . . 575 2.2.3 -1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576 2.3 Integer overflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 576 2.4 AND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577 2.4.1 Checking if a value is on 2n boundary . . . . . . . . . . . . . . . . . . 577 2.4.2 KOI-8R Cyrillic encoding . . . . . . . . . . . . . . . . . . . . . . . . . . . 578 2.5 AND and OR as subtraction and addition . . . . . . . . . . . . . . . . . . . . 579 2.5.1 ZX Spectrum ROM text strings . . . . . . . . . . . . . . . . . . . . . . . 579 2.6 XOR (exclusive OR) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582 2.6.1 Logical difference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582 2.6.2 Everyday speech. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582 2.6.3 Encryption . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582 2.6.4 RAID24 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582 2.6.5 XOR swap algorithm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583 2.6.6 XOR linked list . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584 2.6.7 Switching value trick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584 2.6.8 Zobrist hashing / tabulation hashing . . . . . . . . . . . . . . . . . . . 585 2.6.9 By the way . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586 2.6.10 AND/OR/XOR as MOV . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586 2.7 Population count . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586 2.8 Endianness. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587 2.8.1 Big-endian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587 2.8.2 Little-endian. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587 2.8.3 Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 587 2.8.4 Bi-endian. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588 2.8.5 Converting data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 588 2.9 Memory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589 2.10 CPU. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589 2.10.1 Branch predictors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589 2.10.2 Data dependencies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590 2.11 Hash functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590 2RedundantArrayofIndependentDisks Ifyounoticedatypo,errororhaveanysuggestions,donothesitatetodropmeanote: <[email protected]>. Thanks! viii 2.11.1 How do one-way functions work? . . . . . . . . . . . . . . . . . . . . 590 3 Slightly more advanced examples 592 3.1 Zero register. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592 3.2 Double negation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596 3.3 const correctness . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597 3.3.1 Overlapping const strings . . . . . . . . . . . . . . . . . . . . . . . . . . 599 3.4 strstr() example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600 3.5 qsort() revisited. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601 3.6 Temperature converting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601 3.6.1 Integer values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602 3.6.2 Floating-point values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604 3.7 Fibonacci numbers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607 3.7.1 Example #1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607 3.7.2 Example #2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612 3.7.3 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615 3.8 CRC32 calculation example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616 3.9 Network address calculation example . . . . . . . . . . . . . . . . . . . . . . 620 3.9.1 calc_network_address() . . . . . . . . . . . . . . . . . . . . . . . . . . . 622 3.9.2 form_IP() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622 3.9.3 print_as_IP() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 624 3.9.4 form_netmask() and set_bit() . . . . . . . . . . . . . . . . . . . . . . . . 626 3.9.5 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627 3.10 Loops: several iterators. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627 3.10.1 Three iterators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628 3.10.2 Two iterators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628 3.10.3 Intel C++ 2011 case . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631 3.11 Duff’s device . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632 3.11.1 Should one use unrolled loops? . . . . . . . . . . . . . . . . . . . . . 636 3.12 Division using multiplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636 3.12.1 x86 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 636 3.12.2 How it works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638 3.12.3 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638 3.12.4 MIPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640 3.12.5 Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640 3.13 String to number conversion (atoi()) . . . . . . . . . . . . . . . . . . . . . . 641 3.13.1 Simple example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 641 3.13.2 A slightly advanced example . . . . . . . . . . . . . . . . . . . . . . . 645 3.13.3 Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649 3.14 Inline functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649 3.14.1 Strings and memory functions . . . . . . . . . . . . . . . . . . . . . . 650 3.15 C99 restrict. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 660 3.16 Branchless abs() function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663 3.16.1 Optimizing GCC 4.9.1 x64 . . . . . . . . . . . . . . . . . . . . . . . . . 664 3.16.2 Optimizing GCC 4.9 ARM64 . . . . . . . . . . . . . . . . . . . . . . . . 664 3.17 Variadic functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665 3.17.1 Computing arithmetic mean . . . . . . . . . . . . . . . . . . . . . . . 665 3.17.2 vprintf() function case . . . . . . . . . . . . . . . . . . . . . . . . . . . 670 3.17.3 Pin case. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672 Ifyounoticedatypo,errororhaveanysuggestions,donothesitatetodropmeanote: <[email protected]>. Thanks! ix 3.17.4 Format string exploit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672 3.18 Strings trimming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673 3.18.1 x64: Optimizing MSVC 2013 . . . . . . . . . . . . . . . . . . . . . . . 675 3.18.2 x64: Non-optimizing GCC 4.9.1 . . . . . . . . . . . . . . . . . . . . . 677 3.18.3 x64: Optimizing GCC 4.9.1 . . . . . . . . . . . . . . . . . . . . . . . . 678 3.18.4 ARM64: Non-optimizing GCC (Linaro) 4.9 . . . . . . . . . . . . . . . 679 3.18.5 ARM64: Optimizing GCC (Linaro) 4.9 . . . . . . . . . . . . . . . . . . 681 3.18.6 ARM: Optimizing Keil 6/2013 (ARM mode) . . . . . . . . . . . . . . . 682 3.18.7 ARM: Optimizing Keil 6/2013 (Thumb mode) . . . . . . . . . . . . . 682 3.18.8 MIPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683 3.19 toupper() function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685 3.19.1 x64 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686 3.19.2 ARM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688 3.19.3 Using bit operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689 3.19.4 Summary. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691 3.20 Obfuscation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691 3.20.1 Text strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691 3.20.2 Executable code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 692 3.20.3 Virtual machine / pseudo-code . . . . . . . . . . . . . . . . . . . . . . 696 3.20.4 Other things to mention . . . . . . . . . . . . . . . . . . . . . . . . . . 696 3.20.5 Exercise . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696 3.21 C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697 3.21.1 Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697 3.21.2 ostream. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 718 3.21.3 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 720 3.21.4 STL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721 3.21.5 Memory. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766 3.22 Negative array indices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767 3.22.1 Addressing string from the end. . . . . . . . . . . . . . . . . . . . . . 767 3.22.2 Addressing some kind of block from the end . . . . . . . . . . . . . 768 3.22.3 Arrays started at 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768 3.23 More about pointers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 771 3.23.1 Working with addresses instead of pointers. . . . . . . . . . . . . . 772 3.23.2 Passing values as pointers; tagged unions . . . . . . . . . . . . . . 775 3.23.3 Pointers abuse in Windows kernel . . . . . . . . . . . . . . . . . . . . 776 3.23.4 Null pointers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 782 3.23.5 Array as function argument . . . . . . . . . . . . . . . . . . . . . . . . 788 3.23.6 Pointer to a function. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 789 3.23.7 Pointer to a function: copy protection . . . . . . . . . . . . . . . . . 790 3.23.8 Pointer to a function: a common bug (or typo) . . . . . . . . . . . . 791 3.23.9 Pointer as object identificator . . . . . . . . . . . . . . . . . . . . . . . 791 3.23.10 Oracle RDBMS and a simple garbage collector for C/C++ . . . . 793 3.24 Loop optimizations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 794 3.24.1 Weird loop optimization . . . . . . . . . . . . . . . . . . . . . . . . . . 794 3.24.2 Another loop optimization . . . . . . . . . . . . . . . . . . . . . . . . . 796 3.25 More about structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 798 3.25.1 Sometimes a C structure can be used instead of array . . . . . . 798 3.25.2 Unsized array in C structure. . . . . . . . . . . . . . . . . . . . . . . . 800 3.25.3 Version of C structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . 801 Ifyounoticedatypo,errororhaveanysuggestions,donothesitatetodropmeanote: <[email protected]>. Thanks!

See more

The list of books you might like

Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.