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 will learn about debuggers, trojans, and fuzzers.

तुम्ही डीबगर्स, ट्रोजन आणि फझर्सबद्दल शिकाल.


Automate tedious reversing and security tasks.

कठीण रिव्हर्सिंग आणि सुरक्षा कार्ये स्वयंचलित करा.


स्वत:चे डीबगर डिझाइन करा आणि प्रोग्राम करा.


विंडोज ड्राइव्हर्सना फझ कसे करायचे ते शिका.


सुरुवातीपासून शक्तिशाली फझर्स तयार करा.


Sniff secure traffic out of an encrypted web browser session.

एन्क्रिप्टेड वेब ब्राउझर सत्रातून सुरक्षित रहदारी स्निफ करा.


The world’s best hackers are using Python.

जगातील सर्वोत्तम हॅकर्स पायथन वापरत आहेत.


This book is for hackers and reverse engineers.

हे पुस्तक हॅकर्स आणि रिव्हर्स इंजिनिअर्ससाठी आहे.


The author is a senior security researcher.

लेखक एक वरिष्ठ सुरक्षा संशोधक आहेत.


ते इम्युनिटी कंपनीसाठी काम करतात.


The book covers various hacking techniques.

हे पुस्तक विविध हॅकिंग तंत्रांचा समावेश करते.


It explains how to use PyDBG and Immunity Debugger.

ते PyDBG आणि इम्युनिटी डीबगर कसे वापरावे हे स्पष्ट करते.


The book also discusses Sulley and IDAPython.

हे पुस्तक सुली आणि आयडीएपायथनवर देखील चर्चा करते.


तुम्ही तुमची स्वतःची सुरक्षा साधने तयार करू शकता.


हे पुस्तक व्यावहारिक उदाहरणे प्रदान करते.


Python is a great choice for security professionals.

सुरक्षा व्यावसायिकांसाठी पायथन एक उत्तम पर्याय आहे.


This book will help you master Python for hacking.

हे पुस्तक तुम्हाला हॅकिंगसाठी पायथनमध्ये प्राविण्य मिळविण्यात मदत करेल.


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

ईएसपी रजिस्टरचा उपयोग स्टॅक फ्रेमच्या अगदी वरच्या भागाचा मागोवा घेण्यासाठी केला जातो.


The EBP register is used to track the bottom 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.

जेव्हा 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.

स्टिंकी_सॉक_कलर_वन व्हेरिएबल स्टॅकवर नियुक्त केले जाईल.


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

डीबगरमध्ये स्टॅक फ्रेम कॅप्चर करण्याची क्षमता खूप उपयुक्त आहे.


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

डीबगर एक अंतहीन लूप म्हणून चालतात जे डीबगिंग इव्हेंटची प्रतीक्षा करतात.


When a debugging event occurs, the loop breaks, and a corresponding event handler is called.

जेव्हा डीबगिंग इव्हेंट होतो, तेव्हा लूप ब्रेक होतो आणि संबंधित इव्हेंट हँडलरला कॉल केला जातो.


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.

स्क्रिप्टेड डीबगरचा एक फायदा म्हणजे कस्टम इव्हेंट हँडलर तयार करण्याची क्षमता.


For example, a buffer overflow is a common cause for memory violations.

उदाहरणार्थ, बफर ओव्हरफ्लो हे मेमरी उल्लंघनाचे एक सामान्य कारण आहे.


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 breakpoints, hardware breakpoints, and memory breakpoints.

ब्रेकपॉइंटचे तीन प्राथमिक प्रकार आहेत: सॉफ्ट ब्रेकपॉइंट्स, हार्डवेअर ब्रेकपॉइंट्स आणि मेमरी ब्रेकपॉइंट्स.


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

सॉफ्ट ब्रेकपॉइंट हे एक सिंगल-बाइट इंस्ट्रक्शन आहे जे डीबग केलेल्या प्रक्रियेचे अंमलबजावणी थांबवते.


An assembly instruction is a high-level representation of a command for the CPU to execute.

असेम्ब्ली इंस्ट्रक्शन हे सीपीयूला कार्यान्वित करण्यासाठी कमांडचे उच्च-स्तरीय प्रतिनिधित्व आहे.


Hardware breakpoints are useful when a small number of breakpoints are desired.

जेव्हा कमी ब्रेकपॉइंट्सची आवश्यकता असते, तेव्हा हार्डवेअर ब्रेकपॉइंट्स उपयुक्त असतात.


Memory breakpoints aren’t really breakpoints at all.

मेमरी ब्रेकपॉइंट्स खरोखरच ब्रेकपॉइंट्स नाहीत.


The Python interactive shell provides full access to the interpreter.

पायथन इंटरएक्टिव्ह शेल इंटरप्रिटरमध्ये पूर्ण प्रवेश प्रदान करते.


To ensure the environment finds the Python 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 फाईल उघडा आणि तळाशी खालील ओळ जोडा: निर्यात पाथ=/usr/local/Python25/:$PATH


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

ही ओळ लिनक्स वातावरणाला सांगते की रूट वापरकर्ता त्याचा संपूर्ण मार्ग वापरल्याशिवाय पायथन इंटरप्रिटरमध्ये प्रवेश करू शकतो.


If you log out and log back in as root, typing python in the command shell will prompt the Python interpreter.

जर तुम्ही लॉग आउट केले आणि रूट म्हणून पुन्हा लॉग इन केले, तर कमांड शेलमध्ये पायथन टाईप केल्यावर पायथन इंटरप्रिटर प्रॉम्प्ट होईल.


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, a solid IDE is necessary.

पायथन ऍप्लिकेशन्सचा जलद विकास आणि डीबग करण्यासाठी, एक मजबूत IDE आवश्यक आहे.


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

एक्लिप्स आणि पायडेव्हचे एकत्रीकरण तुम्हाला शक्तिशाली वैशिष्ट्ये देते जी इतर बहुतेक IDE देत नाहीत.


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

एक्लिप्स विंडोज, लिनक्स आणि मॅकवर चालते आणि उत्कृष्ट समुदाय समर्थन आहे.


Download the Eclipse Classic package from the Eclipse downloads page.

एक्लिप्स डाउनलोड पृष्ठावरून एक्लिप्स क्लासिक पॅकेज डाउनलोड करा.


ते C:\Eclipse मध्ये अनझिप करा.


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.

एकदा एक्लिप्स सुरू झाल्यावर, मदत -> सॉफ्टवेअर अपडेट -> शोधा आणि स्थापित करा निवडा.


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

'नवीन वैशिष्ट्ये स्थापित करण्यासाठी शोधा' लेबल असलेला रेडिओ बटण निवडा आणि पुढे क्लिक करा.


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

नाव फील्डमध्ये 'PyDev अपडेट' सारखे वर्णनात्मक स्ट्रिंग प्रविष्ट करा.


