python逆向什麼意思 python逆向入門教程

2021-10-16 20:24:51 字數 2945 閱讀 2623

1、開發環境

2、ctypes

首先介紹一下ctypes,它是乙個用於python的外部函式庫,提供了與c語言相容的資料型別,允許呼叫動態鏈結庫或共享庫中的函式,還可以包裝這些庫。下面是ctypes中的資料型別與c語言、python中的資料型別的對應關係。

ctypes中的資料型別全部通過class來實現,在python中載入c庫涉及如下幾個類。

class ctypes.cdll 載入共享庫,使用標準c函式呼叫慣例即cdecl,返回型別為int。

class ctypes.oledll 載入共享庫,只用於windows平台,使用stdcall函式呼叫慣例,返回型別為hresult。

class ctypes.windll 載入共享庫,只用於windows平台,使用stdcall函式呼叫慣例,返回型別為int。

class ctypes.pydll 類似於cdll,與前面三個不同的是,在函式呼叫期間不會釋放gil,global interpreter lock。

class ctypes.libraryloader(dlltype) dlltype為cdll、oledll、windll、pydll,這個類有乙個載入共享庫的函式loadlibrary。

載入c庫更簡單的方法是使用如下幾個預先建立的類例項。

上面提到了函式呼叫慣例cdecl和stdcall,cdecl的意思是函式的引數從右往左依次壓入棧內,函式的呼叫者在函式執行完成之後負責函式的平衡,常用於x86架構的c語言裡,返回值儲存在eax暫存器中,從彙編**的角度來看,函式引數從右往左依次壓棧,然後呼叫函式,最後修改棧指標esp為原來的位置。stdcall,引數傳遞的順序也是從右到左,不過棧的平衡處理由函式自己完成,而不是呼叫者,返回值同樣儲存在eax中,也就是說,函式引數壓棧、函式呼叫之後沒有像cdecl一樣的棧指標esp移動。

下面的例子在python中呼叫c的printf函式,printf屬於「c:\windows\system32\msvcrt.dll」,也就是linux上的「libc.so」。

上面的**輸出「message is hello world」。另外,ctypes還允許在python中定義結構和聯合等其它高階功能,詳細介紹請參考

3、除錯原理

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

cpu的暫存器能夠對少量的資料進行快速的訪問訪問,在x86指令集裡,乙個cpu有八個通用暫存器:eax、edx、ecx、esi、edi、ebp、esp和ebx,以及其它的暫存器,下面逐個介紹。

eax:累加暫存器,除了用於儲存函式的返回值外也用於執行計算的操作,許多優化的x86指令集都專門設計了針對eax暫存器的讀寫和計算指令。

ecx:計數暫存器,用於迴圈操作,計算是向下而不是向上的,由大減到小。

esi:source index,源運算元指標,儲存著輸入的資料流的位置,用於讀,高效地處理迴圈操作的資料。

edi:destination index,目的運算元指標,儲存了計算結果儲存的位置,用於寫,高效地處理迴圈操作的資料。

ebx:唯一乙個沒有特殊用途的暫存器,作為額外的資料儲存器。

eip:instruction pointer,指令指標,總是指向馬上要執行的指令。

熟悉偵錯程式的朋友們都知道斷點,斷點其實就是乙個除錯事件,其它事件如經典的段錯誤(segment fault)等。斷點包括軟體斷點、硬體斷點和記憶體斷點,用於暫停被執行程式。

