Python is a versatile programming language.

پائیتھن ایک ورسٹائل پروگرامنگ زبان ہے۔


Hackers often use Python for its powerful libraries.

ہیکرز اکثر اپنی طاقتور لائبریریوں کی وجہ سے پائیتھن کا استعمال کرتے ہیں۔


The book explains how to use Python for security tasks.

کتاب میں بتایا گیا ہے کہ سیکیورٹی کے کاموں کے لیے پائیتھن کا استعمال کیسے کریں۔


You can automate many reversing and security tasks with Python.

آپ پائیتھن کے ساتھ بہت سے الٹنے اور سیکیورٹی کے کاموں کو خودکار بنا سکتے ہیں۔


Building your own debugger is a complex task.

اپنا ڈیبگر بنانا ایک پیچیدہ کام ہے۔


Fuzzing Windows drivers can reveal vulnerabilities.

ونڈوز ڈرائیوروں کو فزنگ کرنے سے کمزوریاں ظاہر ہو سکتی ہیں۔


The author is a senior security researcher.

مصنف ایک سینئر سیکیورٹی محقق ہے۔


بہترین ہیکرز پائیتھن کا استعمال کرتے ہیں۔


This book is for those interested in hacking.

یہ کتاب ان لوگوں کے لیے ہے جو ہیکنگ میں دلچسپی رکھتے ہیں۔


The book covers various hacking techniques.

کتاب میں ہیکنگ کی مختلف تکنیکوں کا احاطہ کیا گیا ہے۔


Learn how to write your own security tools.

اپنے سیکیورٹی ٹولز لکھنا سیکھیں۔


کتاب عملی مثالیں فراہم کرتی ہے۔


The author explains complex concepts clearly.

مصنف پیچیدہ تصورات کو واضح طور پر بیان کرتا ہے۔


You will learn about debuggers and fuzzers.

آپ ڈیبگرز اور فزرز کے بارے میں جانیں گے۔


The book is a valuable resource for security professionals.

یہ کتاب سیکیورٹی پیشہ ور افراد کے لیے ایک قیمتی وسیلہ ہے۔


Explore the world of reverse engineering.

ریورس انجینئرنگ کی دنیا کو دریافت کریں۔


The book helps you understand how software works.

کتاب آپ کو یہ سمجھنے میں مدد کرتی ہے کہ سافٹ ویئر کیسے کام کرتا ہے۔


This book is a guide to the hacker's toolkit.

یہ کتاب ہیکر کے ٹول کٹ کے لیے ایک رہنما ہے۔


The book covers code and library injection.

کتاب کوڈ اور لائبریری انجیکشن کا احاطہ کرتی ہے۔


The book teaches you how to sniff secure traffic.

کتاب آپ کو محفوظ ٹریفک کو سونگھنا سکھاتی ہے۔


The debugger obtains a handle to the process.

ڈیبگر عمل کے لیے ایک ہینڈل حاصل کرتا ہے۔


We attach to the process using the DebugActiveProcess() function.

ہم DebugActiveProcess() فنکشن کا استعمال کرتے ہوئے عمل سے منسلک ہوتے ہیں۔


The target process assumes that the attaching process is ready to handle debug events.

ہدف کا عمل فرض کرتا ہے کہ منسلک عمل ڈیبگ ایونٹس کو ہینڈل کرنے کے لیے تیار ہے۔


The debugger catches these debugging events by calling WaitForDebugEvent() in a loop.

ڈیبگر ان ڈیبگنگ ایونٹس کو ایک لوپ میں WaitForDebugEvent() کو کال کرکے پکڑتا ہے۔


The first parameter is a pointer to the DEBUG_EVENT struct.

پہلا پیرامیٹر DEBUG_EVENT ساخت کی طرف اشارہ کرنے والا ہے۔


For each event that the debugger catches, there are associated event handlers.

ہر اس ایونٹ کے لیے جسے ڈیبگر پکڑتا ہے، اس سے وابستہ ایونٹ ہینڈلر موجود ہیں۔


Once the handlers are finished executing, we want the process to continue executing.

ایک بار جب ہینڈلرز پر عمل درآمد مکمل ہو جاتا ہے، تو ہم چاہتے ہیں کہ عمل جاری رہے۔


This is achieved using the ContinueDebugEvent() function.

یہ ContinueDebugEvent() فنکشن کا استعمال کرتے ہوئے حاصل کیا جاتا ہے۔


The dwContinueStatus parameter signals the process to continue executing.

dwContinueStatus پیرامیٹر عمل کو جاری رکھنے کا اشارہ دیتا ہے۔


The only thing left to do is to detach from the process.

صرف ایک کام باقی ہے جو عمل سے الگ ہونا ہے۔


We will also add the ability to open and obtain a process handle.

ہم عمل کو کھولنے اور ایک عمل ہینڈل حاصل کرنے کی صلاحیت بھی شامل کریں گے۔


Download this file now and overwrite your current copy.

ابھی اس فائل کو ڈاؤن لوڈ کریں اور اپنی موجودہ کاپی کو اوور رائٹ کریں۔


We won’t cover the creation of structs, unions, and constants any further.

ہم مزید ساختوں، یونینوں اور مستقل کی تخلیق کا احاطہ نہیں کریں گے۔


Now let’s modify our test harness to exercise the new functionality.

آئیے اب اپنے ٹیسٹ ہارنس میں ترمیم کریں تاکہ نئی فعالیت کا تجربہ کیا جا سکے۔


Ensure the Process Identifier (PID) checkbox is checked, and click OK.

یقینی بنائیں کہ عمل شناخت کنندہ (PID) چیک باکس کو چیک کیا گیا ہے، اور ٹھیک ہے پر کلک کریں۔


Find the PID that calc.exe is associated with.

وہ PID تلاش کریں جس سے calc.exe وابستہ ہے۔


When Press a key to continue... is printed to the screen, attempt to interact with the calculator GUI.

جب جاری رکھنے کے لیے کوئی کلید دبائیں... اسکرین پر پرنٹ ہوتا ہے، کیلکولیٹر GUI کے ساتھ تعامل کرنے کی کوشش کریں۔


You shouldn’t be able to click any of the buttons or open any menus.

آپ کو کسی بھی بٹن پر کلک کرنے یا کوئی مینو کھولنے کے قابل نہیں ہونا چاہیے۔


If everything works as described, then comment out the following two lines.

اگر سب کچھ بیان کے مطابق کام کرتا ہے، تو درج ذیل دو لائنوں کو غیر فعال کر دیں۔


Now that we have explained the basics, we are ready to dive into more advanced features.

اب جب کہ ہم نے بنیادی باتوں کی وضاحت کر دی ہے، ہم مزید جدید خصوصیات میں غوطہ لگانے کے لیے تیار ہیں۔


The Python interpreter provides full access to included libraries.

پائیتھون مترجم شامل لائبریریوں تک مکمل رسائی فراہم کرتا ہے۔


To ensure the environment finds the interpreter automatically, you must edit the .bashrc file.

اس بات کو یقینی بنانے کے لیے کہ ماحول خود بخود مترجم تلاش کر لے، آپ کو .bashrc فائل میں ترمیم کرنی ہوگی۔


I personally use nano for text editing, but feel free to use any editor you prefer.

میں ذاتی طور پر ٹیکسٹ ایڈیٹنگ کے لیے نینو استعمال کرتا ہوں، لیکن آپ اپنی پسند کا کوئی بھی ایڈیٹر استعمال کرنے کے لیے آزاد ہیں۔


Open the .bashrc file and add the following line at the bottom: export PATH=/usr/local/Python25/:$PATH

.bashrc فائل کھولیں اور نیچے دی گئی لائن شامل کریں: export PATH=/usr/local/Python25/:$PATH


This line tells the Linux environment that the root user can access the Python interpreter without using its full path.

یہ لائن لینکس ماحول کو بتاتی ہے کہ روٹ صارف اپنے مکمل راستے کا استعمال کیے بغیر پائیتھون مترجم تک رسائی حاصل کر سکتا ہے۔


Now that you have a Python interpreter on both Windows and Linux, it's time to set up your IDE.

اب جب کہ آپ کے پاس ونڈوز اور لینکس دونوں پر پائیتھون مترجم موجود ہے، تو اب وقت آگیا ہے کہ آپ اپنا IDE سیٹ اپ کریں۔


In order to rapidly develop and debug Python applications, it is necessary to utilize a solid IDE.

پائیتھون ایپلی کیشنز کو تیزی سے تیار اور ڈیبگ کرنے کے لیے، ایک ٹھوس IDE کا استعمال ضروری ہے۔


The coupling of Eclipse and PyDev gives you powerful features that most other IDEs don’t offer.

ایکلپس اور پائ ڈی وی کی جوڑی آپ کو طاقتور خصوصیات فراہم کرتی ہے جو زیادہ تر دوسرے IDEs پیش نہیں کرتے ہیں۔


Eclipse runs on Windows, Linux, and Mac and has excellent community support.

ایکلپس ونڈوز، لینکس اور میک پر چلتا ہے اور اس میں بہترین کمیونٹی سپورٹ موجود ہے۔


Download the Eclipse Classic package from the official website.

سرکاری ویب سائٹ سے ایکلپس کلاسک پیکج ڈاؤن لوڈ کریں۔


Unzip it to C:\Eclipse and run C:\Eclipse\eclipse.exe.

اسے C:\Eclipse میں ان زپ کریں اور C:\Eclipse\eclipse.exe چلائیں۔


The first time it starts, it will ask where to store your workspace; you can accept the default.

