مهندسی معکوس برای مبتدیها
به جرات میتوان گفت که مهندسی معکوس، مهمترین و سختترین فیلد در امنیت است. به دلیل دانش بالایی که برای یادگیری این تخصص نیاز است متاسفانه نمیتوان کتابی از پایه نوشت که تمام مفاهیم را دربرگیرید؛ اما نویسنده اصلی این کتاب تلاش کرده است که از ابتدا این تکنیک را برای شما شرح دهد. نکته مهم در مورد این کتاب این است که رایگان بوده و روز به روز به مفاهیم آن افزوده میشود و با کمی جستوجو در اینترنت متوجه خواهید شد که نخستین کتابی است که تمام متخصصان امنیت به شما پیشنهاد میکنند. نویسنده در این کتاب با انجام آزمایشهای عملی مانند شکستن قفل دانگل یا دستکاری کردن برنامهها و بازیها، این تکنیک را برای شما جالب و یا شاید هم اشتیاق شما را برای یادگیری آن بیشتر کرده است. در این کتاب مثالهای زیادی را خواهید دید و حتی یک وبسایت مجزا هم به تمرینهای کتاب اختصاص داده شده است. گفتنی است که این کتاب با اخذ مجوز رسمی از نویسنده، ترجمه شده است.
Hack , امنيت , مهندسي معكوس , شبکه و امنیت
نوبت چاپ | one |
---|---|
ویرایش | one |
وزن | 2000 گرم |
جلد | 1 از 1 |
موجود است؟ | بلی |
---|---|
چاپ شده است؟ | بلی |
در حال پیش فروش است؟ | خیر |
کتاب الکترونیکی است؟ | خیر |
بخش نخست؛ الگوهای کد 7
فصل 1؛ مقدمهای کوتاه برای CPU 9
واژهنامهی کوتاه 9
1-1 چند واژه دربارهی ISAهای گوناگون 10
فصل 2؛ سادهترین تابع 11
1-2 x86 11
2-2 ARM 11
3-2 MIPS 12
فصل 3؛ سلام دنیا! 13
1-3 x86 13
2-3 x86-64 18
3-3 GCC – یک چیز بیشتر 20
4-3 ARM 22
اطلاعات بیشتر دربارهی توابع thunk 28
5-3 MIPS 31
6-3 نتیجه 38
7-3 تمرینها 38
فصل 4؛ آغاز و پایان تابع 39
1-4 بازگشتی 39
فصل 5؛ پشته 41
1-5 چرا پشتهی وارونه افزایش پیدا میکند؟ 41
2-5 پشته برای چه چیزی استفاده میشود؟ 42
3-5 طرح نمونه پشته 48
4-5 نویز در پشته 48
5-5 تمرینها 51
فصل 6؛ Printf() با چندین آرگومان 55
1-6 x86 55
2-6 ARM 67
3-6 MIPS 75
4-6 نتیجهگیری 83
5-6 نکته تکمیلی 84
فصل 7؛ Scanf() 87
1-7 نمونهی ساده 87
MSVC 88
2-7 متغیرهای سراسری 98
مقداردهی متغیر سراسری 107
3-7 چک کردن نتیجهی scanf() 109
4-7 تمرینها 122
فصل 8؛ دسترسی به آرگومانهای انتقال داده شده 123
1- 8x86 123
2-8 x64 126
3-8 ARM 130
4-8 MIPS 134
فصل 9؛ اطلاعات بیشتر دربارهی بازگشت نتایج 137
1-9 تلاش برای استفاده از نتیجهی یک تابع که void را برمیگرداند 137
2-9 اگر از نتیجهی تابع استفاده نکنیم چه میشود؟ 138
3-9 بازگشت یک ساختار 139
فصل 10؛ اشارهگرها 141
1-10 نمونه مربوط به متغیرهای سراسری 141
2-10 نمونه مربوط به متغیرهای محلی 144
3-10 نتیجه 147
فصل 11؛ عملگر GOTO 149
1-11 کد مرده 151
2-11 تمرین 151
فصل 12؛ پرشهای شرطی 153
1-12 نمونهی ساده 153
x86 + MSVC + OllyDbg 156
x86 + MSVC + Hiew 159
2-12 محاسبهی مقدار واقعی یک عدد 170
3-12 عملگر شرطی سه تایی 173
4-12 گرفتن مقادیر بیشینه و کمینه 177
5-12 نتیجهگیری 183
6-12 تمرین 185
فصل 13؛ SWITCH()/CASE/DEFAULT 187
1-13 شمار کمی از caseها 187
OllyDbg 190
13-13 ARM: Keil 6/2013 بهینهسازی شده (حالت Thumb) 195
2-13 شمار بسیاری case 199
3-13 هنگامی که چندین دستور case در یک بلوک وجود دارد 211
4-13 رها کردن 217
5-13 تمرین 219
فصل 14؛ حلقهها 221
1-14 یک نمونهی ساده 221
2-14 کپی عادی بلاکهای حافظه 233
3-14 نتیجه 237
4-14 تمرینها 239
فصل 15؛ پردازش رشتههای ساده در C 245
1-15 strlen() 245
ARM64 253
2-15 تمرینها 255
فصل 16؛ جایگزین کردن دستورهای ریاضی با دستورهای دیگر 259
1-16 ضرب 259
2-16 تقسیم 265
3-16 تمرینها 267
فصل 17؛ قسمت نقطهی اعشار 269
1-17 IEEE 754 269
2-17 x86 269
3-17 ARM, MIPS, x86/x64 SIMD 269
4-17 C\C++ 270
5-17 نمونهی ساده 270
6-17 رد کردن اعداد با ممیز شناور بهوسیلهی آرگومان 281
7-17 نمونهی مربوط به مقایسه 285
8-17 پشته، ماشین حساب و نشانهگذاری معکوس لهستانی 314
9-17 x64 314
10-17 تمرینها 314
فصل ۱۸؛ آرایهها 317
1-18 نمونهی ساده 317
2-18 سرریز بافر 326
3-18 روشهای حفاظت از سرریز بافر 333
4-18 یک واژهی بیشتر دربارهی آرایه 337
5-18 آرایهای از اشارهگرها به رشته 338
6-18 آرایههای چند بعدی 347
7-18 بستهبندی یک رشته بهعنوان یک آرایهی دوبعدی 356
8-18 نتیجهگیری 361
9-18 تمرینها 361
فصل ۱۹؛ دستکاری بیتهای ویژه 379
1-19 بررسی بیت ویژه 379
2-19 تنظیم و پاکسازی بیتهای ویژه 384
3-19 شیفت 392
4-19 تنظیم و پاک کردن بیتهای ویژه: مثال FPU 392
5-19 شمارش بیتهایی که به یک تنظیم شدهاند 399
GCC 4.8.2 بهینهسازی نشده 406
6-19 نتیجه 414
7-19 تمرینها 416
فصل ۲۰؛ تولیدکنندهی همجنس خطی به تولیدکنندهی عدد شبه تصادفی 425
1-20 x86 426
2-20 x64 427
3-20 ARM۳۲ بیتی 428
4-20 MIPS 429
5-20 نسخهی نخکشی شدهی امن از نمونه 431
فصل ۲۱؛ ساختار 433
1-21 MSVC: مثال SYSTEMTIME 433
2-21 تخصیص فضا به ساختار بهکمک malloc() 437
3-21UNIX : struct tm 440
4-21 Field packing در ساختار 453
OllyDbg+ فیلدهای ترازشده بر روی مرز ۱ بایتی 457
5-21 ساختارهای تودرتو 461
6-21 فیلدهای بیت در یک ساختار 464
MSVC 465
MSVC + OllyDbg 467
GCC 468
7-21 تمرینها 473
فصل ۲۲؛ اتحاد 479
1-22 نمونهی مربوط به تولیدکنندهی اعداد تصادفی 479
1-1-22 x86 481
2-22 ماشین حساب اپسیلون 485
3-22 محاسبهی سریع ریشهی دوم 488
فصل ۲۳؛ اشارهگر به تابع 489
1-23 MSVC 490
2-23 GCC 496
فصل ۲۴؛ مقادیر ۶۴ بیتی در محیط ۳۲ بیتی 503
1-24 بازگشت مقدار ۶۴ بیتی 503
2-24 رد کردن، جمع، تفریق آرگومانها 504
3-24 ضرب، تقسیم 509
4-24 شیفت به راست 513
5-24 تبدیل مقدار ۳۲ بیتی به ۶۴ بیتی آن 515
فصل ۲۵؛ SIMD 517
1-25 بردارسازی 518
Intel C++ 519
2-25 پیادهسازی strlen() از نوع SIMD 530
فصل ۲۶؛ ۶۴ بیت 535
1-26 x86-64 535
2-26 ARM 544
3-26 اعداد ممیز شناور 544
فصل ۲۷؛ کار کردن با اعداد ممیز شناور با استفاده از SIMD 545
1-27 نمونهی ساده 545
2-27 انتقال عدد با ممیز شناور به وسیلهی آرگومانها 550
3-27 نمونهی مربوط به مقایسه 552
4-27 ماشین حساب اپسیلون x64 و SIMD 554
5-27 بررسی دوبارهی نمونهی مربوط به تولیدکنندهی اعداد شبهتصادفی 555
6-27 خلاصه 556
فصل ۲۸؛ جزئیات مختص ARM 557
1-28 نشانهی شماره (#) پیش از عدد 557
2-28 آدرسدهی حالت 557
3-28 بارگذاری یک ثبات در یک ثبات 558
4-28 Relocs در ARM64 560
فصل ۲۹؛ جزئیات مخصوص MIPS 563
1-29 بارگذاری ثباتها در ثبات 563
2-29 مطالعهی بیشتر دربارهی MIPS 563
بخش 2؛ اصول مهم 565
فصل ۳۰؛ نمایش عدد علامتدار 567
فصل ۳۱؛ ENDIANNESS 569
1-31 Big-endian 569
2-31 Little-endian 569
3-31 مثال 569
4-31 Bi-endian 570
5-31 تبدیل دادهها 570
فصل ۳۲؛ حافظه 571
فصل ۳۳؛ CPU 573
1-33 پیشبینی شاخه 573
2-33 وابستگی داده 573
فصل ۳۴؛ توابع هش 575
1-34 چگونه تابع یکطرفه کار میکند؟ 575
بخش 3؛ نمونههای پیشرفتهتر 577
فصل ۳۵؛ تبدیل دما 579
1-35 مقادیر از نوع عدد صحیح 579
2-35 مقادیر اعشاری 582
فصل ۳۶؛ اعداد فیبوناچی 585
1-36 مثال 1 585
2-36 مثال ۲ 588
3-36 خلاصه 591
فصل ۳۷؛ نمونهی محاسبه CRC32 593
فصل ۳۸؛ نمونهی محاسبهی آدرس شبکه 599
1-38 calc_network_address() 601
2-38 form_IP() 602
3-38 print_as_IP() 604
4-38 form_netmask()یا set_bit() 605
5-38 خلاصه 606
فصل ۳۹؛ حلقهها: تکرار بسیار 607
1-39 سه تکرارکننده 607
2-39 دو تکرارکننده 608
3-39 Intel C++ 2011 610
فصل ۴۰؛ دستگاه DUFF’S 613
فصل ۴۱؛ تقسیم بر ۹ 617
1-41 x86 617
2-41 ARM 618
3-41 MIPS 620
4-41 چگونه کار میکند؟ 621
5-41 گرفتن مقسوم علیه 623
6-41 تمرین ۱ 624
فصل ۴۲؛ تبدیل رشته به عدد (ATOI()) 627
1-42 نمونهی ساده 627
1-1-42 MSVC 2013 x64 بهینهسازی شده 628
2-42 یک نمونهی پیشرفته 631
3-42 تمرین 635
فصل ۴۳؛ توابع درون برنامهای 637
1-43 رشتهها و توابع حافظه 638
فصل ۴۴؛ محدود کردن C99 649
فصل ۴۵؛ تابع بدون شاخه ABS() 653
1-45 GCC 4.9.1 x64 بهینهسازی شده 653
2-45 GCC 4.9 ARM64 بهینهسازی شده 654
فصل ۴۶؛ توابع VARIADIC 655
1-46 محاسبهی میانگین حسابی 655
2-46 تابع vprintf() 659
فصل ۴۷؛ اصلاح رشته 661
1-47 x64: MSVC 2013 بهینهسازی شده 662
2-47 x64: GCC 4.9.1 بهینهسازی نشده 664
3-47 x64: GCC 4.9.1 بهینهسازی شده 666
4-47 ARM64: GCC (Linaro) 4.9 بهینهسازی نشده 667
5-47 ARM64: GCC (Linaro) 4.9 بهینهسازی شده 669
6-47 ARM: Keil 6/2013 بهینهسازی شده (حالت ARM) 670
7-47 ARM: Keil 6/2013 بهینهسازی شده (حالت Thumb) 670
8-47 MIPS 671
فصل ۴۸؛ تابع TOUPPER() 673
1-48 x64 673
2-48 ARM 675
3-48 خلاصه 676
فصل ۴۹؛ کد به اشتباه DISASSEMBLE شده 677
1-49 disassemble کردن، از یک آغاز اشتباه (x86) 677
2-49 چگونه اختلالات، تصادفی disassemble شده به نظر میرسند؟ 678
فصل ۵۰؛ ایجاد ابهام 683
1-50 رشتههای متنی 683
2-50 کد اجرایی 684
3-50 ماشین مجازی / شبه کد 686
4-50 چیزهای دیگر برای یادآوری 686
5-50 تمرینها 686
فصل ۵۱؛ C++ 687
1-51 کلاسها 687
MSVC—x86 688
MSVC—x86-64 691
2-51 ostream 709
3-51 ارجاع 710
4-51 STL 711
فصل ۵۲؛ شاخصهای منفی آرایه 757
فصل ۵۳؛ ویندوز ۱۶ بیتی 761
1-53 مثال 1 761
2-53 مثال2 762
3-53 مثال 3 763
4-53 مثال 4 764
5-53 مثال 5 767
6-53 مثال 6 772
بخش 4؛ JAVA 777
فصل ۵۴؛ جاوا 779
1-54 مقدمه 779
2-54 برگرداندن مقدار 780
3-54 توابع محاسبهی ساده 785
4-54 مدل حافظه JVM 788
5-54 فراخوانی تابع ساده 789
6-54 فراخوانی beep() 791
7-54 تولیدکنندهی اعداد شبه تصادفی خطی و همجنس 792
8-54 پرشهای شرطی 793
9-54 رد کردن آرگومانها 796
10-54 Bitfields 797
11-54 حلقهها 799
12-54 switch() 802
13-54 آرایهها 803
14-54 رشتهها 814
15-54 استثنا 817
16-54 کلاسها 822
17-54 وصلهی ساده 824
18-54 خلاصه 830
بخش 5؛ پیدا کردن چیزهای مهم/جالب در کد 831
فصل ۵۵؛ شناسایی فایلهای اجرایی 833
1-55 Microsoft Visual C++ 833
1-1-55 نام تزئینی 834
2-2-55 Cygwin 834
3-2-55 MinGW 834
3-55 Intel FORTRAN 834
4-55 Watcom, OpenWatcom 834
1-4-55 نام تزئینی 834
۵۵.۵ Borland 834
1-5-55 Delphi 835
6-55 دیگر DLLهای شناخته شده 837
فصل ۵۶؛ ارتباط با جهان بیرون (WIN32) 839
1-56 توابعی که اغلب در Windows API استفاده میشوند 839
2-56 tracer : متوقف کردن تمام توابع در ماژول خاص 840
فصل ۵۷؛ رشتهها 843
1-57 رشتههای متنی 843
1-1-57 C\C++ 843
2-1-57 Borland Delphi 844
3-1-57 Unicode 844
UTF-8 844
UTF-16LE 845
4-1-57 Base64 847
2-57 پیامهای خطا/اشکالیابی 848
3-57 رشتههای ورودی مشکوک 848
فصل ۵۸؛ فراخوانی ASSERT() 849
فصل ۵۹؛ ثابتها 851
1-59 اعداد ورودی 852
1-1-59 DHCP 852
2-59 جستوجو برای ثابتها 853
فصل ۶۰؛ پیدا کردن دستورات درست 855
فصل ۶۱؛ الگوهای مشکوک کد 857
1-61 دستورات XOR 857
2-61 کد اسمبلی با دست نوشته شده 857
فصل ۶۲؛ استفاده از اعداد ورودی در هنگام ردیابی 859
فصل ۶۳؛ چیزهای دیگر 861
1-63 ایده کلی 861
2-63 C++ 861
3-63 برخی از الگوهای فایل باینری 861
4-63 مقایسه ”اسنپ شاتهای” حافظه 862
1-4-63 رجیستری ویندوز 863
2-4-63 Blink-comparator 863
بخش 6؛ ویژهی سیستم عامل 865
فصل ۶۴؛ روشهای رد کردن آرگومان (قراردادهای فراخوانی) 867
1- 64 cdecl 867
2-64 stdcall 867
1-2-64 توابع با تعداد آرگومانهای متغیر 868
3-64 fastcall 869
1-3-64 GCC regparm 870
2-3-64 Watcom/OpenWatcom 870
4-4-64 thiscall 870
5-64 x86-64 871
1-5-64 Windows x64 871
Windows x64: رد کردن this (در C\C++) 873
2-5-64 Linux x64 874
6-64 بازگشت مقادیر از نوع float و double 874
7-64 اصلاح آرگومانها 875
8-64 گرفتن یک اشاره گر به آرگومان تابع 876
فصل 65؛ نخکشی ذخیرهساز محلی 879
1-65 بازبینی تولید کننده هم جنس خطی 879
1-1-65 Win32 880
2-1-65 لینوکس 885
فصل ۶۶؛ فراخوانی سیستم (SYSCALL-S) 887
1-66 لینوکس 887
2-66 ویندوز 888
فصل ۶۷؛ لینوکس 889
1-67 کد مستقل از موقعیت 889
1-1-67 ویندوز 892
2-67 هک LD_PRELOAD در لینوکس 893
فصل ۶۸؛ WINDOWS NT 897
1-68 CRT (win32) 897
2-68 Win32 PE 901
3-68 Windows SEH 911
4-68: Windows NT بخش Critical 939
بخش 7؛ ابزارها 943
فصل ۶۹؛ DISASSEMBLER 945
1-69 IDA 945
فصل ۷۰؛ دیباگر 947
1-70 OllyDbg 947
2-70 GDB 947
3-70 tracer 947
فصل ۷۱؛ ردیابی SYSTEM CALL 949
1-71 strace / dtruss 949
فصل ۷۲؛ DECOMPILER 951
فصل ۷۳؛ ابزارهای دیگر 953
بخش 8؛ نمونههایی از تمرینهای مهندسی معکوس در دنیای واقعی 955
فصل ۷۴؛ شوخی عملی با TASK MANAGER (WINDOWS VISTA) 957
1-74 استفاده از LEA برای بارگذاری مقادیر 961
فصل ۷۵؛ شوخی عملی با بازی COLOR LINES 963
فصل ۷۶؛ MINESWEEPER (WINDOWS XP) 967
1-76 تمرینها 973
فصل ۷۷؛ DECOMPILE دستی + حلکننده Z3 SMT 975
1-77 decompile دستی 975
2-77 استفاده از حلکنندهی Z3 SMT 980
فصل ۷۸؛ دانگلها 987
1-78 مثال ۱ : MacOS Classic و PowerPC 987
2-78 مثال ۲: SCO OpenServer 996
3-78 مثال ۳: MS-DOS 1010
فصل ۷۹؛ “QR9”: مکعب روبیک الهام گرفته از یک الگوریتم رمزنگاری آماتور 1019
فصل ۸۰؛ SAP 1059
1-80 دربارهی سرویسگیرنده فشردهسازی ترافیک شبکه SAP 1059
2-80 تابع بررسی گذرواژه در SAP 6.0 1074
فصل ۸۱؛ ORACLE RDBMS 1081
1-81 جدول V$VERSION در Oracle RDBMS 1081
2-81 جدول X$KSMLRU در Oracle RDBMS 1091
3-81 جدول V$TIMER در Oracle RDBMS 1094
فصل ۸۲؛ کد اسمبلی که دستی نوشته شده است 1099
1-82 فایل تست EICAR 1099
فصل ۸۳؛ DEMOS 1101
1-83 10 PRINT CHR$(205.5+RND(1)); : GOTO 10 1101
2-83 مجموعهی مندلبرو 1105
بخش 9؛ نمونههایی از معکوس کردن قالبهای اختصاصی فایل 1117
فصل ۸۴؛ رمزگذاری XOR آغازین 1119
1-84 راهنمای نورتون؛ سادهترین رمزگذاری XOR یک بایتی شدنی 1119
2-84 سادهترین رمزگذاری ۴ بایتی شدنی XOR 1121
فصل ۸۵؛ فایل ذخیره کردن مربوط به بازی MILLENIUM 1125
فصل ۸۶؛ ORACLE RDBMS : فایلهای .SYM 1131
فصل ۸۷؛ ORACLE RDBMS : فایلهای .MSB 1141
1-87 خلاصه 1145
بخش 10؛ مطالب دیگر 1147
فصل ۸۸؛ NPAD 1149
فصل ۸۹؛ وصله کردن فایلهای اجرایی 1151
1-89 رشتههای متنی 1151
2-89 کد x86 1151
فصل ۹۰؛ کامپایلر درونی 1153
فصل ۹۱؛ ناهنجاری کامپایلر 1155
فصل ۹۲؛ OPENMP 1157
1-92 MSVC 1159
2-92 GCC 1162
فصل ۹۳؛ ITANIUM 1165
فصل ۹۴؛ مدل حافظهی 8086 1169
فصل ۹۵؛ مرتبسازی دوبارهی بلوکهای اساسی 1171
1-95 بهینهسازی Profile-guided 1171
بخش 11؛ کتابها/بلاگها که ارزش خواندن دارند 1173
فصل ۹۶؛ کتابها 1175
1-96 ویندوز 1175
2-96 C\C++ 1175
3-96 x86 / x86-64 1175
4-96 ARM 1175
5-96 رمزنگاری 1176
فصل ۹۷؛ بلاگها 1177
1-97 ویندوز 1177
فصل ۹۸؛ سایر مراجع 1179
فصل ۹۹؛ پرسش 1181
پیوست A؛ X86 1183
A-1 اصطلاحات 1183
A-2 ثباتهای همه منظوره 1183
A-2-1 RAX/EAX/AX/AL 1184
A-2-2 RBX/EBX/BX/BL 1184
A-2-3 RCX/ECX/CX/CL 1184
R8/R8D/R8W/R8L A.2.7 1185
R9/R9D/R9W/R9L A.2.8 1186
R10/R10D/R10W/R10L A.2.9 1186
R11/R11D/R11W/R11L A.2.10 1186
R14/R14D/R14W/R14L A.2.13 1187
RIP/EIP/IP A.2.17 1188
A.2.19 ثبات پرچم 1188
A.3 ثبات FPU 1190
A.3.1 کلمهی کنترلی 1190
A.3.2 وضعیت واژه 1191
A.3.3 برچسب واژه 1192
A.4 ثباتهای SIMD 1193
A.4.1 ثباتهای MMX 1193
A.4.2 ثباتهایSSE و AVX 1193
A.5 ثباتهای اشکالیابی 1193
A.5.1 DR6 1194
A.5.2 DR7 1194
A.6 دستورها 1196
A.6.1 پیشوندها 1196
A.6.2 دستورهایی که بیشتر استفاده میشوند 1197
A.6.3 دستورهایی که کمتر استفاده میشوند 1205
A.6.4 دستور FPU 1212
A.6.5 دستورهایی که آپکد ASCII قابل چاپ دارند 1215
پیوست B؛ ARM 1217
B.1 اصطلاحات 1217
B.2 نسخه 1217
B.3 32-bit ARM (AArch32) 1218
B.4 64-bit ARM (AArch64) 1220
B.5 دستورها 1221
پیوست C؛ MIPS 1223
C.1 ثباتها 1223
C.2 دستورها 1224
پیوست D؛ برخی توابع کتابخانهای GCC 1227
پیوست E؛ برخی توابع کتابخانهای MSVC 1229
پیوست F؛ CHEATSHEET 1231
F.2 OllyDbg 1232
F.3 MSVC 1232
F.4 GCC 1233
F.5 GDB 1233
کلمات اختصاری استفاده شده 1237
واژه نامه 1243
# | موضوع | عنوان | توضیح | دانلود |
---|---|---|---|---|
1 | نمونه pdf | صفحات آغازین کتاب | دانلود |
امتیاز
ثبت نظر/پرسش/پیشنهاد
کتابهای مرتبط
احتمالا دوست داشته باشید