Make sure the URL field contains http://pydev.sourceforge.net/updates/ and click OK.

URL फील्डमध्ये http://pydev.sourceforge.net/updates/ आहे हे सुनिश्चित करा आणि ओके क्लिक करा.


The updates dialog will appear after a few moments.

काही क्षणानंतर अपडेट्स संवाद दिसेल.


The ctypes library enables you to call functions in dynamically linked libraries.

ctypes लायब्ररी तुम्हाला डायनॅमिकली लिंक केलेल्या लायब्ररीमधील फंक्शन्स कॉल करण्यास सक्षम करते.


The debugger attaches to the process using the DebugActiveProcess() function.

डीबगर DebugActiveProcess() फंक्शन वापरून प्रक्रियेला जोडला जातो.


We simply pass it the PID of the process we wish to attach to.

आम्ही फक्त त्या प्रक्रियेचा पीआयडी (PID) पास करतो ज्याला आम्ही जोडणी करू इच्छितो.


Once the system determines that we have appropriate rights to access the process, the target process assumes that the attaching process (the debugger) is ready to handle debug events.

एकदा सिस्टम निर्धारित करते की आमच्याकडे प्रक्रियेमध्ये प्रवेश करण्याचा योग्य अधिकार आहे, तेव्हा लक्ष्य प्रक्रिया गृहीत धरते की संलग्न प्रक्रिया (डीबगर) डीबग इव्हेंट हाताळण्यासाठी तयार आहे.


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

डीबगर लूपमध्ये WaitForDebugEvent() फंक्शनला कॉल करून हे डीबगिंग इव्हेंट पकडतो.


The first parameter is a pointer to the DEBUG_EVENT struct; this structure describes a debugging event.

पहिला पॅरामीटर DEBUG_EVENT स्ट्रक्चरकडे निर्देश करतो; हे स्ट्रक्चर डीबगिंग इव्हेंटचे वर्णन करते.


For each event that the debugger catches, there are associated event handlers that perform some type of action before letting the process continue.

डीबगरने पकडलेल्या प्रत्येक इव्हेंटसाठी, इव्हेंट हँडलर असतात जे प्रक्रिया सुरू होण्यापूर्वी काही प्रकारचे कार्य करतात.


This is achieved using the ContinueDebugEvent() function.

हे ContinueDebugEvent() फंक्शन वापरून साध्य केले जाते.


The dwProcessId and dwThreadId parameters are fields in the DEBUG_EVENT struct, which gets initialized when the debugger catches a debugging event.

dwProcessId आणि dwThreadId हे पॅरामीटर्स DEBUG_EVENT स्ट्रक्चरमधील फील्ड आहेत, जे डीबगर डीबगिंग इव्हेंट पकडतो तेव्हा सुरू केले जातात.


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

आता फक्त प्रक्रियेतून डिस्कनेक्ट करणे बाकी आहे.


Do this by calling DebugActiveProcessStop(), which takes the PID that you wish to detach from as its only parameter.

DebugActiveProcessStop() फंक्शनला कॉल करून हे करा, जे पीआयडी (PID) घेते ज्यातून तुम्हाला डिस्कनेक्ट करायचे आहे, ते त्याचा एकमेव पॅरामीटर म्हणून.


Let’s put all of this together and extend our my_debugger class by providing it the ability to attach to and detach from a process.

चला हे सर्व एकत्र ठेवूया आणि आमच्या my_debugger क्लासचा विस्तार करूया, ज्यामुळे त्याला प्रक्रियेला जोडण्याची आणि डिस्कनेक्ट करण्याची क्षमता मिळेल.


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

आम्ही प्रक्रिया हँडल उघडण्याची आणि मिळवण्याची क्षमता देखील जोडू.


The final implementation detail will be to create our primary debug loop to handle debugging events.

अंतिम अंमलबजावणी तपशील डीबगिंग इव्हेंट हाताळण्यासाठी आमचे प्राथमिक डीबग लूप तयार करणे असेल.


Download this file now and overwrite your current copy.

आता हे फाइल डाउनलोड करा आणि तुमची सध्याची कॉपी ओव्हरराइट करा.


We won’t cover the creation of structs, unions, and constants any further, as you should feel intimately familiar with them by now.

आम्ही यापुढे स्ट्रक्चर्स, युनियन आणि कॉन्स्टंट्सच्या निर्मितीवर चर्चा करणार नाही, कारण आतापर्यंत तुम्हाला त्या चांगल्या माहीत झाल्या असतील.


A debugger must be able to capture the state of the CPU registers at any given point and time.

डीबगर कोणत्याही दिलेल्या वेळी आणि वेळेवर सीपीयू रजिस्टर्सची स्थिती कॅप्चर करण्यास सक्षम असणे आवश्यक आहे.


This allows us to determine the state of the stack when an exception occurs, where the instruction pointer is currently executing, and other useful tidbits of information.

हे आपल्याला अपवाद (exception) उद्भवल्यास, स्टॅकची स्थिती, इन्स्ट्रक्शन पॉइंटर सध्या कोठे एक्झिक्युट होत आहे आणि इतर उपयुक्त माहिती निर्धारित करण्यास अनुमती देते.


We first must obtain a handle to the currently executing thread in the debuggee, which is achieved by using the OpenThread() function.

सर्वप्रथम, आपल्याला डीबगीमध्ये सध्या एक्झिक्युट होत असलेल्या थ्रेडचे हँडल मिळवणे आवश्यक आहे, जे OpenThread() फंक्शन वापरून साधले जाते.


In order to obtain register state from a process, we have to be able to enumerate through all of the running threads inside the process.

प्रक्रियेतून रजिस्टरची स्थिती मिळवण्यासाठी, आपल्याला प्रक्रियेतील सर्व रनिंग थ्रेड्सची गणना करण्यास सक्षम असणे आवश्यक आहे.


The threads are what are actually executing in the process; even if the application is not multithreaded, it still contains at least one thread, the main thread.

थ्रेड्स हेच खऱ्या अर्थाने प्रक्रियेत एक्झिक्युट होत असतात; जरी ॲप्लिकेशन मल्टीथ्रेडेड नसेल तरीही, त्यात कमीतकमी एक थ्रेड असतो, जो मुख्य थ्रेड असतो.


थ्रेड आयडी: ३१४८ कार्यक्रम कोड: ६


पहिला ब्रेकपॉइंट हिट करा.


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

आपण प्रथम पाहू शकतो की printf() 0x77c4186a वर निराकरण करते, आणि म्हणूनच आम्ही त्या पत्त्यावर ब्रेकपॉइंट सेट करतो.


After the break- point is handled, the process should resume its loop.

