最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python逆向入門教程

 更新時間:2018年01月15日 10:22:28   作者:aidear_evo  
這篇文章主要介紹了python逆向入門教程,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

1、開發(fā)環(huán)境

我們在Windows 10上開始python逆向之旅,首先開始搭建開發(fā)環(huán)境,python解釋器使用最新的3.6.1,IDE使用PyCharm社區(qū)版2017.1.3,下載地址如下所示,下載完成后直接雙擊安裝包安裝即可,隨后設置PyCharm的Project Interpreter為剛才安裝的Python解釋器就可以了。

【Python】https://www.python.org/downloads/
【PyCharm】http://www.jetbrains.com/pycharm/download/#section=windows

2、ctypes

首先介紹一下ctypes,它是一個用于Python的外部函數庫,提供了與C語言兼容的數據類型,允許調用動態(tài)鏈接庫或共享庫中的函數,還可以包裝這些庫。下面是ctypes中的數據類型與C語言、Python中的數據類型的對應關系。

ctypes中的數據類型全部通過class來實現,在Python中加載C庫涉及如下幾個類。

  1. class ctypes.CDLL 加載共享庫,使用標準C函數調用慣例即cdecl,返回類型為int。
  2. class ctypes.OleDLL 加載共享庫,只用于Windows平臺,使用stdcall函數調用慣例,返回類型為HRESULT。
  3. class ctypes.WinDLL 加載共享庫,只用于Windows平臺,使用stdcall函數調用慣例,返回類型為int。
  4. class ctypes.PyDLL 類似于CDLL,與前面三個不同的是,在函數調用期間不會釋放GIL,Global Interpreter Lock。
  5. class ctypes.LibraryLoader(dlltype) dlltype為CDLL、OleDLL、WinDLL、PyDLL,這個類有一個加載共享庫的函數LoadLibrary。

加載C庫更簡單的方法是使用如下幾個預先創(chuàng)建的類實例。

ctypes.cdll
ctypes.oledll
ctypes.windll
ctypes.pydll
ctypes.pythonapi

上面提到了函數調用慣例cdecl和stdcall,cdecl的意思是函數的參數從右往左依次壓入棧內,函數的調用者在函數執(zhí)行完成之后負責函數的平衡,常用于X86架構的C語言里,返回值存儲在EAX寄存器中,從匯編代碼的角度來看,函數參數從右往左依次壓棧,然后調用函數,最后修改棧指針ESP為原來的位置。stdcall,參數傳遞的順序也是從右到左,不過棧的平衡處理由函數自己完成,而不是調用者,返回值同樣存儲在EAX中,也就是說,函數參數壓棧、函數調用之后沒有像cdecl一樣的棧指針ESP移動。

下面的例子在Python中調用C的printf函數,printf屬于“C:\Windows\System32\msvcrt.dll”,也就是Linux上的“l(fā)ibc.so”。

from ctypes import *

msvcrt = cdll.msvcrt
message = b"Hello World\n"
msvcrt.printf(b"Message is %s", message)

上面的代碼輸出“Message is Hello World”。另外,ctypes還允許在Python中定義結構和聯合等其它高級功能,詳細介紹請參考https://docs.python.org/3.6/library/ctypes.html?highlight=ctypes#。

3、調試原理

使用調試器,能夠對程序進行動態(tài)跟蹤和分析,特別是涉及到exploit、fuzzer和病毒分析的時候,動態(tài)分析程序的能力就顯得非常重要了。調試程序時,如果可以獲得源代碼,調試起來就容易一些,也就是透明的白盒測試,如果沒有源代碼,也就是黑盒測試,想要得到理想的結果,那就必須擁有高超的逆向技術和逆向工具的幫助。黑盒測試包括用戶模式與內核模式兩種情況,兩者有不同的權限。

CPU的寄存器能夠對少量的數據進行快速的存取訪問,在X86指令集里,一個CPU有八個通用寄存器:EAX、EDX、ECX、ESI、EDI、EBP、ESP和EBX,以及其它的寄存器,下面逐個介紹。
EAX:累加寄存器,除了用于存儲函數的返回值外也用于執(zhí)行計算的操作,許多優(yōu)化的X86指令集都專門設計了針對EAX寄存器的讀寫和計算指令。