پہلی بار شروع ہونے پر، یہ پوچھے گا کہ آپ کے ورک اسپیس کو کہاں محفوظ کرنا ہے؛ آپ ڈیفالٹ قبول کر سکتے ہیں۔


Once Eclipse has fired up, choose Help -> Software Updates -> Find and Install.

ایکلیپس کے شروع ہونے کے بعد، Help -> Software Updates -> Find and Install منتخب کریں۔


Select the radio button labeled 'Search for new features to install' and click Next.

'نصب کرنے کے لیے نئی خصوصیات تلاش کریں' کے لیبل والے ریڈیو بٹن کو منتخب کریں اور Next پر کلک کریں۔


In the Name field enter a descriptive string like 'PyDev Update'.

Name فیلڈ میں 'PyDev Update' جیسی وضاحتی سٹرنگ درج کریں۔


Make sure the URL field contains the correct PyDev update site address.

اس بات کو یقینی بنائیں کہ URL فیلڈ میں درست PyDev اپ ڈیٹ سائٹ کا پتہ موجود ہے۔


The updates dialog will appear after a few moments; expand the top item and check PyDev.

کچھ لمحوں کے بعد اپ ڈیٹس کا ڈائیلاگ ظاہر ہوگا؛ سب سے اوپر والی شے کو پھیلائیں اور PyDev کو چیک کریں۔


Read and accept the license agreement for PyDev and click Next.

PyDev کے لیے لائسنس کے معاہدے کو پڑھیں اور قبول کریں اور Next پر کلک کریں۔


You will see Eclipse begin pulling down the PyDev extension; click Install All.

آپ دیکھیں گے کہ ایکلپس PyDev ایکسٹینشن کو کھینچنا شروع کر دے گا؛ Install All پر کلک کریں۔


The final step is to restart Eclipse with your new PyDev included.

آخری مرحلہ یہ ہے کہ آپ کے نئے PyDev کے ساتھ ایکلپس کو دوبارہ شروع کریں۔


The ESP register is used to track the very top of the stack frame.

ای ایس پی رجسٹر کا استعمال اسٹیک فریم کے سب سے اوپر کو ٹریک کرنے کے لیے کیا جاتا ہے۔


The stack grows from high memory addresses to low memory addresses.

اسٹیک اعلی میموری پتوں سے کم میموری پتوں تک بڑھتا ہے۔


Let’s use our previously covered function my_socks() as a simplified example of how the stack works.

آئیے اپنی پہلے سے احاطہ شدہ فنکشن my_socks() کو اسٹیک کے کام کرنے کی ایک آسان مثال کے طور پر استعمال کریں۔


When the my_socks() function returns, it pops off all the values on the stack and jumps to the return address.

جب my_socks() فنکشن واپس آتا ہے، تو یہ اسٹیک پر موجود تمام اقدار کو ہٹا دیتا ہے اور واپسی کے پتے پر چھلانگ لگاتا ہے۔


Local variables are slices of memory that are valid only for the function that is executing.

مقامی متغیر میموری کے ٹکڑے ہیں جو صرف اس فنکشن کے لیے درست ہیں جو عمل میں ہے۔


The variable stinky_sock_color_one would be allocated on the stack so that it can be used within the current stack frame.

متغیر stinky_sock_color_one کو اسٹیک پر مختص کیا جائے گا تاکہ اسے موجودہ اسٹیک فریم کے اندر استعمال کیا جا سکے۔


The ability to capture the stack frame inside a debugger is very useful for tracing functions.

ڈیبگر کے اندر اسٹیک فریم کو کیپچر کرنے کی صلاحیت فنکشنز کا سراغ لگانے کے لیے بہت مفید ہے۔


Debuggers run as an endless loop that waits for a debugging event to occur.

ڈیبگرز ایک نہ ختم ہونے والے لوپ کے طور پر چلتے ہیں جو ڈیبگنگ ایونٹ کے ہونے کا انتظار کرتے ہیں۔


Some of the common events that a debugger must trap are these: Breakpoint hits, Memory violations, Exceptions generated by the debugged program.

کچھ عام واقعات جنہیں ایک ڈیبگر کو ٹریپ کرنا چاہیے وہ یہ ہیں: بریک پوائنٹ ہٹ، میموری کی خلاف ورزیاں، ڈیبگ شدہ پروگرام کے ذریعے تیار کردہ استثنیٰ۔


An advantage of a scripted debugger is the ability to build custom event handlers to automate certain debugging tasks.

اسکرپٹڈ ڈیبگر کا ایک فائدہ یہ ہے کہ مخصوص ڈیبگنگ کاموں کو خودکار بنانے کے لیے حسب ضرورت ایونٹ ہینڈلرز بنانے کی صلاحیت ہے۔


For example, a buffer overflow is a common cause for memory violations and is of great interest to a hacker.

مثال کے طور پر، بفر اوور فلو میموری کی خلاف ورزیوں کی ایک عام وجہ ہے اور ایک ہیکر کے لیے بہت دلچسپی کا باعث ہے۔


The ability to halt a process that is being debugged is achieved by setting breakpoints.

اس عمل کو روکنے کی صلاحیت جس کی ڈیبگنگ کی جا رہی ہے، بریک پوائنٹس سیٹ کرکے حاصل کی جاتی ہے۔


Breakpoints are most definitely the most common feature that you will use when debugging a process.

بریک پوائنٹس یقینی طور پر سب سے عام خصوصیت ہیں جو آپ کسی عمل کی ڈیبگنگ کرتے وقت استعمال کریں گے۔


There are three primary breakpoint types: soft break- points, hardware breakpoints, and memory breakpoints.

تین بنیادی بریک پوائنٹ اقسام ہیں: سافٹ بریک پوائنٹس، ہارڈ ویئر بریک پوائنٹس، اور میموری بریک پوائنٹس۔


A soft breakpoint is a single-byte instruction that stops execution of the debugged process.

سافٹ بریک پوائنٹ ایک واحد بائٹ کی ہدایات ہے جو ڈیبگ شدہ عمل پر عمل درآمد کو روکتی ہے۔


An operation code, or opcode, is a machine language command that the CPU executes.

ایک آپریشن کوڈ، یا اوپ کوڈ، ایک مشین لینگویج کمانڈ ہے جسے CPU عمل میں لاتا ہے۔


In order to set a soft breakpoint at this address and halt the CPU, we have to swap out a single byte from the 2-byte 8BC3 opcode.

اس پتے پر ایک سافٹ بریک پوائنٹ سیٹ کرنے اور CPU کو روکنے کے لیے، ہمیں 2 بائٹ 8BC3 اوپ کوڈ سے ایک واحد بائٹ کو تبدیل کرنا ہوگا۔


When the CPU comes skipping along and hits that byte, it halts, firing an INT3 event.

جب CPU چھلانگ لگاتا ہے اور اس بائٹ کو ہٹ کرتا ہے، تو یہ رک جاتا ہے، ایک INT3 ایونٹ فائر کرتا ہے۔


Soft breakpoints have one caveat, however: when you change a byte of the executable in memory, you change the running software’s cyclic redundancy check (CRC) checksum.

سافٹ بریک پوائنٹس میں ایک انتباہ ہے، تاہم: جب آپ میموری میں قابل عمل کے ایک بائٹ کو تبدیل کرتے ہیں، تو آپ چلنے والے سافٹ ویئر کے سائکلک ریڈنڈنسی چیک (CRC) چیکسم کو تبدیل کرتے ہیں۔


Hardware breakpoints are useful when a small number of breakpoints are desired and the debugged software itself cannot be modified.

ہارڈ ویئر بریک پوائنٹس اس وقت مفید ہوتے ہیں جب بریک پوائنٹس کی ایک چھوٹی تعداد مطلوب ہو اور ڈیبگ شدہ سافٹ ویئر میں خود ترمیم نہیں کی جا سکتی۔


The debugger is a crucial tool for understanding how software works.

ڈیبگر اس بات کو سمجھنے کے لیے ایک اہم ٹول ہے کہ سافٹ ویئر کیسے کام کرتا ہے۔


Hardware breakpoints involve setting specific bits in the CPU's debug registers.

ہارڈ ویئر بریک پوائنٹس میں سی پی یو کے ڈیبگ رجسٹروں میں مخصوص بٹس سیٹ کرنا شامل ہے۔


We can first see that printf() resolves to 0x77c4186a, and so we set our breakpoint on that address.

ہم سب سے پہلے دیکھ سکتے ہیں کہ پرنٹ ایف() 0x77c4186a پر حل ہوتا ہے، اور اس لیے ہم اس ایڈریس پر اپنا بریک پوائنٹ سیٹ کرتے ہیں۔


The first exception that is caught is the Windows-driven breakpoint.

پہلا استثنا جو پکڑا جاتا ہے وہ ونڈوز سے چلنے والا بریک پوائنٹ ہے۔


After the breakpoint is handled, the process should resume its loop.

بریک پوائنٹ کو ہینڈل کرنے کے بعد، عمل کو اپنے لوپ کو دوبارہ شروع کرنا چاہیے۔


The second type of breakpoint is the hardware breakpoint.

دوسری قسم کا بریک پوائنٹ ہارڈ ویئر بریک پوائنٹ ہے۔


We covered this process extensively in the previous chapter.

ہم نے اس عمل کا پچھلے باب میں وسیع پیمانے پر احاطہ کیا ہے۔


The important thing to remember when managing hardware breakpoints is tracking which of the four available debug registers are free for use.