ब्रेक-पॉइंट हाताळल्यानंतर, प्रक्रियेने त्याचे लूप पुन्हा सुरू केले पाहिजे.


Our debugger now supports soft breakpoints, so let’s move on to hardware breakpoints.

आमचे डीबगर आता सॉफ्ट ब्रेकपॉइंट्सना समर्थन देते, म्हणून हार्डवेअर ब्रेकपॉइंट्सवर जाऊया.


The second type of breakpoint is the hardware breakpoint, which involves setting certain bits in the CPU’s debug registers.

दुसऱ्या प्रकारचा ब्रेकपॉइंट म्हणजे हार्डवेअर ब्रेकपॉइंट, ज्यामध्ये CPU च्या डीबग रजिस्टर्समध्ये काही बिट्स सेट करणे समाविष्ट असते.


We covered this process extensively in the previous chapter, so let’s get to the implementation details.

या प्रक्रियेचा मागील अध्यायात विस्तृतपणे समावेश केला आहे, म्हणून अंमलबजावणी तपशीलांवर जाऊया.


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

हार्डवेअर ब्रेकपॉइंट्स व्यवस्थापित करताना लक्षात ठेवण्यासारखी महत्त्वाची गोष्ट म्हणजे चार उपलब्ध डीबग रजिस्टर्सपैकी कोणते वापरण्यासाठी मोकळे आहेत आणि कोणते आधीच वापरले जात आहेत हे ट्रॅक करणे.


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

चला प्रक्रियेतील सर्व थ्रेड्सची गणना करून सुरुवात करूया आणि त्या प्रत्येकासाठी CPU संदर्भ रेकॉर्ड मिळवूया.


Using the retrieved context record, we then modify one of the registers between DR0 and DR3 (depending on which are free) to contain the desired breakpoint address.

मिळवलेल्या संदर्भ रेकॉर्डचा वापर करून, आम्ही DR0 आणि DR3 मधील (जे मोकळे आहेत त्यावर अवलंबून) आवश्यक ब्रेकपॉइंट पत्ता समाविष्ट करण्यासाठी रजिस्टर्सपैकी एकमध्ये बदल करतो.


We then flip the appro- priate 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 मधील ध्वज शून्य करते आणि ब्रेकपॉइंट पत्ता असलेले डीबग रजिस्टर रीसेट करते.


Let’s see this process in action by modifying our my_test.py script to use hardware breakpoints on our printf() call.

चला आमच्या my_test.py स्क्रिप्टमध्ये बदल करून हे कार्यप्रणाली पाहूया, जेणेकरून आमच्या printf() कॉलवर हार्डवेअर ब्रेकपॉइंट्सचा वापर करता येईल.


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

हे हार्नेस फक्त printf() कॉलवर ब्रेकपॉइंट सेट करते, जेव्हाही ते कार्यान्वित होते.


You can see from the order of events that an exception gets thrown, and our handler removes the breakpoint.

तुम्ही घटनांच्या क्रमावरून पाहू शकता की एक अपवाद टाकला जातो आणि आमचा हँडलर ब्रेकपॉइंट काढतो.


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.

नवीन पायथन फाईल उघडा, तिला 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—pretty straightforward.

मग, जेव्हा आम्ही त्याला कमांड पाठवतो, तेव्हा ते मूल्यांकन करेल की आम्ही स्नॅपशॉट घेत आहोत, स्नॅपशॉट पुनर्संचयित करत आहोत की नाही—हे अगदी सोपे आहे.


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

FastLogHook ऑब्जेक्ट माहिती संकलित करण्यासाठी एक मेमरी क्षेत्र तयार करतो.


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

तुम्हाला हुकचे परिणाम मिळवण्यासाठी getAllLog() फंक्शन वापरून या पृष्ठावर क्वेरी करावी लागेल.


Each time a hooked function is hit, its address is stored in hook_address.

प्रत्येक वेळी हुक केलेले फंक्शन हिट झाल्यावर, त्याचा पत्ता हुक_ॲड्रेसमध्ये साठवला जातो.


The STDCALLFastLogHook is adjusted for the STDCALL calling convention.

STDCALLFastLogHook STDCALL कॉलिंग कन्व्हेन्शनसाठी समायोजित केले जाते.


For the cdecl convention, use the normal FastLogHook.

cdecl कन्व्हेन्शनसाठी, सामान्य FastLogHook वापरा.


Hippie came out as a response for the need of a high-performance logging hook.

उच्च-कार्यक्षमतेच्या लॉगिंग हुकच्या गरजेला प्रतिसाद म्हणून हिप्पी तयार झाला.


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

जर तुम्ही नोटपॅडमध्ये फाइल संवाद उघडलात, तर त्याला RtlAllocateHeap किंवा RtlFreeHeap ला सुमारे 4,500 कॉल लागतात.


Targeting Internet Explorer, you'll see an increase in heap-related function calls.

इंटरनेट एक्सप्लोररला लक्ष्य करत असल्यास, तुम्हाला हिप-संबंधित फंक्शन कॉलमध्ये वाढ दिसेल.


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

आम्ही हिप्पीचा उपयोग हिप रूटीन कसे तयार करायचे याचे उदाहरण म्हणून करू शकतो.


We'll walk through the core hooking portions of hippie and create hippie_easy.py.

आम्ही हिप्पीच्या मुख्य हुकिंग भागातून जाऊ आणि hippie_easy.py तयार करू.


Understand the RtlAllocateHeap and RtlFreeHeap function prototypes.

RtlAllocateHeap आणि RtlFreeHeap फंक्शन प्रोटोटाइप समजून घ्या.


For RtlFreeHeap, we are going to trap all three arguments.

RtlFreeHeap साठी, आम्ही तिन्ही युक्तिवाद पकडणार आहोत.


For RtlAllocateHeap, we are going to take the three arguments plus the returned pointer.

RtlAllocateHeap साठी, आम्ही तीन युक्तिवाद तसेच परत केलेला पॉइंटर घेणार आहोत.


The returned pointer points to the new heap block.

परत केलेला पॉइंटर नवीन हिप ब्लॉककडे निर्देश करतो.


Open a new Python file, name it hippie_easy.py, and write the following code.

नवीन पायथन फाईल उघडा, तिचे नाव hippie_easy.py ठेवा आणि खालील कोड लिहा.


This function looks for the correct basic block that has our desired ret instruction.

हे फंक्शन योग्य बेसिक ब्लॉक शोधते ज्यामध्ये आपले इच्छित ret इंस्ट्रक्शन आहे.


A simple wrapper to print out the hook results in a friendly manner.

हुकचे परिणाम अनुकूल पद्धतीने दर्शविण्यासाठी एक साधे रॅपर.


The script is designed so that you run it once to set the hooks and then again to monitor the results.