EDX:數據寄存器,本質上是EAX寄存器的延伸,輔助EAX寄存器完成更多復雜的計算操作。
ECX:計數寄存器,用于循環(huán)操作,計算是向下而不是向上的,由大減到小。
ESI:Source Index,源操作數指針,存儲著輸入的數據流的位置,用于讀,高效地處理循環(huán)操作的數據。
EDI:Destination Index,目的操作數指針,存儲了計算結果存儲的位置,用于寫,高效地處理循環(huán)操作的數據。
ESP:Stack Pointer,棧指針,負責函數的調用和棧的操作,函數調用時壓棧參數和返回地址,指向棧頂即返回地址。
EBP:Base Pointer,基指針,負責函數的調用和棧的操作,函數調用時壓棧參數和返回地址,指向棧底。
EBX:唯一一個沒有特殊用途的寄存器,作為額外的數據存儲器。
EIP:Instruction Pointer,指令指針,總是指向馬上要執(zhí)行的指令。

熟悉調試器的朋友們都知道斷點,斷點其實就是一個調試事件,其它事件如經典的段錯誤(Segment Fault)等。斷點包括軟件斷點、硬件斷點和內存斷點,用于暫停被執(zhí)行程序。

軟件斷點:一個單字節(jié)的指令,將控制權轉移給調試器的斷點處理函數。匯編指令是CPU執(zhí)行的指令的高級表示方法,如下面的匯編指令MOV EAX, EBX,告訴CPU把存儲在EBX寄存器里的東西放到EAX寄存器,然而CPU并不明白這個匯編指令,必須轉化為能夠讓CPU識別的操作碼8BC3,假設這一操作發(fā)生在地址0x44332211,為了在這個地址設置斷點,暫停CPU,需要從2個字節(jié)的操作碼8BC3中換出一個單字節(jié)的操作碼,這個單字節(jié)的操作碼也就是3號中斷指令,INT3,一條能讓CPU暫停的指令,對應的操作碼為0xCC,具體如下面的代碼片段所示。當調試器被告知在目標地址設置一個斷點時,它首先讀取目標地址的第一個字節(jié)的操作碼然后保存起來,同時把地址存儲在內部的中斷列表中,接著,調試器把3號中斷指令對應的操作碼0xCC寫到剛才的地址,當CPU執(zhí)行到替換后的操作碼的時候,CPU暫停,并觸發(fā)一個INT3事件,此時調試器就能捕捉到這個事件,然后調試器通過EIP判斷這個中斷地址是否是我們設置的斷點,如果是,就把對應的操作碼寫回以恢復程序的正常運行。軟件斷點包括一次性斷點和持續(xù)性斷點,前者生效一次,后者一直生效,不生效后將其從中斷列表移除。需要注意的是,當我們改變了被調試程序的內存數據時,同時改變了運行時軟件的CRC即循環(huán)冗余代碼校驗和,CRC是一種校驗數據是否被改變的機制,廣泛應用于文件、內存、文本、網絡數據包等任何想監(jiān)視數據的地方,它將一定范圍內的數據進行hash計算,然后將hash值同此前的hash值進行比較,判斷數據是否改變,為了在這種特殊的情況下也能調試程序,就要使用下面介紹的硬件斷點了。

地址: 操作碼 匯編指令
0x44332211: 8BC3 MOV EAX, EBX
0x44332211: CCC3 MOV EAX, EBX

硬件斷點:在小塊區(qū)域內設置斷點,屬于CPU級別,使用了DR0到DR7共八個特殊的調試寄存器,這些寄存器專門用于管理硬件斷點。DR0到DR3存儲硬件斷點地址,意味著同一時間內最多只能有4個硬件斷點,DR4和DR5保留,DR6是狀態(tài)寄存器,說明被斷點觸發(fā)的調試事件的類型,DR7是開關寄存器,同時也存儲了斷點的不同類型,包括指令執(zhí)行時中斷、數據可以寫入時中斷、有數據讀或者寫但不執(zhí)行時中斷。硬件斷點使用1號中斷指令INT1,負責硬件中斷和步進事件。硬件斷點的特點是同一時間只能設置四個斷點,而且斷點起作用的區(qū)域只有四個字節(jié),如果想要跟蹤一大塊內存數據,請使用下面介紹的內存斷點。

