Reverse Engineering cho người mới bắt đầu - Tác giả Dennis Yurichev & cộng đồng

Bài viết cung cấp hướng dẫn chi tiết về cách thực hiện và hoàn thiện luận văn tốt nghiệp cử nhân ngành Khoa học Máy tính. Từ việc lựa chọn đề tài, thu thập dữ

Chuyên ngành

Công nghệ thông tin

Người đăng

Ẩn danh

Thể loại

Sách

2016

1.3K
0
0

Phí lưu trữ

0 Point

Tóm tắt

I. Tổng quan về luận văn tốt nghiệp cử nhân khoa học công nghệ thông tin

Luận văn tốt nghiệp cử nhân khoa học công nghệ thông tin là công trình nghiên cứu tổng hợp, đánh giá năng lực chuyên môn của sinh viên sau quá trình đào tạo. Chủ đề liên quan đến kỹ thuật đảo ngược mã nguồn, phân tích mã độc hay bảo mật phần mềm ngày càng được quan tâm. Tài liệu Reverse Engineering for Beginners của Dennis Yurichev cung cấp nền tảng vững chắc về cách phân tích mã máy, hiểu cấu trúc hàm, stack frame và các kỹ năng cần thiết. Sinh viên có thể vận dụng kiến thức về CPU architecture, assembly language, buffer overflow để xây dựng luận văn chất lượng. Việc lựa chọn đúng chủ đề phù hợp với xu hướng công nghệ giúp tăng giá trị thực tiễn. Luận văn cần có cấu trúc rõ ràng: giới thiệu, tổng quan tài liệu, phương pháp nghiên cứu, thực nghiệm và kết luận. Các công cụ phổ biến như IDA Pro, Ghidra, OllyDbg hỗ trợ đắc lực cho quá trình phân tích ngược. Nghiên cứu về reverse engineering đòi hỏi tư duy logic, kiên nhẫn và hiểu biết sâu về hệ thống máy tính ở cấp độ thấp.

1.1. Định nghĩa và mục tiêu luận văn khoa học công nghệ thông tin

Luận văn tốt nghiệp cử nhân CNTT là sản phẩm nghiên cứu khoa học độc lập, thể hiện khả năng vận dụng lý thuyết vào thực tiễn. Mục tiêu chính bao gồm: giải quyết vấn đề cụ thể trong lĩnh vực công nghệ, xây dựng hệ thống hoặc đề xuất phương pháp mới. Với chủ đề reverse engineering, mục tiêu có thể là phân tích cơ chế hoạt động của phần mềm, phát hiện lỗ hổng bảo mật hoặc xây dựng công cụ hỗ trợ đảo ngược mã. Sinh viên cần chứng minh năng lực tư duy phân tích, kỹ năng lập trình và khả năng tổng hợp tài liệu chuyên ngành. Kết quả luận văn phải có tính ứng dụng thực tế, đóng góp cho cộng đồng học thuật hoặc doanh nghiệp.

1.2. Vai trò của kỹ thuật đảo ngược trong nghiên cứu công nghệ thông tin

Kỹ thuật đảo ngược đóng vai trò quan trọng trong nhiều lĩnh vực của công nghệ thông tin. Trong bảo mật, reverse engineering giúp phân tích mã độc, tìm hiểu cơ chế tấn công và phát triển phương pháp phòng chống. Kỹ thuật này cũng hỗ trợ kiểm thử phần mềm, phát hiện lỗi buffer overflow, format string vulnerabilities. Dennis Yurichev trình bày chi tiết cách thức CPU xử lý lệnh, quản lý bộ nhớ qua stack và heap. Kiến thức về function prologue, epilogue, register allocation là nền tảng để hiểu hoạt động nội bộ của chương trình. Nghiên cứu reverse engineering còn phục vụ tương thích ngược, phân tích firmware thiết bị IoT và bảo vệ sở hữu trí tuệ phần mềm.

II. Phân tích các kỹ thuật và thách thức trong đề tài luận văn