हे स्क्रिप्ट असे डिझाइन केलेले आहे की तुम्ही हुक सेट करण्यासाठी एकदा चालवा आणि नंतर परिणाम तपासण्यासाठी पुन्हा चालवा.


You can access them from the debugger’s Python shell.

तुम्ही डीबगरच्या पायथन शेलमधून त्यांना ॲक्सेस करू शकता.


In less than 100 lines of code we have employed an extremely powerful hooking technique.

100 पेक्षा कमी ओळींच्या कोडमध्ये, आम्ही एक अत्यंत शक्तिशाली हुकिंग तंत्र वापरले आहे.


The problem with simply setting up your shellcode to make this call is that it takes some NULL parameters as well, which is problematic for most shellcode.

फक्त तुमचं शेलकोड सेट करून हे कॉल करणं समस्याजनक आहे, कारण ते काही शून्य (NULL) पॅरामीटर्स देखील घेते, जे बहुतेक शेलकोडसाठी समस्या निर्माण करतात.


So the trick involves landing our shellcode in the middle of a function that will call NtSetInformationProcess() with the necessary parameters already on the stack.

म्हणून, युक्तीमध्ये आपल्या शेलकोडला अशा फंक्शनच्या मध्ये उतरवणे समाविष्ट आहे जे आधीच स्टॅकवर आवश्यक पॅरामीटर्ससह NtSetInformationProcess() कॉल करेल.


There is a known spot in ntdll.dll that will accomplish this for us.

ntdll.dll मध्ये एक निश्चित जागा आहे जी हे आपल्यासाठी करेल.


Take a peek at the disassembly output from ntdll.dll on Windows XP SP2 captured using Immunity Debugger.

इम्युनिटी डीबगर वापरून कॅप्चर केलेल्या विंडोज XP SP2 वरील ntdll.dll मधून मिळालेल्या डिसअसेम्ब्ली आउटपुटवर एक नजर टाका.


Following this code flow, we see a comparison against AL for the value of 1, and then ESI is filled with the value 2.

या कोड प्रवाहाचे अनुसरण करून, आम्ही AL ची 1 मूल्याशी तुलना करतो आणि नंतर ESI 2 मूल्याने भरले जाते.


This will disable DEP for the current process, but we first have to get our exploit code to land us at 0x7C91D3F8 in order to have this code executed.

हे सध्याच्या प्रक्रियेसाठी DEP अक्षम करेल, परंतु हे कोड कार्यान्वित करण्यासाठी, प्रथम आपल्या एक्स्प्लॉइट कोडला 0x7C91D3F8 वर उतरवावे लागेल.


Normally you would have to hunt around manually for these addresses, but the exploit developers at Immunity have created a little Python called findantidep.py, which has a wizard that guides you through the process of finding these addresses.

सर्वसाधारणपणे, तुम्हाला हे पत्ते व्यक्तिगतरित्या शोधावे लागतील, परंतु इम्युनिटीमधील एक्स्प्लॉइट डेव्हलपर्सनी findantidep.py नावाचे एक छोटे पायथन तयार केले आहे, ज्यामध्ये एक विझार्ड आहे जो तुम्हाला हे पत्ते शोधण्याच्या प्रक्रियेतून मार्गदर्शन करतो.


It even creates the exploit string that you can copy and paste into your exploit to use these offsets with no effort.

हे एक्स्प्लॉइट स्ट्रिंग देखील तयार करते जेणेकरून तुम्ही हे ऑफसेट वापरण्यासाठी तुमच्या एक्स्प्लॉइटमध्ये कॉपी आणि पेस्ट करू शकता.


Let’s take a look at the findantidep.py script and then take it for a test drive.

चला findantidep.py स्क्रिप्ट पाहूया आणि नंतर त्याची टेस्ट ड्राईव्ह घेऊया.


सॉफ्टवेअर DEP बायपास करण्यासाठी पत्ता शोधा


Current malware variants are becoming more and more devious in their methods of infection, propagation, and their ability to defend themselves from analysis.

सध्याचे मालवेअर प्रकार संसर्गाच्या पद्धतींमध्ये, प्रसारांमध्ये आणि स्वतःचे विश्लेषणापासून संरक्षण करण्याच्या क्षमतेमध्ये अधिकाधिक कपटी होत आहेत.


Aside from common code-obfuscation techniques, such as using packers or encryption techniques, malware will commonly employ anti-debugging routines in an attempt to prevent a malware analyst from using a debugger to understand its behavior.

पॅकर किंवा एन्क्रिप्शन तंत्रज्ञानाचा वापर यासारख्या सामान्य कोड-ऑब्फस्केशन तंत्रज्ञानाशिवाय, मालवेअर विश्लेषकाला डीबगर वापरून त्याचे वर्तन समजून घेण्यापासून रोखण्यासाठी मालवेअर सामान्यतः अँटी-डीबगिंग रूटीनचा वापर करेल.


By far the most common anti-debugging technique is to use the IsDebuggerPresent function exported from kernel32.dll.

आतापर्यंतची सर्वात सामान्य अँटी-डीबगिंग तंत्र म्हणजे kernel32.dll मधून निर्यात केलेले IsDebuggerPresent फंक्शन वापरणे.


This function call takes no parameters and returns 1 if there is a debugger attached to the current process or 0 if there isn’t.

हे फंक्शन कॉल कोणतेही पॅरामीटर्स घेत नाही आणि सध्याच्या प्रक्रियेस डीबगर जोडलेला असल्यास 1 किंवा नसल्यास 0 परत करते.


A simple bypass for this was posted by Damian Gomez of Immunity, and this is one line of Python that can be contained in a PyCommand or executed from the Python shell in Immunity Debugger:

यासाठी एक सोपा बायपास इम्युनिटीचे डेमियन गोमेझ यांनी पोस्ट केला आहे, आणि ही पायथनची एक ओळ आहे जी PyCommand मध्ये समाविष्ट केली जाऊ शकते किंवा इम्युनिटी डीबगरमधील पायथन शेलमधून कार्यान्वित केली जाऊ शकते:


Malware will also attempt to iterate through all the running processes on the machine to determine if a debugger is running.

डीबगर चालत आहे की नाही हे निर्धारित करण्यासाठी मालवेअर मशीनवरील सर्व चालू प्रक्रियांद्वारे पुनरावृत्ती करण्याचा प्रयत्न करेल.


Hooking is a powerful process-observation technique that is used to change the flow of a process in order to monitor or alter data that is being accessed.

हुकिंग ही एक शक्तिशाली प्रक्रिया-निरीक्षण तंत्र आहे जे डेटावर देखरेख ठेवण्यासाठी किंवा त्यात बदल करण्यासाठी वापरले जाते.


A soft hook is one where you are attached to the target process and implement INT3 breakpoint handlers to intercept execution flow.