內存斷點:用于大塊區(qū)域,不是真正的斷點,而是改變了內存中某個塊或者頁的權限。一個內存頁是操作系統(tǒng)處理的最小的內存單位,一個內存頁被申請成功后,就擁有了一個權限集,如可執(zhí)行頁、可讀頁、可寫頁,這些決定了內存該如何被訪問,任何對保護頁的訪問都會引發(fā)異常,之后頁面恢復訪問前的狀態(tài)。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • python 實現在無序數組中找到中位數方法

    python 實現在無序數組中找到中位數方法

    這篇文章主要介紹了python 實現在無序數組中找到中位數方法,具有很好對參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • 基于Python的圖像數據增強Data Augmentation解析

    基于Python的圖像數據增強Data Augmentation解析

    這篇文章主要介紹了基于Python的圖像數據增強Data Augmentation解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • Python tkinter模版代碼實例

    Python tkinter模版代碼實例

    這篇文章主要介紹了Python tkinter模版代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • python和shell變量互相傳遞的幾種方法

    python和shell變量互相傳遞的幾種方法

    這篇文章主要介紹了python和shell變量互相傳遞方法,使用了環(huán)境變量、管道等方法
    2013-11-11
  • Django 按組控制權限類及定義方法詳解

    Django 按組控制權限類及定義方法詳解

    這篇文章主要為大家介紹了Django 按組控制權限類及定義方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • PyTorch模型調試與故障排除指南

    PyTorch模型調試與故障排除指南

    在當代深度學習領域,PyTorch 已成為開發(fā)和訓練神經網絡的主要框架之一,然而隨著模型復雜度的增加和數據規(guī)模的擴大,開發(fā)者常常面臨各種調試和優(yōu)化挑戰(zhàn),本文旨在為 PyTorch 開發(fā)者提供一個全面的調試指南,涵蓋從基礎概念到高級技術的廣泛內容,需要的朋友可以參考下
    2024-09-09
  • Python編程快速上手——Excel到CSV的轉換程序案例分析

    Python編程快速上手——Excel到CSV的轉換程序案例分析

    這篇文章主要介紹了Python Excel到CSV的轉換程序,結合具體案例形式分析了Python操作Excel到CSV轉換的操作技巧與相關注意事項,需要的朋友可以參考下
    2020-02-02
  • 使用python修改文件并立即寫回到原始位置操作(inplace讀寫)

    使用python修改文件并立即寫回到原始位置操作(inplace讀寫)

    這篇文章主要介紹了使用python修改文件并立即寫回到原始位置操作(inplace讀寫),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python實例方法、類方法、靜態(tài)方法的區(qū)別與作用詳解

    Python實例方法、類方法、靜態(tài)方法的區(qū)別與作用詳解

    這篇文章主要介紹了Python實例方法、類方法、靜態(tài)方法的區(qū)別與作用,結合實例形式分析了Python面向對象程序設計中實例方法、類方法、靜態(tài)方法的概念、原理、用法及相關操作技巧,需要的朋友可以參考下
    2019-03-03
  • Python osgeo庫安裝失敗問題的解決方案

    Python osgeo庫安裝失敗問題的解決方案

    Osgeo是一個支持開源地理空間數據處理的基金會,我們可以在python中使用“osgeo”庫來訪問其提供的高效地理空間數據,在PyCharm安裝osgeo庫的時候,顯示報錯,所以本文記錄一下解決這個麻煩的步驟,需要的朋友可以參考下
    2025-04-04

最新評論

专栏| 张家港市| 宁化县| 阳春市| 石渠县| 绵竹市| 怀来县| 沁源县| 永年县| 静乐县| 油尖旺区| 同心县| 始兴县| 泰兴市| 滦平县| 万山特区| 彰化市| 阿拉尔市| 叶城县| 壤塘县| 三门县| 伊金霍洛旗| 漯河市| 屏东县| 云和县| 呈贡县| 哈尔滨市| 铜川市| 阳信县| 华阴市| 肃宁县| 惠州市| 永善县| 黄骅市| 铁岭县| 平昌县| 页游| 南澳县| 蒙自县| 西盟| 武邑县|