軟體斷點:乙個單位元組的指令,將控制權轉移給偵錯程式的斷點處理函式。彙編指令是cpu執行的指令的高階表示方法,如下面的彙編指令mov eax, ebx,告訴cpu把儲存在ebx暫存器裡的東西放到eax暫存器,然而cpu並不明白這個彙編指令,必須轉化為能夠讓cpu識別的操作碼8bc3,假設這一操作發生在位址0x44332211,為了在這個位址設定斷點,暫停cpu,需要從2個位元組的操作碼8bc3中換出乙個單位元組的操作碼,這個單位元組的操作碼也就是3號中斷指令,int3,一條能讓cpu暫停的指令,對應的操作碼為0xcc,具體如下面的**片段所示。當偵錯程式被告知在目標位址設定乙個斷點時,它首先讀取目標位址的第乙個位元組的操作碼然後儲存起來,同時把位址儲存在內部的中斷列表中,接著,偵錯程式把3號中斷指令對應的操作碼0xcc寫到剛才的位址,當cpu執行到替換後的操作碼的時候,cpu暫停,並觸發乙個int3事件,此時偵錯程式就能捕捉到這個事件,然後偵錯程式通過eip判斷這個中斷位址是否是我們設定的斷點,如果是,就把對應的操作碼寫回以恢復程式的正常執行。軟體斷點包括一次性斷點和持續性斷點,前者生效一次,後者一直生效,不生效後將其從中斷列表移除。需要注意的是,當我們改變了被除錯程式的記憶體資料時,同時改變了執行時軟體的crc即迴圈冗餘**校驗和,crc是一種校驗資料是否被改變的機制,廣泛應用於檔案、記憶體、文字、網路資料報等任何想監視資料的地方,它將一定範圍內的資料進行hash計算,然後將hash值同此前的hash值進行比較,判斷資料是否改變,為了在這種特殊的情況下也能除錯程式,就要使用下面介紹的硬體斷點了。

硬體斷點:在小塊區域內設定斷點,屬於cpu級別,使用了dr0到dr7共八個特殊的除錯暫存器,這些暫存器專門用於管理硬體斷點。dr0到dr3儲存硬體斷點位址,意味著同一時間內最多只能有4個硬體斷點,dr4和dr5保留,dr6是狀態暫存器,說明被斷點觸發的除錯事件的型別,dr7是開關暫存器,同時也儲存了斷點的不同型別,包括指令執行時中斷、資料可以寫入時中斷、有資料讀或者寫但不執行時中斷。硬體斷點使用1號中斷指令int1,負責硬體中斷和步進事件。硬體斷點的特點是同一時間只能設定四個斷點,而且斷點起作用的區域只有四個位元組,如果想要跟蹤一大塊記憶體資料,請使用下面介紹的記憶體斷點。

記憶體斷點:用於大塊區域,不是真正的斷點,而是改變了記憶體中某個塊或者頁的許可權。乙個記憶體頁是作業系統處理的最小的記憶體單位,乙個記憶體頁被申請成功後,就擁有了乙個許可權集,如可執行頁、可讀頁、可寫頁,這些決定了記憶體該如何被訪問,任何對保護頁的訪問都會引發異常,之後頁面恢復訪問前的狀態。

逆向工程是什麼意思 逆向工程是抄襲技術嗎

逆向工程是什麼意思 逆向工程是將機器碼bai轉換為彙編 或c語言 du 這種談話很費力。通常,逆向工程需要在實現目標的同時盡可能少地工作。逆向工程是抄襲技術嗎 這就是我要做的。學歷要求很低,需求很大。能力越強,收入越高。反向的最強大作用是通過二進位制 實現二次開發,例如編寫 魔獸世界 外掛程式,cs...

nag在逆向中是什麼意思 逆向思維的魅力

逆向思維 是對似乎已成定論的 事物和觀點反過來思考的 一種思維方式 有時候一些事我們怎麼都想不通 但是換種方式去思考 往往就會豁然開朗 下面小悠分享幾個小故事 大家一起感受一下 逆向思維的魅力 一同事和她6歲的女兒。女兒 媽媽,你真安逸,都不用做作業。同事 那我來幫你寫作業,你來檢查好嗎?女兒高興的...

python是什麼意思 python是什麼

python 是乙個高層次的結合了解釋性 編譯性 互動性和物件導向的指令碼語言。python 的設計具有很強的可讀性,相比其他語言經常使用英文關鍵字,其他語言的一些標點符號,它具有比其他語言更有特色語法結構。python 是一種解釋型語言 這意味著開發過程中沒有了編譯這個環節。類似於php和perl...