सॉफ्ट हुक म्हणजे जिथे तुम्ही लक्ष्य प्रक्रियेला संलग्न असता आणि अंमलबजावणी प्रवाह रोखण्यासाठी INT3 ब्रेकपॉइंट हँडलर लागू करता.


However, in order to hook frequently called routines and to have the least amount of impact on the process, you must use hard hooks.

परंतु, वारंवार कॉल केलेल्या रूटीनला हुक करण्यासाठी आणि प्रक्रियेवर कमीतकमी परिणाम होण्यासाठी, तुम्हाला हार्ड हुक वापरावे लागतील.


The first example we will explore involves sniffing encrypted traffic at the application layer.

पहिले उदाहरण जे आपण तपासू ते ॲप्लिकेशन लेयरवर एन्क्रिप्टेड रहदारी (ट्रॅफिक) स्निफिंग (sniffing) समाविष्ट करते.


Using an alternate data stream, we are hiding the DLL from the user’s immediate view.

पर्यायी डेटा प्रवाहाचा वापर करून, आम्ही वापरकर्त्याच्या त्वरित दृश्यातून DLL लपवत आहोत.


Without specialized tools, a computer user can’t see the contents of ADSs, which is ideal for us.

विशिष्ट साधनांशिवाय, संगणक वापरकर्ता ADSs ची सामग्री पाहू शकत नाही, जे आपल्यासाठी आदर्श आहे.


In addition, a number of security products don’t properly scan alternate data streams, so we have a good chance of slipping underneath their radar to avoid detection.

याव्यतिरिक्त, अनेक सुरक्षा उत्पादने पर्यायी डेटा प्रवाहांचे योग्यरित्या स्कॅन करत नाहीत, त्यामुळे आपल्याकडे त्यांच्या रडारखाली येऊन शोध टाळण्याची चांगली संधी आहे.


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, like so: reverser.exe:vncdll.dll

फाइलवर पर्यायी डेटा प्रवाह वापरण्यासाठी, आपल्याला फक्त एक कोलन आणि फाइलचे नाव विद्यमान फाइलमध्ये जोडण्याची आवश्यकता आहे, जसे की: reverser.exe:vncdll.dll


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.

चला एक जलद उपयुक्तता स्क्रिप्ट लिहूया जी फक्त एक फाइल वाचते आणि ती आपल्या पसंतीच्या फाइलला संलग्न असलेल्या ADS वर लिहिते.


Open an additional Python script called file_hider.py and enter the following code.

file_hider.py नावाचे अतिरिक्त पायथन स्क्रिप्ट उघडा आणि खालील कोड प्रविष्ट करा.


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.

आम्ही हे लहान उपयुक्तता एक्झिक्युटेबल सोबत कोणत्याही प्रकारच्या फाइल्स संग्रहित करण्यासाठी वापरू शकतो आणि आम्ही ADS मधून थेट DLL देखील इंजेक्ट करू शकतो.


Although we won’t be utilizing DLL injection for our back- door, it will still support it, so read on.

जरी आम्ही आमच्या बॅक डोअरसाठी DLL इंजेक्शनचा उपयोग करणार नाही, तरीही ते त्याला समर्थन देईल, म्हणून पुढे वाचा.


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

चला आमच्या अंमलबजावणी पुनर्निर्देशन कोड तयार करून सुरुवात करूया, जे अगदी सोप्या पद्धतीने आपल्या पसंतीचे ॲप्लिकेशन सुरू करते.


The reason it’s called execution redirection is because we will name our backdoor calc.exe and move the original calc.exe to a different location.

याला अंमलबजावणी पुनर्निर्देशन म्हणण्याचे कारण असे आहे की आम्ही आमच्या बॅकडोअरला calc.exe असे नाव देऊ आणि मूळ calc.exe दुसऱ्या ठिकाणी हलवू.


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.

जेव्हा वापरकर्ता कॅल्क्युलेटर वापरण्याचा प्रयत्न करेल, तेव्हा ती नकळतपणे आमचे बॅकडोअर चालवेल, जे योग्य कॅल्क्युलेटर सुरू करेल आणि वापरकर्त्याला काहीतरी गडबड आहे हे कळू देणार नाही.


Note that we are including the my_debugger_defines.py file from Chapter 3, which contains all of the necessary constants and structs in order to do the process creation.

लक्षात घ्या की आम्ही प्रकरण 3 मधील my_debugger_defines.py फाइल समाविष्ट करत आहोत, ज्यामध्ये प्रक्रिया तयार करण्यासाठी आवश्यक असलेले सर्व स्थिरांक आणि संरचना आहेत.


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

नवीन पायथन फाइल उघडा, तिला backdoor.py असे नाव द्या आणि खालील कोड प्रविष्ट करा.


This library is from Chapter 3 and contains all the necessary defines for process creation.

हे लायब्ररी प्रकरण 3 मधील आहे आणि त्यात प्रक्रिया निर्मितीसाठी आवश्यक असलेल्या सर्व व्याख्यांचा समावेश आहे.


Not too complicated, and there is no new code in there.

फार गुंतागुंतीचे नाही, आणि त्यात कोणताही नवीन कोड नाही.


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 स्वतः कसे लपवू शकतो हे शोधू.


Let’s add our injection code to the backdoor; just tack it on right after the process-creation section.

चला आमच्या बॅकडोअरमध्ये आमचा इंजेक्शन कोड जोडूया; तो फक्त प्रक्रिया-निर्मिती विभागाच्या अगदी नंतर जोडा.


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 चा मार्ग असेल.


The file_picker function simply uses some built-in functions from Python to list the files in a directory and randomly pick one for mutation.

file_picker फंक्शन फक्त पायथन मधील काही अंगभूत फंक्शन्स वापरते, जेणेकरून एखाद्या डिरेक्टरीमधील फाईल्सची यादी तयार करता येईल आणि यादृच्छिकपणे उत्परिवर्तनासाठी एक निवडता येईल.


Now we have to do some threading work to get the target application loaded, track it for crashes, and terminate it when the document parsing is finished.

आता आपल्याला लक्ष्यित ॲप्लिकेशन लोड करण्यासाठी, क्रॅशचा मागोवा घेण्यासाठी आणि दस्तऐवज पार्सिंग पूर्ण झाल्यावर ते संपुष्टात आणण्यासाठी काही थ्रेडिंग काम करावे लागेल.


We’ll also throw in the email notification routine.

आम्ही ईमेल सूचना दिनचर्या देखील टाकू.


The first step is to check to make sure that a current fuzzing iteration isn’t already running.

पहिले पाऊल म्हणजे हे तपासणे की सध्याचे फझिंग पुनरावृत्ती आधीच सुरू नाही.


Once we have selected a document to mutate, we pass it off to our simple mutation function.