ہارڈ ویئر بریک پوائنٹس کا انتظام کرتے وقت یاد رکھنے والی اہم بات یہ ہے کہ یہ ٹریک کرنا ہے کہ چار دستیاب ڈیبگ رجسٹروں میں سے کون سے استعمال کے لیے مفت ہیں۔


We have to ensure that we are always using a slot that is empty.

ہمیں اس بات کو یقینی بنانا ہوگا کہ ہم ہمیشہ ایک ایسے سلاٹ کا استعمال کر رہے ہیں جو خالی ہے۔


Let’s start by enumerating all of the threads in the process and obtain a CPU context record for each of them.

آئیے عمل میں موجود تمام تھریڈز کو شمار کرکے شروع کریں اور ان میں سے ہر ایک کے لیے ایک سی پی یو کنٹیکسٹ ریکارڈ حاصل کریں۔


Using the retrieved context record, we then modify one of the registers between DR0 and DR3 to contain the desired breakpoint address.

حاصل کردہ کنٹیکسٹ ریکارڈ کا استعمال کرتے ہوئے، ہم پھر مطلوبہ بریک پوائنٹ ایڈریس پر مشتمل ہونے کے لیے DR0 اور DR3 کے درمیان رجسٹروں میں سے ایک میں ترمیم کرتے ہیں۔


We then flip the appropriate bits in the DR7 register to enable the breakpoint and set its type and length.

پھر ہم بریک پوائنٹ کو فعال کرنے اور اس کی قسم اور لمبائی سیٹ کرنے کے لیے DR7 رجسٹر میں مناسب بٹس کو پلٹ دیتے ہیں۔


Once we have created the routine to set the breakpoint, we need to modify our main debug event loop so that it can appropriately handle the exception that is thrown by a hardware breakpoint.

ایک بار جب ہم بریک پوائنٹ سیٹ کرنے کا معمول بنا لیتے ہیں، تو ہمیں اپنے مرکزی ڈیبگ ایونٹ لوپ میں ترمیم کرنے کی ضرورت ہوتی ہے تاکہ وہ اس استثنا کو مناسب طریقے سے ہینڈل کر سکے جو ہارڈ ویئر بریک پوائنٹ کے ذریعے پھینکا جاتا ہے۔


We know that a hardware breakpoint triggers an INT1 (or single-step event), so we simply add another exception handler to our debug loop.

ہم جانتے ہیں کہ ایک ہارڈ ویئر بریک پوائنٹ ایک INT1 (یا سنگل سٹیپ ایونٹ) کو متحرک کرتا ہے، اس لیے ہم اپنے ڈیبگ لوپ میں صرف ایک اور استثنا ہینڈلر شامل کرتے ہیں۔


Let’s start with setting the breakpoint.

آئیے بریک پوائنٹ سیٹ کرنے سے شروع کریں۔


You can see that we select an open slot to store the breakpoint by checking the global hardware_breakpoints dictionary.

آپ دیکھ سکتے ہیں کہ ہم عالمی ہارڈ ویئر_بریک پوائنٹس ڈکشنری کو چیک کرکے بریک پوائنٹ کو ذخیرہ کرنے کے لیے ایک کھلا سلاٹ منتخب کرتے ہیں۔


Now that we have the mechanism to support setting the breakpoints, let’s update our event loop and add an exception handler to support the INT1 interrupt.

اب جب کہ ہمارے پاس بریک پوائنٹس سیٹ کرنے میں مدد کرنے کا طریقہ کار موجود ہے، آئیے اپنے ایونٹ لوپ کو اپ ڈیٹ کریں اور INT1 انٹرپٹ کی حمایت کے لیے ایک استثنا ہینڈلر شامل کریں۔


If the debugger detects that there is a hardware breakpoint at the exception address, it zeros out the flags in DR7 and resets the debug register that contains the breakpoint address.

اگر ڈیبگر پتہ لگاتا ہے کہ استثنا ایڈریس پر ایک ہارڈ ویئر بریک پوائنٹ ہے، تو یہ DR7 میں جھنڈوں کو صفر کر دیتا ہے اور ڈیبگ رجسٹر کو دوبارہ ترتیب دیتا ہے جس میں بریک پوائنٹ ایڈریس ہوتا ہے۔


This harness simply sets a breakpoint on the printf() call whenever it gets executed.

یہ ہارنس صرف پرنٹ ایف() کال پر ایک بریک پوائنٹ سیٹ کرتا ہے جب بھی اسے انجام دیا جاتا ہے۔


The loop should continue to execute after the handler is finished.

ہینڈلر کے ختم ہونے کے بعد لوپ کو جاری رہنا چاہیے۔


The exploit code needs to land at a specific memory address.

ایکسپلائٹ کوڈ کو ایک مخصوص میموری ایڈریس پر اترنے کی ضرورت ہے۔


This will disable DEP for the current process.

یہ موجودہ عمل کے لیے DEP کو غیر فعال کر دے گا۔


The script outputs the results to the Log window.

اسکرپٹ نتائج کو لاگ ونڈو میں آؤٹ پٹ کرتا ہے۔


Malware commonly employs anti-debugging routines.

مالویئر عام طور پر اینٹی ڈیبگنگ روٹین استعمال کرتا ہے۔


The function returns 1 if a debugger is attached.

اگر ڈیبگر منسلک ہے تو فنکشن 1 واپس کرتا ہے۔


ہم ان دو افعال کو پیچ کر سکتے ہیں۔


Malware will attempt to iterate through all running processes.

مالویئر تمام چل رہے عملوں کے ذریعے دہرانے کی کوشش کرے گا۔


Hooking is a powerful process-observation technique.

ہوکنگ ایک طاقتور عمل مشاہدہ تکنیک ہے۔


Soft hooks are useful for nonintensive functions.

سافٹ ہکس غیر شدید افعال کے لیے مفید ہیں۔


Hard hooks have far less impact on the target process.

ہارڈ ہکس کا ہدف کے عمل پر بہت کم اثر پڑتا ہے۔


We will be focusing on two primary techniques.

ہم دو بنیادی تکنیکوں پر توجہ مرکوز کریں گے۔


The data is obfuscated by strong SSL encryption.

ڈیٹا کو مضبوط SSL انکرپشن کے ذریعے مبہم کیا جاتا ہے۔


We can see the username and password quite clearly.

ہم صارف نام اور پاس ورڈ کو بالکل واضح طور پر دیکھ سکتے ہیں۔


The entry hooks are useful to see what parameters get passed.

داخلے کے ہکس یہ دیکھنے کے لیے مفید ہیں کہ کون سے پیرامیٹرز پاس کیے جاتے ہیں۔


The exit hooks are useful for trapping function return values.

ایگزٹ ہکس فنکشن کی واپسی کی اقدار کو ٹریپ کرنے کے لیے مفید ہیں۔


کوڈ PR_Write پر ایک ہک سیٹ کرتا ہے۔


If it matches our search pattern, we output it to the console.

اگر یہ ہمارے سرچ پیٹرن سے مماثل ہے، تو ہم اسے کنسول پر آؤٹ پٹ کرتے ہیں۔


This technique can be applied to all kinds of debugging scenarios.

یہ تکنیک ہر قسم کے ڈیبگنگ منظرناموں پر لاگو کی جا سکتی ہے۔


Immunity Debugger reduces the complicated process.

Immunity Debugger پیچیدہ عمل کو کم کرتا ہے۔


The logFunction() method is required to set up the hook.

ہک کو سیٹ اپ کرنے کے لیے logFunction() طریقہ کار درکار ہے۔


At any later point you can revert the process to the point where the snapshot was taken.

آپ کسی بھی بعد کے مقام پر عمل کو اس نقطہ پر واپس کر سکتے ہیں جہاں اسنیپ شاٹ لیا گیا تھا۔


This can be quite handy when reverse engineering a binary or analyzing a crash.

یہ کسی بائنری کی ریورس انجینئرنگ یا کریش کا تجزیہ کرتے وقت کافی کارآمد ہو سکتا ہے۔


Our first step is to get an accurate picture of what the target process was up to at a precise moment.

ہمارا پہلا قدم اس بات کی ایک درست تصویر حاصل کرنا ہے کہ ہدف کا عمل ایک خاص لمحے میں کیا کر رہا تھا۔


In order for the picture to be accurate, we need to first obtain all threads and their respective CPU contexts.

تصویر کو درست بنانے کے لیے، ہمیں سب سے پہلے تمام تھریڈز اور ان کے متعلقہ CPU سیاق و سباق حاصل کرنے کی ضرورت ہے۔


As well, we need to obtain all of the process’s memory pages and their contents.

اسی طرح، ہمیں عمل کے تمام میموری صفحات اور ان کے مندرجات کو حاصل کرنے کی ضرورت ہے۔


Once we have this information, it’s just a matter of storing it for when we want to restore a snapshot.

ایک بار جب ہمارے پاس یہ معلومات آجاتی ہیں، تو یہ صرف اسے ذخیرہ کرنے کا معاملہ ہے جب ہم اسنیپ شاٹ کو بحال کرنا چاہتے ہیں۔


Before we can take the process snapshots, we have to suspend all threads of execution so that they don’t change data or state while the snapshot is being taken.

اس سے پہلے کہ ہم عمل کے اسنیپ شاٹس لے سکیں، ہمیں عمل کے تمام تھریڈز کو معطل کرنا ہوگا تاکہ وہ اسنیپ شاٹ لیتے وقت ڈیٹا یا حالت کو تبدیل نہ کریں۔


To suspend all threads in PyDbg, we use suspend_all_threads(), and to resume all the threads, we use the aptly named resume_all_threads().

