讀 《python灰帽子-黑客與逆向工程師的python程式設計之道》筆記其實這本書就是基於 ctypes 庫的, 使用這個庫, 可以呼叫動態鏈結庫中函式、同時建立各種複雜的 c 資料型別和底層操作函式.
學 c 的時候就學過函式的呼叫約定, 先來回顧一下
fastcall呼叫約定
cdecl呼叫約定
stdcall呼叫約定
mov eax, ***
mov ecx, ***
mov ebx, ***
call message
push parameter3
push parameter2
push parameter1
call message
add esp,0ch
push parameter3
push parameter2
push parameter1
call message
通過暫存器來傳送引數,被呼叫方清理堆疊
引數從右到左傳遞,每乙個呼叫它的函式都包含清空堆疊的**,所以產生的可執行檔案大小會比呼叫_stdcall函式的大.
vc編譯器預設使用該方式
引數從右到左傳遞,被調函式自身在返回前清空堆疊.
標準呼叫方式,一般win32的函式都是
ctypes 庫也提供了三種不同的動態鏈結庫載入方式: cdll()、windll() 和 oledll().
我們來嘗試下呼叫 msvcrt.dll 中的 printf 函式.
from ctypes import *
#帶有可變引數的函式必須且只能使用_cdecl方式, 如 printf
msvcrt = cdll.msvcrt
message = 'hello'
msvcrt.printf('%s\n', message)
ctype 提供了一些與 c 互換的基本資料型別, 這就可以通過 ctype 來方便的建立 c 資料型別.
ctype 也支援引用傳參, 對於需要傳引用的引數像這樣傳就可以了: ctypes.byref(object)使用 ctypes 中的 structure 來實現 c 結構體.
class
rule_list_infomation
(structure):
_fields_ = [
("psz_time", c_char * 100),
("complete", c_int),
]
這段**實現了下面的 c 結構體.
struct rule_list_infomation;
c 結構體有記憶體對齊這個概念, 這點在 cytpe 的 structure 中也有體現, structure 預設的記憶體對齊方式和 c 編譯器的方式相同(4位元組), 通過在子類中定義乙個_pack_ 屬性可以覆蓋這個行為, 如 c 中的 #pragma pack(1) 對應 _pack_ = 1. 我的Hacker之路(一)Ctypes的呼叫
我主要是實踐 linux黑客的python程式設計之道 中的所有內容,在此感謝 網名 天國之翼 自由之光 winger 在閱讀此書之前 假設大家已經對各種黑客工具 技術 偵錯程式,後門,fuzzer 器,注入 都有乙個理論上的認識。我們的目的是不僅僅會使用各種基於 python 編寫的工具,還要能夠...
使用ctypes過程中遇到的問題(一)
雙指標型資料引數傳遞呼叫 動態庫中的函式有雙指標函式並且需要調回python使用 動態庫中的函式,標頭檔案 double irisdt api irisdetectprocess const char imgpath,const char modelpath,int dtthre,int pwins...
黑客學習筆記教程之一 黑客文化
不過,我也發現了一些問題,就是網上的多數教程或者是內容散亂,邏輯性不強,或者是隔靴搔癢讓人很不過癮。為此,我決定也寫乙份教程,談談我所認識和學習的黑客技術。但說起來也很慚愧,本教程是我一面聽著中安網培的教程,一面學習著黑鷹的動畫教程,再加上我自己的課堂筆記寫的,所以很多都是別人的東西。所以,如果您學...