एकदा आम्ही उत्परिवर्तित करण्यासाठी दस्तऐवज निवडला की, आम्ही तो आमच्या साध्या उत्परिवर्तन कार्याकडे पाठवतो.


We then wait in a tight loop for the debugger thread to register the PID of the target application.

त्यानंतर, आम्ही डीबगर थ्रेड लक्ष्य ॲप्लिकेशनचा PID नोंदणी करेपर्यंत एका घट्ट लूपमध्ये प्रतीक्षा करतो.


Once the monitoring thread has started, we increment the iteration count and reenter our main loop until it’s time to pick a new file and fuzz again!

मॉनिटरिंग थ्रेड सुरू झाल्यावर, आम्ही पुनरावृत्तीची संख्या वाढवतो आणि पुन्हा आमच्या मुख्य लूपमध्ये प्रवेश करतो, जोपर्यंत नवीन फाइल निवडण्याची आणि पुन्हा फझ करण्याची वेळ येत नाही!


This is about as rudimentary a mutator as you can get.

हे तुम्हाला मिळू शकणार्‍या सर्वात प्राथमिक उत्परिवर्तकांपैकी एक आहे.


We randomly select a test case from our global test case list.

आम्ही आमच्या जागतिक टेस्ट केस सूचीमधून यादृच्छिकपणे एक टेस्ट केस निवडतो.


The -e flag is the path to the target application’s executable.

-e फ्लॅग हे लक्ष्य ॲप्लिकेशनच्या एक्झिक्युटेबलचा मार्ग आहे.


The optional -n parameter tells the fuzzer whether we want notifications enabled or not.

पर्यायी -n पॅरामीटर फझरला सांगतो की आम्हाला सूचना सक्षम करायची आहे की नाही.


The best way that I have found to test whether my file fuzzer is working is by watching the results of my mutation in action while testing the target application.

माझ्या फाईल फझरची चाचणी घेण्यासाठी, लक्ष्य ॲप्लिकेशनची चाचणी करताना माझ्या उत्परिवर्तनाचे परिणाम पाहणे हा सर्वोत्तम मार्ग आहे.


There is no better way than to fuzz text files than to use Windows Notepad as the test application.

टेक्स्ट फाईल्स फझ करण्यासाठी, विंडोज नोटपॅडचा टेस्ट ॲप्लिकेशन म्हणून वापरण्यापेक्षा चांगला दुसरा कोणताही मार्ग नाही.


Before you get started, create an examples directory and a crashes directory, in the same directory from where you are running the file_fuzzer.py script.

सुरुवात करण्यापूर्वी, file_fuzzer.py स्क्रिप्ट जिथे चालवत आहात त्याच डिरेक्टरीमध्ये उदाहरणे (examples) आणि क्रॅश (crashes) डिरेक्टरी तयार करा.


Once you have added the directories, create a couple of dummy text files and place them in the examples directory.

एकदा तुम्ही डिरेक्टरी ॲड केल्यावर, काही डमी टेक्स्ट फाईल्स तयार करा आणि त्या उदाहरणे (examples) डिरेक्टरीमध्ये ठेवा.


Code coverage is a metric that measures how much code you execute when testing a target application.

कोड कव्हरेज हे एक मेट्रिक आहे जे लक्ष्य ॲप्लिकेशनची चाचणी करताना तुम्ही किती कोड कार्यान्वित करता हे मोजते.


Fuzzing expert Charlie Miller has empirically proven that an increase in code coverage will yield an increase in the number of bugs you find.

फझिंग तज्ञ चार्ली मिलरने अनुभवजन्यदृष्ट्या सिद्ध केले आहे की कोड कव्हरेज वाढल्याने तुम्हाला सापडणाऱ्या बग्सची संख्या वाढेल.


Automated static analysis of a binary to find hot spots in the target code can be extremely useful for a bughunter.

लक्ष्य कोडमधील हॉट स्पॉट्स शोधण्यासाठी बायनरीचे स्वयंचलित स्थिर विश्लेषण बगहंटरसाठी अत्यंत उपयुक्त ठरू शकते.


The more your fuzzer knows about the target application, the better your chance of finding bugs.

तुमच्या फझरला लक्ष्य ॲप्लिकेशनबद्दल जितके जास्त माहिती असेल तितके बग शोधण्याची शक्यता जास्त असते.


Sulley is more than just a fuzzer; it comes packed with packet-capturing capabilities, extensive crash reporting, and VMWare automation.

सली केवळ फझरपेक्षा अधिक आहे; ते पॅकेट-कॅप्चरिंग क्षमता, विस्तृत क्रॅश रिपोर्टिंग आणि व्हीएमवेअर ऑटोमेशनसह येते.


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 चा संदर्भ घ्या.


CWD <DIRECTORY> - change working directory to DIRECTORY

CWD <DIRECTORY> - वर्तमान कार्यशील निर्देशिका DIRECTORY मध्ये बदला.


DELE <FILENAME> - delete a remote file FILENAME

DELE <FILENAME> - दूरस्थ फाईल FILENAME हटवा.


MDTM <FILENAME> - return last modified time for file FILENAME

MDTM <FILENAME> - FILENAME फाईलची शेवटची सुधारित वेळ परत करा.


MKD <DIRECTORY> - create directory DIRECTORY

MKD <DIRECTORY> - DIRECTORY निर्देशिका तयार करा.


It’s a far from an exhaustive list, but it gives us some additional coverage, so let’s take what we know and translate it into a Sulley protocol description.

ही संपूर्ण यादी नाही, पण यामुळे आपल्याला काही अतिरिक्त कव्हरेज मिळतं, चला तर, आपल्याला जे माहित आहे ते घेऊन ते सुली प्रोटोकॉल वर्णनात रूपांतरित करूया.


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.

सुरुवात करण्यासाठी, चला एक सेशन्स फाईल परिभाषित करूया आणि विविध भागांचे विश्लेषण करूया.


Crack open a new Python file, name it ftp_session.py, and enter the following code.

नवीन पायथन फाईल उघडा, ftp_session.py असे नाव द्या आणि खालील कोड प्रविष्ट करा.


The receive_ftp_banner() function is necessary because every FTP server has a banner that it displays when a client connects.

receive_ftp_banner() फंक्शन आवश्यक आहे कारण प्रत्येक FTP सर्व्हरमध्ये एक बॅनर असतो जो क्लायंट कनेक्ट झाल्यावर प्रदर्शित करतो.


We tie this to the sess.pre_send property, which tells Sulley to receive the FTP banner before sending any fuzz data.

आम्ही हे sess.pre_send प्रॉपर्टीशी जोडतो, जे सुलीला कोणतेही फझ डेटा पाठवण्यापूर्वी FTP बॅनर प्राप्त करण्यास सांगते.


The first step in creating the session is to define a session file that keeps track of the current state of our fuzzer.