PyDbg میں تمام تھریڈز کو معطل کرنے کے لیے، ہم suspend_all_threads() استعمال کرتے ہیں، اور تمام تھریڈز کو دوبارہ شروع کرنے کے لیے، ہم مناسب نام resume_all_threads() استعمال کرتے ہیں۔


Once we have suspended the threads, we simply make a call to process_snapshot().

ایک بار جب ہم نے تھریڈز کو معطل کر دیا ہے، تو ہم آسانی سے process_snapshot() کو کال کرتے ہیں۔


This automatically fetches all of the contextual information about each thread and all memory at that precise moment.

یہ خود بخود ہر تھریڈ اور اس خاص لمحے میں تمام میموری کے بارے میں تمام سیاق و سباق کی معلومات حاصل کرتا ہے۔


Once the snapshot is finished, we resume all of the threads.

اسنیپ شاٹ ختم ہونے کے بعد، ہم تمام تھریڈز کو دوبارہ شروع کرتے ہیں۔


When we want to restore the process to the snapshot point, we suspend all of the threads, call process_restore(), and resume all of the threads.

جب ہم عمل کو اسنیپ شاٹ پوائنٹ پر بحال کرنا چاہتے ہیں، تو ہم تمام تھریڈز کو معطل کرتے ہیں، process_restore() کو کال کرتے ہیں، اور تمام تھریڈز کو دوبارہ شروع کرتے ہیں۔


Once we resume the process, we should be back at our original snapshot point.

ایک بار جب ہم عمل کو دوبارہ شروع کرتے ہیں، تو ہمیں اپنے اصل اسنیپ شاٹ پوائنٹ پر واپس آ جانا چاہیے۔


بہت اچھا، ہے نا؟


To try this out, let’s use a simple example where we allow a user to hit a key to take a snapshot and hit a key again to restore the snapshot.

اسے آزمانے کے لیے، آئیے ایک سادہ سی مثال استعمال کرتے ہیں جہاں ہم صارف کو اسنیپ شاٹ لینے کے لیے ایک کلید دبانے اور اسنیپ شاٹ کو بحال کرنے کے لیے دوبارہ ایک کلید دبانے کی اجازت دیتے ہیں۔


Open a new Python file, call it snapshot.py, and enter the following code.

ایک نئی Python فائل کھولیں، اسے snapshot.py کہیں، اور درج ذیل کوڈ درج کریں۔


So the first step is to start the target application under a debugger thread.

تو پہلا قدم یہ ہے کہ ہدف کی ایپلی کیشن کو ڈیبگر تھریڈ کے تحت شروع کیا جائے۔


By using separate threads, we can enter snapshotting commands without forcing the target application to pause while it waits for our input.

الگ تھریڈز کا استعمال کرتے ہوئے، ہم اسنیپ شاٹنگ کمانڈز داخل کر سکتے ہیں بغیر ہدف کی ایپلی کیشن کو روکنے پر مجبور کیے جب کہ وہ ہمارے ان پٹ کا انتظار کرتی ہے۔


Once the debugger thread has returned a valid PID, we start up a new thread that will take our input.

ایک بار جب ڈیبگر تھریڈ نے ایک درست PID واپس کر دیا ہے، تو ہم ایک نیا تھریڈ شروع کرتے ہیں جو ہمارا ان پٹ لے گا۔


Then when we send it a command, it will evaluate whether we are taking a snapshot, restoring a snapshot, or quitting.

پھر جب ہم اسے ایک کمانڈ بھیجتے ہیں، تو یہ اندازہ لگائے گا کہ آیا ہم اسنیپ شاٹ لے رہے ہیں، اسنیپ شاٹ بحال کر رہے ہیں، یا چھوڑ رہے ہیں۔


The FastLogHook object creates a memory region to store captured information.

FastLogHook آبجیکٹ معلومات کو محفوظ کرنے کے لیے ایک میموری علاقہ بناتا ہے۔


You must query this page using getAllLog() to retrieve hook results.

آپ کو ہک کے نتائج حاصل کرنے کے لیے getAllLog() کا استعمال کرتے ہوئے اس صفحے کو استفسار کرنا ہوگا۔


Each hooked function's address is stored in hook_address.

ہر ہک شدہ فنکشن کا پتہ hook_address میں محفوظ کیا جاتا ہے۔


The STDCALLFastLogHook is adjusted for the STDCALL calling convention.

STDCALLFastLogHook کو STDCALL کالنگ کنونشن کے لیے ایڈجسٹ کیا گیا ہے۔


Hippie was created to handle the large number of Win32 API heap function calls.

Hippie کو Win32 API ہیپ فنکشن کالز کی بڑی تعداد کو سنبھالنے کے لیے بنایا گیا تھا۔


If you open a file dialog in Notepad, it requires around 4,500 calls.

اگر آپ نوٹ پیڈ میں فائل ڈائیلاگ کھولتے ہیں، تو اسے تقریباً 4,500 کالز کی ضرورت ہوتی ہے۔


We can use hippie as an example of how to instrument heap routines.

ہم ہیپ روٹین کو آلات بنانے کی مثال کے طور پر hippie استعمال کر سکتے ہیں۔


For RtlFreeHeap, we will trap all three arguments.

RtlFreeHeap کے لیے، ہم تینوں دلائل کو ٹریپ کریں گے۔


For RtlAllocateHeap, we will take three arguments plus the returned pointer.

RtlAllocateHeap کے لیے، ہم تین دلائل کے ساتھ ساتھ واپس کردہ پوائنٹر لیں گے۔


Open a new Python file and name it hippie_easy.py.

ایک نئی Python فائل کھولیں اور اس کا نام hippie_easy.py رکھیں۔


The Python code starts disassembling at the head of the function.

Python کوڈ فنکشن کے سر پر جدا کرنا شروع کر دیتا ہے۔


Binaries are complicated and have zero tolerance for error.

بائنریز پیچیدہ ہیں اور غلطی کے لیے صفر رواداری رکھتے ہیں۔


The script is designed to be run once to set the hooks.

اسکرپٹ کو ہکس سیٹ کرنے کے لیے ایک بار چلانے کے لیے ڈیزائن کیا گیا ہے۔


You can access objects stored in the knowledge base from the debugger's Python shell.

آپ ڈیبگر کے Python شیل سے نالج بیس میں محفوظ اشیاء تک رسائی حاصل کر سکتے ہیں۔


For RtlAllocateHeap, we are trapping three arguments from the stack.

RtlAllocateHeap کے لیے، ہم اسٹیک سے تین دلائل کو ٹریپ کر رہے ہیں۔


In less than 100 lines of code, we have employed a powerful hooking technique.

100 سے کم لائنوں کے کوڈ میں، ہم نے ایک طاقتور ہکنگ تکنیک استعمال کی ہے۔


Start notepad.exe under Immunity Debugger and run the !hippie_easy PyCommand.

Immunity Debugger کے تحت notepad.exe شروع کریں اور !hippie_easy PyCommand چلائیں۔


Rerun the PyCommand, and you should see output in the Log window.

PyCommand کو دوبارہ چلائیں، اور آپ کو لاگ ونڈو میں آؤٹ پٹ نظر آنا چاہیے۔


Hooking is something you'll undoubtedly use throughout your reversing endeavors.

ہکنگ ایک ایسی چیز ہے جسے آپ اپنی الٹنے کی کوششوں میں بلاشبہ استعمال کریں گے۔


We will create some simple utilities in Python.

ہم Python میں کچھ آسان افادیتیں بنائیں گے۔


The file fuzzer selects a file randomly from the examples directory.

فائل فزر مثالوں کی ڈائرکٹری سے بے ترتیب طور پر ایک فائل منتخب کرتا ہے۔


The mutate_file function is responsible for modifying the selected file.

mutate_file فنکشن منتخب کردہ فائل میں ترمیم کرنے کا ذمہ دار ہے۔


The debugger thread is started to load the target application.

ڈیبگر تھریڈ کو ہدف کی ایپلی کیشن لوڈ کرنے کے لیے شروع کیا گیا ہے۔


The monitoring thread ensures the application terminates after a set time.

مانیٹرنگ تھریڈ اس بات کو یقینی بناتا ہے کہ ایپلی کیشن ایک مقررہ وقت کے بعد ختم ہو جائے۔


The fuzzer uses command-line options to configure its behavior.

فزر اپنے رویے کو ترتیب دینے کے لیے کمانڈ لائن کے اختیارات استعمال کرتا ہے۔


Code coverage is a metric to measure how much code is executed during testing.

کوڈ کوریج ایک میٹرک ہے جو اس بات کی پیمائش کرتا ہے کہ جانچ کے دوران کتنا کوڈ چلایا جاتا ہے۔


Automated static analysis can help find vulnerabilities in the target code.

خودکار جامد تجزیہ ہدف کے کوڈ میں کمزوریوں کو تلاش کرنے میں مدد کر سکتا ہے۔


Sulley is a Python-based fuzzing framework.

سولی ایک پائیتھون پر مبنی فزنگ فریم ورک ہے۔


Sulley uses block-based fuzzing for data generation.

سولی ڈیٹا جنریشن کے لیے بلاک پر مبنی فزنگ کا استعمال کرتا ہے۔


Primitives are the building blocks for describing a protocol in Sulley.

پرائمٹوز سولی میں ایک پروٹوکول کی وضاحت کرنے کے لیے بلڈنگ بلاکس ہیں۔


Strings are a common primitive used in Sulley.

اسٹرنگز سولی میں استعمال ہونے والا ایک عام پرائمٹو ہے۔


Delimiters help break larger strings into manageable pieces.