Nghiên cứu reverse engineering đòi hỏi sinh viên nắm vững nhiều kỹ thuật phức tạp. Phân tích tĩnh là quá trình kiểm tra mã nhị phân mà không thực thi chương trình, sử dụng disassembler để chuyển đổi machine code thành assembly. Phân tích động liên quan đến việc chạy chương trình trong môi trường kiểm soát, theo dõi sự thay đổi của thanh ghi, bộ nhớ và luồng thực thi. Thách thức lớn bao gồm: mã混淆 obfuscation, anti-debugging techniques, đa nền tảng kiến trúc CPU. Sinh viên cần hiểu rõ sự khác biệt giữa x86, ARM, MIPS instruction sets. Vấn đề thời gian là yếu tố quan trọng khi phân tích hệ thống lớn. Tài liệu Yurichev cung cấp ví dụ cụ thể về cách GCC compile code, cách optimizer thay đổi cấu trúc hàm. Việc hiểu compiler behavior giúp dự đoán chính xác mã assembly sinh ra từ source code. Sinh viên cũng phải đối mặt với giới hạn công cụ, yêu cầu cấu hình môi trường thí nghiệm phù hợp.

2.1. Các kỹ thuật phân tích tĩnh và động trong reverse engineering

Phân tích tĩnh sử dụng công cụ như IDA Pro, Ghidra để disassemble binary, xác định control flow graph, cross-reference và data structures. Kỹ thuật này an toàn vì không thực thi code, nhưng khó phát hiện hành vi runtime. Phân tích động dùng debugger như OllyDbg, x64dbg, GDB để set breakpoint, theo dõi register values, memory dumps. Kỹ thuật hooking cho phép intercept function calls, monitor API usage. Dynamic analysis phát hiện anti-debugging tricks, unpacking obfuscated code. Kết hợp cả hai phương pháp mang lại kết quả toàn diện. Sinh viên cần thành thạo đọc assembly code, hiểu calling conventions và stack layout để áp dụng hiệu quả các kỹ thuật này trong luận văn.

2.2. Thách thức về đa nền tảng và kỹ năng lập trình thấp cấp

Reverse engineering trên nhiều kiến trúc CPU là thách thức lớn cho sinh viên. Mỗi ISA có instruction set, register conventions, calling standards riêng biệt. ARM sử dụng load-store architecture với fixed-length 32-bit instructions. X86 có variable-length instructions từ 1 đến 15 bytes. MIPS dùng R-type, I-type, J-type instruction formats. Sinh viên phải hiểu rõ endianness, memory alignment, stack growth direction trên từng nền tảng. Kỹ năng lập trình assembly và C low-level programming là bắt buộc. Tài liệu Yurichev giải thích chi tiết cách compiler generate code cho từng architecture, giúp sinh viên so sánh và rút kinh nghiệm. Việc thiếu kinh nghiệm thực tế với embedded systems, firmware analysis cũng là rào cản cần vượt qua.

III. Giải pháp và phương pháp tiếp cận đề tài luận văn hiệu quả

Để xây dựng luận văn chất lượng về reverse engineering, sinh viên cần áp dụng phương pháp tiếp cận có hệ thống. Đầu tiên, xác định rõ vấn đề nghiên cứu: phân tích malware samples, audit software security hay develop automated analysis tools. Thứ hai, xây dựng môi trường thí nghiệm an toàn với virtual machines, sandbox environments để ngăn ngừa lây nhiễm. Thứ ba, áp dụng framework phân tích: từ static analysis sang dynamic analysis, kết hợp manual và automated approaches. Sử dụng scripting languages như Python với library pwntools, capstone engine tăng hiệu quả phân tích. Tài liệu Yurichev cung cấp case studies thực tế về buffer overflow exploits, format string attacks làm tài liệu tham khảo quý giá. Sinh viên nên tham gia cộng đồng reverse engineering, contribute open-source projects để tích lũy kinh nghiệm. Việc ghi chép chi tiết quá trình thí nghiệm, chụp screenshots, lưu log files đảm bảo tính tái lập của nghiên cứu.

3.1. Xây dựng môi trường thí nghiệm và lựa chọn công cụ phù hợp