सत्र तयार करण्याचा पहिला टप्पा म्हणजे एक सत्र फाइल परिभाषित करणे जे आपल्या फझरची वर्तमान स्थिती ट्रॅक करते.


The second step is to define a target to attack, which is an IP address and a port number.

दुसरा टप्पा म्हणजे हल्ला करण्यासाठी एक लक्ष्य परिभाषित करणे, जे एक IP ऍड्रेस आणि पोर्ट नंबर आहे.


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 third entry tells Sulley that our network sniffer is set up on the same host and is listening on TCP port 26001, which is the port on which it will accept commands from Sulley.

तिसरा एंट्री सुलीला सांगते की, आमचे नेटवर्क स्निफर त्याच होस्टवर सेट केले आहे आणि TCP पोर्ट 26001 वर ऐकत आहे, जो पोर्ट सुलीकडून कमांड स्वीकारेल.


We then add the defined target to our parent session.

मग आम्ही परिभाषित लक्ष्य आमच्या मुख्य सत्रात जोडतो.


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 विनंत्यांवर प्रक्रिया करते.


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 code utilizes Immunity Debugger’s powerful search API to find all possible matches against our search criteria.

हा कोड आपल्या शोध निकषांविरुद्ध सर्व संभाव्य जुळणारे शोधण्यासाठी इम्युनिटी डीबगरच्या शक्तिशाली शोध API चा उपयोग करतो.


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, but these are the most common two that I have encountered.

स्विच{} स्टेटमेंट असेंब्लीमध्ये भाषांतरित करण्याचे अनेक मार्ग असू शकतात, परंतु हे सर्वात सामान्य दोन आहेत जे मला आढळले आहेत.


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 कोड असावा जो ड्रायव्हर सपोर्ट करतो.


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!

आता आपल्याला माहित आहे की ड्रायव्हरलिब आपल्यासाठी काही काम कसे करते, चला त्याचा फायदा घेऊया!


We will use driverlib to hunt down device names and supported IOCTL codes from a driver and save these results to a Python pickle.

आम्ही ड्रायव्हरमधून डिव्हाइसची नावे आणि समर्थित IOCTL कोड शोधण्यासाठी ड्रायव्हरलिबचा वापर करू आणि हे परिणाम पायथन पिकलमध्ये सेव्ह करू.


Simply load a target driver into Immunity Debugger and run the PyCommand like so: !ioctl_dump.

फक्त लक्ष्यित ड्रायव्हर इम्युनिटी डीबगरमध्ये लोड करा आणि PyCommand अशा प्रकारे चालवा: !ioctl_dump.


If your fuzzer does actually crash the machine you’re working on, it will be fairly obvious which IOCTL code caused it, because your log file will show you the last IOCTL code that had successfully been run.

जर तुमच्या फझरने तुम्ही ज्या मशीनवर काम करत आहात ते क्रॅश केले, तर ते कोणत्या IOCTL कोडमुळे झाले हे स्पष्ट होईल, कारण तुमची लॉग फाइल तुम्हाला शेवटचा IOCTL कोड दर्शवेल जो यशस्वीरित्या चालवला गेला होता.


Python is fast becoming the programming language of choice for hackers, reverse engineers, and software testers.

हॅकर्स, रिव्हर्स इंजिनिअर्स आणि सॉफ्टवेअर परीक्षकांसाठी पायथन ही जलद गतीने निवडक प्रोग्रामिंग भाषा बनत आहे.


Gray Hat Python explains the concepts behind hacking tools and techniques like debuggers, trojans, fuzzers, and emulators.

ग्रे हॅट पायथन डीबगर्स, ट्रोजन, फझर्स आणि एमुलेटर्स सारख्या हॅकिंग साधनांमागील संकल्पना स्पष्ट करते.


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

तुम्ही कंटाळवाणे रिव्हर्सिंग आणि सुरक्षा कार्ये स्वयंचलित करणे शिकाल.


तुमचे स्वतःचे डीबगर डिझाइन करा आणि प्रोग्राम करा.


Learn how to fuzz Windows drivers and create powerful fuzzers from scratch.

विंडोज ड्राइव्हर्सना फझ कसे करायचे आणि सुरुवातीपासून शक्तिशाली फझर्स कसे तयार करायचे ते शिका.


Sniff secure traffic out of an encrypted web browser session.

एन्क्रिप्टेड वेब ब्राउझर सत्रातून सुरक्षित रहदारी (ट्रॅफिक) स्निफ करा.


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

जगातील सर्वोत्तम हॅकर्स त्यांचे काम करण्यासाठी पायथनचा वापर करत आहेत.


तुम्ही नाही का?


The book was printed and bound at Malloy Incorporated in Ann Arbor, Michigan.

हे पुस्तक एन अर्बोर, मिशिगन येथील मॅलॉय इन्कॉर्पोरेटेड येथे छापले आणि बांधले गेले.


The paper is Glatfelter Spring Forge 60# Antique.

या पुस्तकासाठी ग्लॅटफेल्टर स्प्रिंग फोर्ज 60# अँटिक कागद वापरला आहे.


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

EFF ने दूरसंचार कंपनी AT&T वर NSA ला अमर्यादित प्रवेश (access) दिल्याबद्दल दावा दाखल केला आहे.


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

EFF चा कोडर राइट्स प्रकल्प प्रोग्रामर्सच्या अधिकारांचे संरक्षण करत आहे.


EFF's Patent Busting Project challenges overbroad patents.

EFF चा पेटंट बस्टिंग प्रकल्प जास्त विस्तृत पेटंट्सना आव्हान देतो.


EFF प्रतिबंधात्मक मानकांविरुद्ध लढत आहे.


EFF has developed the Switzerland Network Testing Tool.

EFF ने स्वित्झर्लंड नेटवर्क टेस्टिंग टूल विकसित केले आहे.


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

आंतरराष्ट्रीय करार (treaties) आपल्या भाषण स्वातंत्र्यावर (free speech) बंधने घालत नाहीत, हे सुनिश्चित करण्यासाठी EFF काम करत आहे.


Hacking is the art of creative problem solving.

हॅकिंग म्हणजे सर्जनशील समस्या सोडवण्याची कला आहे.


This book is truly unlike anything else out there.

हे पुस्तक खरोखरच इतर कोणत्याही पुस्तकासारखे नाही.


After learning how to graph and display data correctly, readers will be able to understand complex data sets at a glance.

डेटा योग्यरित्या कसा ग्राफ करायचा आणि प्रदर्शित करायचा हे शिकल्यानंतर, वाचक एका दृष्टीक्षेपात जटिल डेटा संच (data sets) समजून घेण्यास सक्षम असतील.


Python is powerful but has a very gentle learning curve.