ڈیلیمیٹرز بڑے اسٹرنگز کو قابل انتظام ٹکڑوں میں توڑنے میں مدد کرتے ہیں۔


s_random is used to generate random data of varying lengths.

s_random مختلف لمبائی کے بے ترتیب ڈیٹا کو تیار کرنے کے لیے استعمال ہوتا ہے۔


Binary data can be represented using the s_binary directive.

بائنری ڈیٹا کو s_binary ہدایت کا استعمال کرتے ہوئے ظاہر کیا جا سکتا ہے۔


Integers are supported in Sulley with various types.

سولی میں مختلف اقسام کے ساتھ انٹیجرز کی حمایت کی جاتی ہے۔


Blocks and groups are used to organize primitives.

بلاک اور گروپس پرائمٹوز کو منظم کرنے کے لیے استعمال ہوتے ہیں۔


WarFTPD 1.65 has a known stack overflow vulnerability.

WarFTPD 1.65 میں ایک معروف اسٹیک اوور فلو کمزوری ہے۔


FTP is a protocol used for transferring data.

ایف ٹی پی ڈیٹا منتقل کرنے کے لیے استعمال ہونے والا ایک پروٹوکول ہے۔


The USER and PASS commands are used for authentication in FTP.

USER اور PASS کمانڈز ایف ٹی پی میں تصدیق کے لیے استعمال ہوتے ہیں۔


The fuzzer attempts to send malformed FTP commands.

فزر خراب شدہ ایف ٹی پی کمانڈز بھیجنے کی کوشش کرتا ہے۔


Without specialized tools, a computer user can’t see the contents of ADSs.

خصوصی اوزاروں کے بغیر، کمپیوٹر کا صارف اے ڈی ایس کے مندرجات نہیں دیکھ سکتا۔


To use an alternate data stream on a file, we’ll need to do nothing more than append a colon and a filename to an existing file.

فائل پر متبادل ڈیٹا سٹریم استعمال کرنے کے لیے، ہمیں موجودہ فائل میں صرف کالن اور فائل کا نام شامل کرنے کی ضرورت ہوگی۔


In this case we are accessing vncdll.dll, which is stored in an alternate data stream attached to reverser.exe.

اس صورت میں، ہم vncdll.dll تک رسائی حاصل کر رہے ہیں، جو reverser.exe سے منسلک متبادل ڈیٹا سٹریم میں محفوظ ہے۔


Let’s write a quick utility script that simply reads in a file and writes it out to an ADS attached to a file of our choosing.

آئیے ایک فوری یوٹیلیٹی اسکرپٹ لکھتے ہیں جو آسانی سے ایک فائل کو پڑھتا ہے اور اسے ہماری پسند کی فائل سے منسلک اے ڈی ایس پر لکھتا ہے۔


The first command-line argument is the DLL we wish to read in, and the second argument is the target file whose ADS we will be storing the DLL in.

پہلا کمانڈ لائن دلیل وہ DLL ہے جسے ہم پڑھنا چاہتے ہیں، اور دوسری دلیل وہ ٹارگٹ فائل ہے جس کے اے ڈی ایس میں ہم DLL کو محفوظ کریں گے۔


We can use this little utility to store any kind of files we would like alongside the executable, and we can inject DLLs directly out of the ADS as well.

ہم اس چھوٹی یوٹیلیٹی کو کسی بھی قسم کی فائل کو ایگزیکیوٹیبل کے ساتھ محفوظ کرنے کے لیے استعمال کر سکتے ہیں، اور ہم اے ڈی ایس سے براہ راست DLLs کو بھی انجیکٹ کر سکتے ہیں۔


Let’s start by building our execution redirection code, which very simply starts up an application of our choosing.

آئیے اپنے ایگزیکیوشن ری ڈائریکشن کوڈ کی تعمیر سے شروع کرتے ہیں، جو بہت آسانی سے ہماری پسند کی ایپلیکیشن شروع کرتا ہے۔


When the user attempts to use the calculator, she will be inadvertently running our backdoor, which in turn will start the proper calculator and thus not alert the user that anything is amiss.

جب صارف کیلکولیٹر استعمال کرنے کی کوشش کرے گا، تو وہ لاعلمی میں ہمارے بیک ڈور کو چلائے گا، جو بدلے میں مناسب کیلکولیٹر شروع کرے گا اور اس طرح صارف کو خبردار نہیں کرے گا کہ کچھ غلط ہے۔


Before we move into the DLL injection code, we are going to explore how we can hide the DLL itself before using it for the injection.

DLL انجیکشن کوڈ میں جانے سے پہلے، ہم اس بات کی کھوج کریں گے کہ انجیکشن کے لیے استعمال کرنے سے پہلے ہم خود DLL کو کیسے چھپا سکتے ہیں۔


Our injection function will also be able to handle code or DLL injection; simply set the parameter flag to 1, and the data variable will then contain the path to the DLL.

ہمارا انجیکشن فنکشن کوڈ یا DLL انجیکشن کو بھی سنبھالنے کے قابل ہو گا؛ بس پیرامیٹر فلیگ کو 1 پر سیٹ کریں، اور ڈیٹا متغیر میں پھر DLL کا راستہ شامل ہو گا۔


We now have a supported injection function that can handle both code and DLL injection.

اب ہمارے پاس ایک معاون انجیکشن فنکشن ہے جو کوڈ اور DLL دونوں انجیکشن کو سنبھال سکتا ہے۔


Now it’s time to inject two separate pieces of shellcode into the real calc.exe process, one to give us the reverse shell and one to kill our deviant process.

اب وقت آگیا ہے کہ شیل کوڈ کے دو الگ الگ ٹکڑوں کو اصلی calc.exe عمل میں انجیکٹ کیا جائے، ایک ہمیں ریورس شیل دینے کے لیے اور دوسرا ہمارے منحرف عمل کو ختم کرنے کے لیے۔


We now have a fairly comprehensive backdoor that utilizes some stealth, and better yet, we get access to the target machine every time someone runs the application we are interested in.

اب ہمارے پاس ایک کافی جامع بیک ڈور ہے جو کچھ اسٹیلتھ کا استعمال کرتا ہے، اور اس سے بہتر، ہمیں ٹارگٹ مشین تک رسائی حاصل ہوتی ہے جب بھی کوئی وہ ایپلیکیشن چلاتا ہے جس میں ہماری دلچسپی ہے۔


A handy Python library called py2exe allows you to compile a Python script into a full-fledged Windows executable.

py2exe نامی ایک آسان Python لائبریری آپ کو Python اسکرپٹ کو مکمل ونڈوز ایگزیکیوٹیبل میں مرتب کرنے کی اجازت دیتی ہے۔


In order to compile our backdoor, we create a simple setup script that defines how we want the executable to be built.

ہمارے بیک ڈور کو مرتب کرنے کے لیے، ہم ایک سادہ سیٹ اپ اسکرپٹ بناتے ہیں جو اس بات کی وضاحت کرتا ہے کہ ہم ایگزیکیوٹیبل کو کیسے بنانا چاہتے ہیں۔


The first parameter, console, is the name of the primary script we are compiling.

پہلا پیرامیٹر، کنسول، بنیادی اسکرپٹ کا نام ہے جسے ہم مرتب کر رہے ہیں۔


This makes our backdoor very portable in that we can move it onto a system without Python installed, and it will work just fine.

یہ ہمارے بیک ڈور کو بہت پورٹیبل بناتا ہے کہ ہم اسے بغیر Python انسٹال کیے کسی سسٹم پر منتقل کر سکتے ہیں، اور یہ بالکل ٹھیک کام کرے گا۔


Rename it calc.exe and copy it onto the target system.

اس کا نام calc.exe رکھیں اور اسے ٹارگٹ سسٹم پر کاپی کریں۔


Now all we need is a means to use the shell that’s going to be sent back to us, so let’s whip up a simple interface to send commands and receive their output.

اب ہمیں صرف اس شیل کو استعمال کرنے کا ایک ذریعہ درکار ہے جو ہمیں واپس بھیجا جائے گا، لہذا آئیے کمانڈز بھیجنے اور ان کا آؤٹ پٹ وصول کرنے کے لیے ایک سادہ انٹرفیس تیار کرتے ہیں۔


This is a very simple socket server that merely takes in a connection and does basic reading and writing.

یہ ایک بہت ہی سادہ ساکٹ سرور ہے جو محض ایک کنکشن لیتا ہے اور بنیادی پڑھنے اور لکھنے کا کام کرتا ہے۔


Since the USER and PASS commands are only a small subset of the FTP server’s full capabilities, let’s throw in a couple of commands to test for some more bugs once we are authenticated.

چونکہ USER اور PASS کمانڈز FTP سرور کی مکمل صلاحیتوں کا صرف ایک چھوٹا سا حصہ ہیں، آئیے کچھ مزید بگز کی جانچ کے لیے کچھ کمانڈز شامل کرتے ہیں جب ہم تصدیق شدہ ہو جائیں۔


To gain a full understanding of all commands supported by the FTP protocol, please refer to its RFC.

FTP پروٹوکول کے ذریعہ سپورٹ کی جانے والی تمام کمانڈز کی مکمل سمجھ حاصل کرنے کے لیے، براہ کرم اس کے RFC سے رجوع کریں۔


We’ll use our knowledge of Sulley data primitives to turn Sulley into a lean, mean FTP server–breaking machine.

ہم سلی ڈیٹا پرائمیٹیوز کے بارے میں اپنے علم کا استعمال سلی کو ایک پتلا، مطلب FTP سرور توڑنے والی مشین میں تبدیل کرنے کے لیے کریں گے۔