Môi trường thí nghiệm reverse engineering cần được cô lập để đảm bảo an toàn. VirtualBox, VMware Workstation tạo sandbox cho malware analysis. Hệ điều hành mục tiêu nên chạy offline, snapshot thường xuyên để restore khi cần. Công cụ chính bao gồm: IDA Free/Pro cho disassembly, x64dbg cho debugging Windows, GDB với pwndbg extension cho Linux. Binary analysis frameworks như angr, Binary Ninja hỗ trợ automated reverse engineering. Compiler explorer (godbolt.org) giúp sinh viên quan sát compiler output trực tiếp. Tài liệu Yurichev nhấn mạnh tầm quan trọng của việc hiểu compiler optimization levels (-O0, -O1, -O2, -O3) ảnh hưởng thế nào đến generated code. Sinh viên nên document toàn bộ quy trình thiết lập môi trường trong methodology section của luận văn.

3.2. Quy trình nghiên cứu và thu thập dữ liệu thực nghiệm

Quy trình nghiên cứu reverse engineering đòi hỏi sự tỉ mỉ và có phương pháp. Bước một: thu thập samples từ nguồn đáng tin cậy như VirusTotal, MalwareBazaar hoặc open-source CTF challenges. Bước hai: thực hiện static analysis sơ bộ để xác định file type, entropy, strings embedded. Bước ba: tiến hành dynamic analysis trong sandbox, ghi lại API calls, network traffic, file system changes. Bước bốn: deep dive vào code paths quan trọng, phân tích algorithms, data structures. Tài liệu Yurichev cung cấp methodology chi tiết về cách trace function calls, identify loop patterns, recognize standard library functions. Mỗi finding cần được ghi nhận bằng evidence cụ thể, screenshot disassembly code với annotation rõ ràng. Quá trình này phải được lặp lại nhiều lần để đảm bảo tính chính xác và toàn diện của kết quả nghiên cứu.

IV. Kết luận và ứng dụng thực tiễn của đề tài luận văn

Luận văn tốt nghiệp về reverse engineering mang lại giá trị học thuật và thực tiễn cao cho sinh viên khoa học công nghệ thông tin. Kiến thức thu được giúp hiểu sâu hoạt động nội bộ của hệ thống phần mềm, từ đó nâng cao kỹ năng lập trình, debugging và security awareness. Ứng dụng thực tiễn bao gồm: phát triển công cụ phân tích malware tự động, xây dựng hệ thống phát hiện xâm nhập dựa trên behavioral analysis, hỗ trợ incident response trong doanh nghiệp. Reverse engineering cũng phục vụ mục đích hợp pháp như interoperability testing, legacy system maintenance, vulnerability research. Tài liệu của Dennis Yurichev là nguồn tham khảo uy tín, được cộng đồng quốc tế đánh giá cao dưới giấy phép Creative Commons. Sinh viên tốt nghiệp với đề tài này có lợi thế cạnh tranh lớn khi ứng tuyển vào vị trí security analyst, malware researcher hay penetration tester tại các tổ chức cybersecurity hàng đầu.

4.1. Tổng kết các đóng góp của luận văn cho lĩnh vực công nghệ thông tin

Luận văn reverse engineering đóng góp nhiều giá trị cho lĩnh vực CNTT. Về mặt học thuật, nghiên cứu cung cấp framework phân tích có thể tái sử dụng cho các đề tài liên quan. Về mặt kỹ thuật, kết quả bao gồm tools, scripts, methodologies giúp cộng đồng developer và security researcher làm việc hiệu quả hơn. Nghiên cứu về buffer overflow, heap exploitation từ tài liệu Yurichev giúp sinh viên hiểu rõ nguyên nhân và cách phòng chống vulnerabilities phổ biến. Báo cáo phân tích malware samples cung cấp intelligence cho threat hunting teams. Documentation chi tiết quá trình reverse engineering là tài liệu học tập quý giá cho sinh viên khóa sau. Đóng góp vào open-source projects cũng nâng cao uy tín chuyên môn của tác giả luận văn trong cộng đồng kỹ thuật.

4.2. Hướng phát triển tương lai và ứng dụng trong ngành cybersecurity