पायथन शक्तिशाली आहे, परंतु त्याचा लर्निंग वक्र (learning curve) खूप सोपा आहे.


Listing 11-1. Cross References to sprintf

सूची 11-1. स्प्रिन्टफसाठी क्रॉस संदर्भ


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

नमूद केलेले सर्व पत्ते हे स्प्रिन्टफ फंक्शन वापरले जात आहे ती ठिकाणे आहेत.


If you browse to those addresses in the IDA graph view, you should see that the instruction is colored in.

जर तुम्ही IDA ग्राफ दृश्यात त्या पत्त्यांवर ब्राउझ केले, तर तुम्हाला दिसेल की सूचना रंगीत आहे.


Figure 11-3: sprintf call colored in from the cross_ref.py script

आकृती 11-3: cross_ref.py स्क्रिप्टमधून रंगीत sprintf कॉल


When performing dynamic analysis on a target binary, it can be quite useful to understand what code gets executed.

लक्ष्यित बायनरीवर डायनॅमिक विश्लेषण करत असताना, कोणते कोड कार्यान्वित होतात हे समजून घेणे खूप उपयुक्त ठरू शकते.


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

आम्ही लक्ष्यित बायनरीमधील सर्व फंक्शन्समध्ये पुनरावृत्ती करण्यासाठी आणि ब्रेकपॉइंट सेट करण्यासाठी IDAPython वापरू.


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

नवीन पायथन फाईल उघडा, 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.

कधीकधी संभाव्य असुरक्षिततेसाठी बायनरीचे मूल्यांकन करताना, स्टॅकचा आकार समजून घेणे महत्त्वाचे आहे.


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.

चला, बायनरीमधील सर्व फंक्शन्समध्ये पुनरावृत्ती करण्यासाठी आणि स्टॅक-अलोकेटेड बफर्स असलेली सर्व फंक्शन्स दर्शविण्यासाठी काही कोड लिहूया.


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

नवीन पायथन फाईल उघडा, 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.

त्यानंतर, आम्ही सर्व फंक्शन्समध्ये पुनरावृत्ती करण्यास सुरुवात करतो, प्रत्येक फंक्शनसाठी स्टॅक फ्रेम ऑब्जेक्ट मिळवतो.


After running this against a binary, you should see some output (providing there are some stack- allocated buffers).

एका बायनरीवर हे रन केल्यानंतर, तुम्हाला काही आउटपुट दिसेल (काही स्टॅक-अलोकेटेड बफर्स असल्यास).


You should now have the fundamentals for using IDAPython and have some core utility scripts.

आता तुमच्याकडे IDAPython वापरण्यासाठी मूलभूत गोष्टी असतील आणि काही मुख्य उपयुक्तता स्क्रिप्ट्स असतील.


PyEmu was released at BlackHat 2007 by Cody Pierce.

कोडी पियर्सने ब्लॅकहॅट 2007 मध्ये PyEmu प्रसिद्ध केले.


First we instantiate the IDAPyEmu object, which is necessary in order for us to use any of the emulator’s methods.

सुरुवातीला, आपण IDAPyEmu ऑब्जेक्ट तयार करतो, जेणेकरून आपण एमुलेटरच्या कोणत्याही पद्धती वापरू शकाल.


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 च्या मेमरीमध्ये साठवण्यासाठी विभाग बाय-बाय-बाय (byte by byte) फिरवतो.


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, install an instruction handler to be called when the retn instruction is executed, and begin execution.

आता आपल्याकडे कोड आणि डेटा विभाग मेमरीमध्ये लोड झाले आहेत, आम्ही फंक्शन कॉलसाठी स्टॅक पॅरामीटर्स सेट करणार आहोत, retn सूचना कार्यान्वित झाल्यावर बोलावण्यासाठी एक सूचना हँडलर स्थापित करू आणि अंमलबजावणी सुरू करू.


We first set EIP to the head of the function, which is located at 0x00401000; this is where PyEmu will begin executing instructions.

सुरुवातीला, आम्ही EIP फंक्शनच्या शीर्षस्थानी सेट करतो, जे 0x00401000 वर स्थित आहे; येथेच PyEmu सूचना कार्यान्वित करण्यास सुरुवात करेल.


Next we set up the mnemonic, or instruction, handler to be called when the function’s retn instruction is executed.

पुढील, आम्ही फंक्शनची retn सूचना कार्यान्वित झाल्यावर बोलावण्यासाठी स्मृतीचिन्ह, किंवा सूचना, हँडलर सेट करतो.


The third step is to set the stack parameters for the function call.

तिसरा टप्पा म्हणजे फंक्शन कॉलसाठी स्टॅक पॅरामीटर्स सेट करणे.


These are the two numbers to be added together; in our case we are using 0x00000001 and 0x00000002.

हे दोन आकडे एकत्र जोडले जातील; आमच्या बाबतीत, आम्ही 0x00000001 आणि 0x00000002 वापरत आहोत.


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

त्यानंतर, आम्ही PyEmu ला फंक्शनमध्ये समाविष्ट असलेल्या सर्व 10 सूचना कार्यान्वित करण्यास सांगतो.


The last step is coding the retn instruction handler, so the final script should look like the following.

शेवटचा टप्पा म्हणजे retn सूचना हँडलरचे कोडिंग करणे, त्यामुळे अंतिम स्क्रिप्ट खालीलप्रमाणे दिसली पाहिजे.


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

ret सूचना हँडलर फक्त स्टॅक वितर्क आणि 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.

फंक्शन रिव्हर्स (reverse) करण्याची ही पद्धत वापरून, तुम्ही मॅन्युअल रिव्हर्सिंगचे (reversing) तास वाचवू शकता.


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

आता, कॉम्प्रेस्ड (compressed) एक्झिक्युटेबल (executable) अनपॅक (unpack) करण्यासाठी PEPyEmu लायब्ररी वापरूया.


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

एक्झिक्युटेबल पॅकर्स (executable packers) किंवा कंप्रेसर (compressors) बऱ्याच काळापासून अस्तित्वात आहेत.


Originally they were used to reduce the size of an executable so that it could fit on a 1.44MB floppy disk, but they have since grown to be a major part of code obfuscation for malware authors.

सुरुवातीला, ते एक्झिक्युटेबलचा आकार कमी करण्यासाठी वापरले जात होते जेणेकरून ते 1.44MB फ्लॉपी डिस्कवर बसू शकेल, परंतु ते आता मालवेअर (malware) लेखकांसाठी कोड अस्पष्टतेचा (code obfuscation) एक महत्त्वाचा भाग बनले आहेत.


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

एक सामान्य पॅकर (packer) लक्ष्य बायनरीचे (binary) कोड आणि डेटा विभाग संकुचित करेल आणि एंट्री पॉइंट (entry point) डीकंप्रेसरने (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) जातो.