Warm up your code editor, create a new file called ftp.py, and enter the following code.

اپنے کوڈ ایڈیٹر کو گرم کریں، ftp.py نامی ایک نئی فائل بنائیں، اور درج ذیل کوڈ درج کریں۔


With the protocol skeleton now created, let’s move on to creating a Sulley session that will tie together all of our request information as well as set up the network sniffer and the debugging client.

اب پروٹوکول کا ڈھانچہ بن جانے کے بعد، آئیے ایک سلی سیشن بنانے کی طرف بڑھتے ہیں جو ہماری تمام درخواست کی معلومات کو ایک ساتھ جوڑ دے گا اور نیٹ ورک سنفر اور ڈیبگنگ کلائنٹ کو بھی ترتیب دے گا۔


Sulley sessions are the mechanism that ties together requests and takes care of the network packet capture, process debugging, crash reporting, and virtual machine control.

سلی سیشن وہ طریقہ کار ہیں جو درخواستوں کو ایک ساتھ جوڑتا ہے اور نیٹ ورک پیکٹ کیپچر، پروسیس ڈیبگنگ، کریش رپورٹنگ، اور ورچوئل مشین کنٹرول کا خیال رکھتا ہے۔


To begin, let’s define a sessions file and dissect the various parts.

شروع کرنے کے لیے، آئیے ایک سیشن فائل کی وضاحت کریں اور مختلف حصوں کو الگ کریں۔


We are attacking 192.168.244.133 and port 21, which is our WarFTPD instance (running inside a virtual machine in this case).

ہم 192.168.244.133 اور پورٹ 21 پر حملہ کر رہے ہیں، جو ہماری WarFTPD مثال ہے (اس معاملے میں ایک ورچوئل مشین کے اندر چل رہی ہے).


The next step is to tie our FTP requests together in a logical fashion.

اگلا مرحلہ یہ ہے کہ ہمارے FTP درخواستوں کو منطقی انداز میں ایک ساتھ جوڑ دیا جائے۔


You can see how we chain together the authentication commands ( USER, PASS), and then any commands that require the user to be authenticated we chain to the PASS command.

آپ دیکھ سکتے ہیں کہ ہم تصدیقی کمانڈز (USER, PASS) کو کیسے جوڑتے ہیں، اور پھر کوئی بھی کمانڈز جن کے لیے صارف کی تصدیق کی ضرورت ہوتی ہے، ہم PASS کمانڈ سے جوڑتے ہیں۔


Now we have a fully defined session with a nice set of requests, so let’s see how to set up our network and monitor scripts.

اب ہمارے پاس درخواستوں کا ایک اچھا سیٹ کے ساتھ ایک مکمل طور پر متعین سیشن ہے، تو آئیے دیکھتے ہیں کہ اپنے نیٹ ورک اور مانیٹر اسکرپٹس کو کیسے ترتیب دیا جائے۔


One of the sweetest features of Sulley is its ability to monitor fuzz traffic on the wire as well as handle any crashes that occur on the target system.

سلی کی سب سے بہترین خصوصیات میں سے ایک یہ ہے کہ یہ تار پر فز ٹریفک کی نگرانی کرنے کے ساتھ ساتھ ہدف کے نظام پر ہونے والے کسی بھی کریش کو سنبھالنے کی صلاحیت رکھتا ہے۔


This is extremely important, because you can map a crash back to the actual network traffic that caused it, which greatly reduces the time it takes to go from crash to working exploit.

یہ انتہائی اہم ہے، کیونکہ آپ کریش کو اس اصل نیٹ ورک ٹریفک پر واپس نقشہ بنا سکتے ہیں جس کی وجہ سے یہ ہوا، جو کریش سے کام کرنے والے استحصال تک جانے میں لگنے والے وقت کو بہت کم کر دیتا ہے۔


Let’s start with the process monitor, process_monitor.py, which is located in the main Sulley directory.

آئیے پروسیس مانیٹر، process_monitor.py سے شروع کرتے ہیں، جو مین سلی ڈائرکٹری میں واقع ہے۔


We would run the process_monitor.py script with the following command- line arguments:

ہم process_monitor.py اسکرپٹ کو درج ذیل کمانڈ لائن دلائل کے ساتھ چلائیں گے:


We see that the network interface we want to use is set to [1] in the output.

ہم دیکھتے ہیں کہ نیٹ ورک انٹرفیس جسے ہم استعمال کرنا چاہتے ہیں آؤٹ پٹ میں [1] پر سیٹ ہے۔


We now have both monitoring agents running, and we are ready for fuzzing action.

اب ہمارے پاس دونوں مانیٹرنگ ایجنٹ چل رہے ہیں، اور ہم فزنگ ایکشن کے لیے تیار ہیں۔


Now we are actually going to fire up Sulley, and we’ll use its built-in web interface to keep an eye on its progress.

اب ہم درحقیقت سلی کو شروع کرنے جا رہے ہیں، اور ہم اس کے بلٹ ان ویب انٹرفیس کا استعمال اس کی پیشرفت پر نظر رکھنے کے لیے کریں گے۔


Open your favorite web browser and point it to http://127.0.0.1:26000.

اپنے پسندیدہ ویب براؤزر کو کھولیں اور اسے http://127.0.0.1:26000 پر لے جائیں۔


You should see a screen that looks like the one in Figure 9-1.

آپ کو ایک اسکرین نظر آنی چاہیے جو شکل 9-1 میں موجود اسکرین کی طرح نظر آئے۔


You can see that we discovered a valid device name, \Device\Beep, in three lines of code.

آپ دیکھ سکتے ہیں کہ ہم نے صرف تین سطروں کے کوڈ میں ایک درست ڈیوائس کا نام، \Device\Beep، دریافت کیا۔


Now let’s move on to discovering the primary IOCTL dispatch function and the IOCTL codes that a driver supports.

آئیے اب بنیادی IOCTL ڈسپیچ فنکشن اور IOCTL کوڈز کو دریافت کرنے کی طرف چلتے ہیں جو ایک ڈرائیور سپورٹ کرتا ہے۔


Any driver that implements an IOCTL interface must have an IOCTL dispatch routine that handles the processing of the various IOCTL requests.

کوئی بھی ڈرائیور جو IOCTL انٹرفیس کو نافذ کرتا ہے اس میں ایک IOCTL ڈسپیچ روٹین ہونا چاہیے جو مختلف IOCTL درخواستوں کی پروسیسنگ کو سنبھالتا ہے۔


When a driver loads, the first function that gets called is the DriverEntry routine.

جب ایک ڈرائیور لوڈ ہوتا ہے، تو سب سے پہلا فنکشن جو کال کیا جاتا ہے وہ DriverEntry روٹین ہے۔


This line is telling the driver that the IOCTLDispatch function handles all IOCTL requests.

یہ لائن ڈرائیور کو بتا رہی ہے کہ IOCTLDispatch فنکشن تمام IOCTL درخواستوں کو سنبھالتا ہے۔


Using these instructions, we can then deduce where the IOCTL-handling routine lives.

ان ہدایات کا استعمال کرتے ہوئے، ہم اس کے بعد یہ اخذ کر سکتے ہیں کہ IOCTL-ہینڈلنگ روٹین کہاں ہے۔


This dispatch function search is performed by driverlib using the code in Listing 10-4.

یہ ڈسپیچ فنکشن سرچ ڈرائیورلِب کے ذریعے لسٹنگ 10-4 میں موجود کوڈ کا استعمال کرتے ہوئے انجام دیا جاتا ہے۔


Once we have found a match, we send a Function object back that represents the IOCTL dispatch function where our hunt for valid IOCTL codes will begin.

ایک بار جب ہمیں کوئی مماثلت مل جاتی ہے، تو ہم ایک فنکشن آبجیکٹ واپس بھیجتے ہیں جو IOCTL ڈسپیچ فنکشن کی نمائندگی کرتا ہے جہاں ہمارے درست IOCTL کوڈز کی تلاش شروع ہوگی۔


Next let’s take a look at the IOCTL dispatch function itself and how to apply some simple heuristics to try to find all of the IOCTL codes a device supports.

آئیے اگلا IOCTL ڈسپیچ فنکشن کو خود دیکھتے ہیں اور یہ کہ کسی ڈیوائس کی جانب سے سپورٹ کیے جانے والے تمام IOCTL کوڈز کو تلاش کرنے کی کوشش کرنے کے لیے کچھ سادہ ہسٹورکس کا اطلاق کیسے کریں۔


The IOCTL dispatch routine commonly will perform various actions based on the value of the code being passed in to the routine.

IOCTL ڈسپیچ روٹین عام طور پر روٹین میں پاس کیے جانے والے کوڈ کی قدر کی بنیاد پر مختلف کارروائیاں کرے گا۔


We want to be able to exercise each of the possible paths that are determined by the IOCTL code, which is why we go to all the trouble of finding these values.

ہم IOCTL کوڈ کے ذریعے طے شدہ ہر ممکنہ راستے کو استعمال کرنے کے قابل ہونا چاہتے ہیں، یہی وجہ ہے کہ ہم ان اقدار کو تلاش کرنے کی تمام تر تکلیف اٹھاتے ہیں۔


Let’s first examine what the C source code for a skeleton IOCTL dispatch function would look like, and then we’ll see how to decode the assembly to retrieve the IOCTL code values.

آئیے پہلے اس بات کا جائزہ لیں کہ ایک سکیلیٹن IOCTL ڈسپیچ فنکشن کے لیے C سورس کوڈ کیسا نظر آئے گا، اور پھر ہم دیکھیں گے کہ IOCTL کوڈ کی قدروں کو حاصل کرنے کے لیے اسمبلی کو کیسے ڈی کوڈ کیا جائے۔