Lĩnh vực reverse engineering đang phát triển mạnh mẽ với nhiều hướng nghiên cứu mới. Machine learning và AI được áp dụng để automate malware classification, pattern recognition trong binary analysis. Cloud-based reverse engineering platforms giúp chia sẻ resources và collaborate hiệu quả hơn. IoT security là lĩnh vực tiềm năng khi số lượng thiết bị connected tăng nhanh, đòi hỏi firmware analysis capabilities. Automotive cybersecurity cũng cần chuyên gia reverse engineering để đảm bảo an toàn hệ thống điều khiển xe. Sinh viên có thể tiếp tục nghiên cứu sâu hơn về advanced exploitation techniques, kernel-level analysis, mobile application security. Các chứng chỉ chuyên ngành như GREM (GIAC Reverse Engineering Malware), OSCP tăng giá trị nghề nghiệp. Ngành cybersecurity tại Việt Nam đang thiếu nhân lực trầm trọng, tạo cơ hội việc làm rộng mở cho sinh viên tốt nghiệp với đề tài reverse engineering chất lượng.

21/04/2026

Trích đoạn nội dung tài liệu

This book is dedicated to Robert Jourdain, John Socha, Ralf Brown and Peter Abel 52 65 76 65 72 73 65 45 6e 67 69 6e 65 65 72 69 6e 67 66 6f 72 20 42 65 67 69 6e 6e 65 72 73 44 65 6e 6e 69 73 20 59 75 72 69 63 68 65 76 Reverse Engineering for Beginners Dennis Yurichev <dennis@yurichev.com> c ba ©2013-2016, Dennis Yurichev. This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4. To view a copy of this license, visit https://creativecommons.org/licenses/by-sa/4. The latest version (and Russian edition) of this text is accessible at beginners. The cover was made by Andy Nechaevsky: facebook. i Call for translators! You may want to help me with translating this work into languages other than English and Russian. Just send me any piece of translated text (no matter how short) and I’ll put it into my LaTeX source code. We already have something in German, French, a bit in Italian, Portuguese and Polish. 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: dennis@yurichev. ii Abridged contents 1 Code Patterns 1 2 Important fundamentals 490 3 Slightly more advanced examples 527 4 Java 761 5 Finding important/interesting stuff in the code 801 6 OS-specific 855 7 Tools 918 8 Case studies 928 9 Examples of reversing proprietary file formats 1083 10 Other things 1158 11 Books/blogs worth reading 1184 12 Communities 1188 Afterword 1190 Appendix 1193 Acronyms used 1231 Glossary 1236 Index 1238 iii CONTENTS Contents 1 Code Patterns 1 1.1 A short introduction to the CPU .3 Converting From One Radix To Another .3 An Empty Function .4 Empty Functions in Practice .3 GCC—one more thing .6 Function prologue and epilogue .1 Why does the stack grow backwards? .2 What is the stack used for? .3 A typical stack layout .4 Noise in stack .8 printf() with several arguments .5 By the way .10 Accessing passed arguments .11 More about results returning .1 Attempt to use the result of a function returning void .2 What if we do not use the function result? .1 Swap input values .2 Calculating absolute value .3 Ternary conditional operator .4 Getting minimal and maximal values .15 switch()/case/default .1 Small number of cases .2 A lot of cases .3 When there are several case statements in one block .2 Memory blocks copying routine .17 More about strings .2 Boundaries of strings .18 Replacing arithmetic instructions to other ones .19 Floating-point unit .3 ARM, MIPS, x86/x64 SIMD .6 Passing floating point numbers via arguments .10 Stack, calculators and reverse Polish notation .2 Buffer overflow .3 Buffer overflow protection methods .4 One more word about arrays .5 Array of pointers to strings .7 Pack of strings as a two-dimensional array .21 By the way .22 Manipulating specific bit(s) .1 Specific bit checking .2 Setting and clearing specific bits .4 Setting and clearing specific bits: FPU1 example .5 Counting bits set to 1 . 365 1 Floating-Point Unit v CONTENTS 1.5 Thread-safe version of the example .1 MSVC: SYSTEMTIME example .2 Let’s allocate space for a structure using malloc() .3 UNIX: struct tm .4 Fields packing in structure .6 Bit fields in a structure .1 Pseudo-random number generator example .2 Calculating machine epsilon .1 Fast square root calculation .27 Pointers to functions .3 Danger of pointers to functions .28 64-bit values in 32-bit environment .1 Returning of 64-bit value .2 Arguments passing, addition, subtraction .5 Converting 32-bit value into 64-bit one .2 SIMD strlen() implementation .3 Float point numbers .4 64-bit architecture criticism .31 Working with floating point numbers using SIMD .2 Passing floating point number via arguments .4 Calculating machine epsilon: x64 and SIMD .5 Pseudo-random number generator example revisited .32 ARM-specific details .1 Number sign (#) before number .3 Loading a constant into a register .4 Relocs in ARM64 .33 MIPS-specific details .1 Loading a 32-bit constant into register .2 Further reading about MIPS .2 Nibble AKA nybble .5 Signed integer vs unsigned .2 Signed number representations .1 Using IMUL over MUL .2 Couple of additions about two’s complement form .3 Integer overflow .1 Checking if a value is on 2n boundary .2 KOI-8R Cyrillic encoding .5 AND and OR as subtraction and addition .1 ZX Spectrum ROM text strings .4 XOR swap algorithm .5 XOR linked list .6 Zobrist hashing / tabulation hashing .7 By the way .8 AND/OR/XOR as MOV .1 How do one-way functions work? . 526 3 Slightly more advanced examples 527 3.2 Floating-point values .5 CRC32 calculation example .6 Network address calculation example .1 calc_network_address() .3 print_as_IP() .7 Loops: several iterators .1 Should one use unrolled loops? .9 Division using multiplication .2 How it works .10 String to number conversion (atoi()) . 574 2 Redundant Array of Independent Disks vii CONTENTS 3.2 A slightly advanced example .1 Strings and memory functions .13 Branchless abs() function .1 Computing arithmetic mean .2 vprintf() function case .4 Format string exploit .2 x64: Non-optimizing GCC 4.4 ARM64: Non-optimizing GCC (Linaro) 4.5 ARM64: Optimizing GCC (Linaro) 4.6 ARM: Optimizing Keil 6/2013 (ARM mode) .7 ARM: Optimizing Keil 6/2013 (Thumb mode) .3 Using bit operations .3 Virtual machine / pseudo-code .4 Other things to mention .19 Negative array indices .1 Addressing string from the end .2 Addressing some kind of block from the end .3 Arrays started at 1 .5 How it works .9 (32-bit ARM) Comparison of code density in Thumb and ARM modes .12 Difference from the real FAT12 .21 More about pointers .1 Working with addresses instead of pointers .2 Passing values as pointers; tagged unions .3 Pointers abuse in Windows kernel .5 Array as function argument .6 Pointer to function .7 Pointer as object identificator .1 Weird loop optimization .2 Another loop optimization .23 More about structures .1 Sometimes a C structure can be used instead of array .2 Unsized array in C structure .3 Version of C structure .4 High-score file in “Block out” game and primitive serialization .1 Anti-debugging trick .26 Other weird stack hacks .1 Accessing arguments/local variables of caller .3 Simple calculating functions .4 JVM3 memory model .5 Simple function calling .7 Linear congruential PRNG4 . 800 5 Finding important/interesting stuff in the code 801 5.1 Identification of executable files .6 Other known DLLs .2 Communication with outer world (function level) .3 Communication with the outer world (win32) .1 Often used functions in the Windows API .2 Extending trial period . 809 3 Java Virtual Machine 4 Pseudorandom Number Generator ix CONTENTS 5.3 Removing nag dialog box .4 tracer: Intercepting all functions in specific module .2 Finding strings in binary .3 Error/debug messages .4 Suspicious magic strings .5 Calls to assert() .3 Searching for constants .7 Finding the right instructions .8 Suspicious code patterns .2 Hand-written assembly code .9 Using magic numbers while tracing .1 Some binary file patterns .2 Memory “snapshots” comparing .1 Incorrectly disassembled code .2 Correctly disassembled code .12 Text strings right in the middle of compressed data .2 Order of functions in binary code .1 Arguments passing methods (calling conventions) .6 Return values of float and double type .8 Taking a pointer to function argument .2 Thread Local Storage .1 Linear congruential generator revisited .1 Position-independent code .2 LD_PRELOAD hack in Linux .4 Windows NT: Critical section .3 Patch comparison/diffing .2 Library calls tracing .3 System calls tracing . 922 5 Instruction Set Architecture x CONTENTS 7.4 Network sniffing .4 Do You Think Something Is Missing Here? .1 Task manager practical joke (Windows Vista) .1 Using LEA to load values .2 Color Lines game practical joke .1 Finding grid automatically .4 Hacking Windows clock .1 Example #1: MacOS Classic and PowerPC .2 Example #2: SCO OpenServer .3 Example #3: MS-DOS .6 “QR9”: Rubik’s cube inspired amateur crypto-algorithm .7 Encrypted database case #1 .1 Base64 and entropy .2 Is data compressed? .3 Is data encrypted? .5 Cipher Feedback mode .7 Structure of the buffer .8 Noise at the end .10 Post Scriptum: brute-forcing IV6 .8 Overclocking Cointerra Bitcoin miner .9 Breaking simple executable cryptor .1 Other ideas to consider .1 About SAP client network traffic compression .0 password checking functions .1 V$VERSION table in the Oracle RDBMS .2 X$KSMLRU table in Oracle RDBMS .3 V$TIMER table in Oracle RDBMS .12 Handwritten assembly code .1 EICAR test file .1082 9 Examples of reversing proprietary file formats 1083 9.1 Primitive XOR-encryption .1 Simplest ever XOR encryption .2 Norton Guide: simplest possible 1-byte XOR encryption .3 Simplest possible 4-byte XOR encryption .4 Simple encryption using XOR mask .5 Simple encryption using XOR mask, case II .1 Analyzing entropy in Mathematica .4 A word about primitive encryption like XORing .5 More about entropy of executable code .1117 6 Initialization Vector xi CONTENTS 9.8 Entropy of various files .9 Making lower level of entropy .3 Millenium game save file .4 fortune program indexing file .1 Executable files patching .2 Function arguments number statistics .7 Basic blocks reordering .1 Profile-guided optimization .8 My experience with Hex-Rays 2.6 Long and messed expressions .1183 11 Books/blogs worth reading 1184 11.1 Books and other materials .9 Programming in general .2 General purpose registers .4 Some GCC library functions .5 Some MSVC library functions .1228 Acronyms used 1231 Glossary 1236 Index 1238 xiii CONTENTS Preface There are several popular meanings of the term “reverse engineering”: 1) The reverse engineering of software; researching compiled programs 2) The scanning of 3D structures and the subsequent digital manipulation required in order to duplicate them 3) Recreating DBMS7 structure This book is about the first meaning. Prerequisites Basic knowledge of the C PL8 . Exercises and tasks …can be found at: http://challenges. About the author Dennis Yurichev is an experienced reverse engineer and programmer. He can be contacted by email: dennis@yurichev. Praise forReverse Engineering for Beginners • “Now that Dennis Yurichev has made this book free (libre), it is a contribution to the world of free knowledge and free education. Stallman, GNU founder, software freedom activist. • “It’s very well done . and for free .”9 Daniel Bilar, Siege Technologies, LLC. excellent and free”10 Pete Finnigan, Oracle RDBMS security guru. [the] book is interesting, great job!” Michael Sikorski, author of Practical Malware Analysis: The Hands-On Guide to Dissecting Malicious Software. my compliments for the very nice tutorial!” Herbert Bos, full professor at the Vrije Universiteit Amsterdam, co-author of Modern Operating Systems (4th Edition). It is amazing and unbelievable.” Luis Rocha, CISSP / ISSAP, Technical Manager, Network & Infor- mation Security at Verizon Business. • “Thanks for the great work and your book.” Joris van de Vis, SAP Netweaver & Security specialist. 7 Database Management Systems 8 Programming Language 9 twitter.com/daniel_bilar/status/436578617221742593 10 twitter.com/petefinnigan/status/400551705797869568 xiv CONTENTS • “. [a] reasonable intro to some of the techniques.”11 Mike Stay, teacher at the Federal Law Enforcement Training Center, Georgia, US. • “I love this book! I have several students reading it at the moment, [and] plan to use it in graduate course.”12 Sergey Bratus , Research Assistant Professor at the Computer Science Department at Dartmouth College • “Dennis @Yurichev has published an impressive (and free!) book on reverse engineering”13 Tanel Poder, Oracle RDBMS performance tuning expert . • “This book is a kind of Wikipedia to beginners.” Archer, Chinese Translator, IT Security Researcher. • “[A] first-class reference for people wanting to learn reverse engineering. And it’s free for all.” Mikko Hyppönen, F-Secure. Thanks For patiently answering all my questions: Andrey “herm1t” Baranovich, Slava “Avid” Kazakov, SkullC0DEr.

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