Once the function code has been retrieved from the IOCTL request, it is common to see a switch statement in place to determine what action the driver is to perform based on the IOCTL code being sent in.

ایک بار جب فنکشن کوڈ کو IOCTL درخواست سے حاصل کر لیا جاتا ہے، تو یہ دیکھنا عام ہے کہ یہ تعین کرنے کے لیے ایک سوئچ بیان موجود ہے کہ ڈرائیور کو IOCTL کوڈ کی بنیاد پر کیا کارروائی کرنی ہے جو بھیجا جا رہا ہے۔


There can be many ways that the switch statement gets translated into assembly; take a look at Listing 10-6 for examples.

سوئچ بیان کو اسمبلی میں ترجمہ کرنے کے بہت سے طریقے ہو سکتے ہیں؛ مثالوں کے لیے لسٹنگ 10-6 پر ایک نظر ڈالیں۔


In the first case, where we see a series of CMP instructions, we simply look for the constant that is being compared against the passed-in IOCTL.

پہلے معاملے میں، جہاں ہم CMP ہدایات کی ایک سیریز دیکھتے ہیں، ہم صرف اس مستقل کو تلاش کرتے ہیں جس کا موازنہ پاس شدہ IOCTL سے کیا جا رہا ہے۔


That constant should be a valid IOCTL code that the driver supports.

وہ مستقل ایک درست IOCTL کوڈ ہونا چاہیے جو ڈرائیور سپورٹ کرتا ہے۔


In the second case we are looking for a series of SUB statements against the same register, followed by some type of conditional JMP instruction.

دوسرے معاملے میں ہم ایک ہی رجسٹر کے خلاف SUB بیانات کی ایک سیریز تلاش کر رہے ہیں، اس کے بعد کسی قسم کی مشروط JMP ہدایت ہے۔


The key in this case is to find the original starting constant: SUB ESI, 1337

اس معاملے میں کلید اصل ابتدائی مستقل کو تلاش کرنا ہے: SUB ESI, 1337


From there, every SUB instruction we see, we add the equivalent amount to our base constant, which gives us another valid IOCTL code.

وہاں سے، ہر SUB ہدایت جو ہم دیکھتے ہیں، ہم مساوی رقم کو اپنے بیس مستقل میں شامل کرتے ہیں، جو ہمیں ایک اور درست IOCTL کوڈ دیتا ہے۔


Now that we know how driverlib does some of our dirty work for us, let’s take advantage of it!

اب جب کہ ہم جانتے ہیں کہ ڈرائیورلِب ہمارے لیے کچھ گندے کام کیسے کرتا ہے، آئیے اس کا فائدہ اٹھائیں!


Listing 11-1. Cross References to sprintf

فہرست 11-1۔ sprintf کے کراس حوالہ جات


All of the addresses that are listed are locations where the sprintf function is being called.

وہ تمام پتے جو درج ہیں وہ مقامات ہیں جہاں sprintf فنکشن کو کال کیا جا رہا ہے۔


We’ll use IDAPython to iterate through all of the functions in a target binary and set breakpoints on the head of each address.

ہم ایک ٹارگٹ بائنری میں موجود تمام فنکشنز کے ذریعے دہرانے کے لیے IDAPython کا استعمال کریں گے اور ہر ایڈریس کے سر پر بریک پوائنٹس سیٹ کریں گے۔


Open a new Python file, name it func_coverage.py, and enter the following code.

ایک نئی Python فائل کھولیں، اس کا نام func_coverage.py رکھیں، اور درج ذیل کوڈ درج کریں۔


First we set up our debugger hook so that it gets called whenever a debugger event is thrown.

سب سے پہلے ہم اپنا ڈیبگر ہک سیٹ اپ کرتے ہیں تاکہ جب بھی کوئی ڈیبگر ایونٹ پھینکا جائے تو اسے کال کیا جائے۔


We then iterate through all of the function addresses and set a breakpoint on each address.

پھر ہم تمام فنکشن ایڈریسز کے ذریعے دہراتے ہیں اور ہر ایڈریس پر ایک بریک پوائنٹ سیٹ کرتے ہیں۔


The SetBptAttr call sets a flag to tell the debugger not to stop when each breakpoint is hit.

SetBptAttr کال ایک فلیگ سیٹ کرتا ہے جو ڈیبگر کو بتاتا ہے کہ جب ہر بریک پوائنٹ ہٹ ہو تو رکنا نہیں ہے۔


Our breakpoint handler prints out the address of each breakpoint that was hit, using the ea variable.

ہمارا بریک پوائنٹ ہینڈلر ہر بریک پوائنٹ کا پتہ پرنٹ کرتا ہے جو ea متغیر کا استعمال کرتے ہوئے ہٹ ہوا تھا۔


Now run the debugger (hotkey = F9), and you should start seeing output showing the functions that are hit.

اب ڈیبگر چلائیں (ہاٹکی = F9)، اور آپ کو آؤٹ پٹ نظر آنا شروع ہو جائے گا جو ان فنکشنز کو دکھا رہا ہے جو ہٹ ہوئے ہیں۔


At times when assessing a binary for possible vulnerabilities, it’s important to understand the stack size of particular function calls.

بعض اوقات جب ممکنہ کمزوریوں کے لیے بائنری کا جائزہ لیا جاتا ہے، تو مخصوص فنکشن کالز کے اسٹیک سائز کو سمجھنا ضروری ہے۔


Let’s write some code to iterate through all of the functions in a binary and show us all functions that have stack-allocated buffers that may be of interest.

آئیے کچھ کوڈ لکھتے ہیں تاکہ بائنری میں موجود تمام فنکشنز کے ذریعے دہرایا جا سکے اور ہمیں وہ تمام فنکشنز دکھائے جائیں جن میں اسٹیک سے مختص بفرز ہیں جو دلچسپی کا باعث ہو سکتے ہیں۔


Open a new Python file, name it stack_calc.py, and enter the following code.

ایک نئی Python فائل کھولیں، اس کا نام stack_calc.py رکھیں، اور درج ذیل کوڈ درج کریں۔


We set a size threshold that determines how large a stack variable should be before we consider it a buffer.

ہم ایک سائز کی حد مقرر کرتے ہیں جو اس بات کا تعین کرتی ہے کہ کسی اسٹیک متغیر کو بفر سمجھنے سے پہلے کتنا بڑا ہونا چاہیے۔


We then begin iterating through all of the functions, obtaining the stack frame object for each function.

پھر ہم تمام فنکشنز کے ذریعے دہرانا شروع کرتے ہیں، ہر فنکشن کے لیے اسٹیک فریم آبجیکٹ حاصل کرتے ہیں۔


Using the stack frame object, we use the GetStrucSize method to determine the size of the stack frame in bytes.

اسٹیک فریم آبجیکٹ کا استعمال کرتے ہوئے، ہم بائٹس میں اسٹیک فریم کا سائز معلوم کرنے کے لیے GetStrucSize طریقہ استعمال کرتے ہیں۔


You should now have the fundamentals for using IDAPython and have some core utility scripts that you can easily extend, combine, or enhance.

آپ کے پاس اب IDAPython استعمال کرنے کی بنیادی باتیں ہونی چاہئیں اور کچھ بنیادی یوٹیلیٹی اسکرپٹس ہیں جنہیں آپ آسانی سے بڑھا، ملا یا بہتر بنا سکتے ہیں۔


PyEmu was released at BlackHat 2007 by Cody Pierce, one of the talented members of the TippingPoint DVLabs team.

PyEmu کو بلیک ہیٹ 2007 میں کوڈے پیئرس نے جاری کیا تھا، جو ٹِپنگ پوائنٹ ڈی وی لیبز ٹیم کے باصلاحیت اراکین میں سے ایک ہیں۔


PyEmu has three methods to enable emulation: IDAPyEmu, PyDbgPyEmu, and PEPyEmu.

PyEmu میں ایمولیشن کو فعال کرنے کے تین طریقے ہیں: IDAPyEmu, PyDbgPyEmu، اور PEPyEmu۔


We will be covering the use of IDAPyEmu and PEPyEmu for our purposes and leave the PyDbgPyEmu class as an exploration exercise for the reader.

ہم اپنے مقاصد کے لیے IDAPyEmu اور PEPyEmu کے استعمال کا احاطہ کریں گے اور PyDbgPyEmu کلاس کو قاری کے لیے ایک ایکسپلوریشن مشق کے طور پر چھوڑ دیں گے۔


Installing PyEmu is quite simple; just download the zip file from http://www .nostarch.com/ghpython.htm.

PyEmu کو انسٹال کرنا کافی آسان ہے؛ بس http://www .nostarch.com/ghpython.htm سے زپ فائل ڈاؤن لوڈ کریں۔


We then load the code and data sections of the binary into PyEmu’s memory.

پھر ہم بائنری کے کوڈ اور ڈیٹا سیکشنز کو PyEmu کی میموری میں لوڈ کرتے ہیں۔


We are using the IDAPython SegByName() function to find the beginning of the sections and the SegEnd() function to determine the end of the sections.

ہم سیکشنز کے آغاز کو تلاش کرنے کے لیے IDAPython SegByName() فنکشن اور سیکشنز کے اختتام کا تعین کرنے کے لیے SegEnd() فنکشن استعمال کر رہے ہیں۔


Then we simply iterate over the sections byte by byte to store them in PyEmu’s memory.

پھر ہم انہیں PyEmu کی میموری میں محفوظ کرنے کے لیے سیکشنز کو بائٹ بہ بائٹ دہراتے ہیں۔


Now that we have the code and data sections loaded into memory, we are going to set up the stack parameters for the function call.

اب جب کہ ہمارے پاس کوڈ اور ڈیٹا سیکشن میموری میں لوڈ ہو چکے ہیں، ہم فنکشن کال کے لیے اسٹیک پیرامیٹرز سیٹ کرنے جا رہے ہیں۔


We then tell PyEmu to execute all 10 instructions contained within the function.

پھر ہم PyEmu کو فنکشن کے اندر موجود تمام 10 ہدایات پر عمل کرنے کے لیے کہتے ہیں۔


The ret instruction handler simply retrieves the stack arguments and the value of the EAX register and outputs the result of the function call.

ریٹرن انسٹرکشن ہینڈلر آسانی سے اسٹیک دلائل اور EAX رجسٹر کی قدر کو بازیافت کرتا ہے اور فنکشن کال کا نتیجہ آؤٹ پٹ کرتا ہے۔


Practice loading different binaries into IDA, pick a random function, and try to emulate calls to it.

IDA میں مختلف بائنریز لوڈ کرنے کی مشق کریں، ایک بے ترتیب فنکشن منتخب کریں، اور اس پر کالوں کی تقلید کرنے کی کوشش کریں۔


You’d be amazed at how powerful this technique can be when a function has hundreds or thousands of instructions with many branches, loops, and return points.

آپ اس بات سے حیران رہ جائیں گے کہ یہ تکنیک کتنی طاقتور ہو سکتی ہے جب کسی فنکشن میں بہت سے برانچز، لوپس اور ریٹرن پوائنٹس کے ساتھ سینکڑوں یا ہزاروں ہدایات ہوں۔


Using this method of reversing a function can save you hours of manual reversing.

فنکشن کو ریورس کرنے کا یہ طریقہ آپ کو دستی ریورسنگ کے گھنٹوں بچا سکتا ہے۔


Now let’s use the PEPyEmu library to unpack a compressed executable.

آئیے اب ایک کمپریسڈ ایگزیکیوٹیبل کو ان پیک کرنے کے لیے PEPyEmu لائبریری کا استعمال کریں۔


Executable packers or compressors have been around for quite some time.

ایگزیکیوٹیبل پیکرز یا کمپریسر کافی عرصے سے موجود ہیں۔


A typical packer will compress the code and data segments of the target binary and replace the entry point with a decompressor.

ایک عام پیکر ٹارگٹ بائنری کے کوڈ اور ڈیٹا سیگمنٹس کو کمپریس کرے گا اور انٹری پوائنٹ کو ڈی کمپریسر سے بدل دے گا۔


When the binary is executed, the decompressor runs, which decompresses the original binary into memory, and then jumps to the original entry point (OEP) of the binary.

جب بائنری کو ایگزیکیوٹ کیا جاتا ہے، تو ڈی کمپریسر چلتا ہے، جو اصل بائنری کو میموری میں ڈی کمپریس کرتا ہے، اور پھر بائنری کے اصل انٹری پوائنٹ (OEP) پر چھلانگ لگاتا ہے۔


Once the OEP is reached, the binary begins executing normally.

ایک بار جب OEP تک پہنچ جاتا ہے، تو بائنری عام طور پر ایگزیکیوٹ ہونا شروع ہو جاتی ہے۔


When faced with a packed executable, a reverser must first get rid of the packer in order to effectively analyze the true binary con- tained within.

ایک پیک شدہ ایگزیکیوٹیبل کا سامنا کرنے پر، ایک ریورسر کو سب سے پہلے پیکر سے چھٹکارا حاصل کرنا چاہیے تاکہ اندر موجود اصلی بائنری کا مؤثر طریقے سے تجزیہ کیا جا سکے۔


This is where using an emulator can be beneficial, as no debugger is being attached to the running executable; we are simply running the code inside the emulator and waiting for the decompression routine to finish.

یہ وہ جگہ ہے جہاں ایمولیٹر کا استعمال فائدہ مند ہو سکتا ہے، کیونکہ کوئی ڈیبگر چلنے والے ایگزیکیوٹیبل سے منسلک نہیں ہے؛ ہم صرف ایمولیٹر کے اندر کوڈ چلا رہے ہیں اور ڈی کمپریشن روٹین کے ختم ہونے کا انتظار کر رہے ہیں۔


Once the packer has finished decompressing the original file, we want to dump the uncompressed binary to disk so that we can load it into either a debugger or a static analysis tool like IDA Pro.

ایک بار جب پیکر اصل فائل کو ڈی کمپریس کرنا ختم کر لیتا ہے، تو ہم غیر کمپریسڈ بائنری کو ڈسک پر ڈمپ کرنا چاہتے ہیں تاکہ ہم اسے یا تو ڈیبگر یا IDA Pro جیسے جامد تجزیہ ٹول میں لوڈ کر سکیں۔


We are going to use UPX to compress the calc.exe file that ships with all flavors of Windows, and then we’ll use a PyEmu script to unpack the execut- able and dump it to disk.

ہم calc.exe فائل کو کمپریس کرنے کے لیے UPX کا استعمال کرنے جا رہے ہیں جو ونڈوز کے تمام ورژن کے ساتھ آتی ہے، اور پھر ہم ایگزیکیوٹیبل کو ان پیک کرنے اور اسے ڈسک پر ڈمپ کرنے کے لیے ایک PyEmu اسکرپٹ استعمال کریں گے۔


This will produce a compressed version of the Windows calculator and store it in your C: directory.

یہ ونڈوز کیلکولیٹر کا ایک کمپریسڈ ورژن تیار کرے گا اور اسے آپ کی C: ڈائرکٹری میں محفوظ کرے گا۔


We now have a fully packed file to test in our PyEmu harness, so let’s get coding!

اب ہمارے پاس ہمارے PyEmu ہارنس میں جانچنے کے لیے ایک مکمل پیک شدہ فائل ہے، تو آئیے کوڈنگ شروع کریں!


Python is fast becoming the programming language of choice for hackers.

پائیتھن تیزی سے ہیکرز کے لیے پسندیدہ پروگرامنگ زبان بن رہی ہے۔


Gray Hat Python explains the concepts behind hacking tools and techniques.

گرے ہیٹ پائیتھن ہیکنگ ٹولز اور تکنیکوں کے پیچھے تصورات کی وضاحت کرتا ہے۔


You’ll learn how to automate tedious reversing and security tasks.

آپ سیکھیں گے کہ کس طرح تھکا دینے والے ریورسنگ اور سیکیورٹی کے کاموں کو خودکار بنایا جائے۔


The world’s best hackers are using Python to do their handiwork.

دنیا کے بہترین ہیکرز اپنے کام کے لیے پائیتھن کا استعمال کر رہے ہیں۔


کیا آپ کو نہیں کرنا چاہیے؟


EFF has sued telecom giant AT&T for giving the NSA unfettered access.

ای ایف ایف نے ٹیلی کام کے بڑے ادارے اے ٹی اینڈ ٹی پر این ایس اے کو بلا روک ٹوک رسائی دینے پر مقدمہ دائر کیا ہے۔


EFF’s Coders’ Rights Project is defending the rights of programmers.

ای ایف ایف کا کوڈرز رائٹس پروجیکٹ پروگرامرز کے حقوق کا دفاع کر رہا ہے۔


EFF is fighting prohibitive standards that would take away your right.

ای ایف ایف ان روک تھام کے معیاروں کے خلاف لڑ رہا ہے جو آپ کا حق چھین لیں گے۔


EFF has developed the Switzerland Network Testing Tool.

ای ایف ایف نے سوئٹزرلینڈ نیٹ ورک ٹیسٹنگ ٹول تیار کیا ہے۔


EFF is working to ensure that international treaties do not restrict our free speech.

ای ایف ایف اس بات کو یقینی بنانے کے لیے کام کر رہا ہے کہ بین الاقوامی معاہدے ہماری آزاد تقریر کو محدود نہ کریں۔


ابھی شامل ہوں!


Hacking is the art of creative problem solving.

ہیکنگ تخلیقی مسئلہ حل کرنے کا فن ہے۔


Using the included LiveCD, get your hands dirty debugging code.

شامل کردہ LiveCD کا استعمال کرتے ہوئے، کوڈ کو ڈیبگ کرنے میں ہاتھ گندے کریں۔


Author Michal Zalewski has long been known and respected.

مصنف مائیکل زالیوسکی کو طویل عرصے سے جانا اور احترام کیا جاتا ہے۔


This book is truly unlike anything else out there.

یہ کتاب واقعی میں وہاں موجود کسی بھی چیز سے مختلف ہے۔


Security data visualization tools offer graphical windows.

سیکیورٹی ڈیٹا ویژولائزیشن ٹولز گرافیکل ونڈوز پیش کرتے ہیں۔


Readers will be able to understand complex data sets at a glance.

قارئین ایک نظر میں پیچیدہ ڈیٹا سیٹس کو سمجھ سکیں گے۔


Python is powerful but has a very gentle learning curve.

پائیتھن طاقتور ہے لیکن اس میں سیکھنے کا بہت نرم منحنی خطوط ہے۔


Playing with Python teaches computer programming to non-programmers.

پائیتھن کے ساتھ کھیلنا غیر پروگرامرز کو کمپیوٹر پروگرامنگ سکھاتا ہے۔


The IDA Pro Book covers everything from the very first steps.

IDA پرو بک ہر چیز کا احاطہ کرتا ہے، پہلے اقدامات سے لے کر۔