pyd文件逆向的方法實(shí)現(xiàn)
1.何為pyd文件
? .pyd 文件是由非 Python,其它編程語(yǔ)言編寫(xiě) (或直接把 .py 文件轉(zhuǎn)換成 .c 中間文件) 編譯生成的 Python 擴(kuò)展模塊,是類(lèi)似 .so .dll 動(dòng)態(tài)鏈接庫(kù)的一種 Python 文件。(當(dāng)然,python代碼也可以打包為pyd)
? 為啥要打包成pyd文件呢?因?yàn)閜yd文件可以更好的防止反編譯,只能反匯編。如果你直接打包將python代碼直接打包為exe,是可以直接反編譯源代碼的。還有可以將c++,c等編譯為pyd給python調(diào)用。
2.淺淺試一下逆向hello,world
? 開(kāi)始第一次,一般都是從hello,world開(kāi)始學(xué)習(xí),這里我們也用hello來(lái)進(jìn)行逆向。
from distutils.core import setup from Cython.Build import cythonize setup(ext_modules=cythonize("test1.py"))
這個(gè)main.py代碼是用來(lái)將python代碼編譯為pyd的代碼
#-*- coding : utf-8-*- def say_hello(): print("hello") def say_sorry(): print("sorry")
這個(gè)test.py我寫(xiě)了兩個(gè)函數(shù),一個(gè)say_hello,一個(gè)say_sorry。我們的目標(biāo)就是改變函數(shù)功能,將say_hello輸出sorry,say_sorry輸出hello。
我們現(xiàn)在運(yùn)行main.py。會(huì)直接生成test1.cp38-win_amd64.pyd的文件,這里我們新開(kāi)一個(gè)py文件,名字叫測(cè)試.py。在這個(gè)代碼里面輸入這樣的代碼。其實(shí)這個(gè)pyd就是和python的模塊差不多??梢酝ㄟ^(guò)import調(diào)用里面的函數(shù)。
import test1 test1.say_hello() test1.say_sorry() #hello #sorry
這樣就會(huì)輸出hello和sorry。當(dāng)然,我們可能開(kāi)始不知道這個(gè)里面有啥函數(shù),我們可以利用help命令來(lái)開(kāi)里面的函數(shù)
help(test1)
可以看到以下輸出。
Help on module test1:
NAME
test1FUNCTIONS
say_hello()
say_sorry()DATA
__test__ = {}FILE
e:\xxxx\xxxxx\test1.cp38-win_amd64.pydNone
里面的FUNCTIONS我們可以進(jìn)行調(diào)用。
3.開(kāi)始逆向
? 這里,我們要用ida進(jìn)行逆向。將pyd文件拿到ida里面。
點(diǎn)擊這個(gè)view,選擇里面對(duì)的string。查看字符串
這里我們以GCTL為界限,我們查看以上的字符串。
可以看到,我們看到了sorry和hello這兩個(gè)字符串。以及我們的函數(shù)名字。這里我們點(diǎn)擊進(jìn)入hello。
可以看到這個(gè)玩意,我們現(xiàn)在的任務(wù)就是修改掉這個(gè)hello改成sorry。再保存到pyd文件就行。
4.修改字節(jié)
點(diǎn)擊這個(gè)edit,選擇這個(gè)
選出change byte。
這里是使用的16進(jìn)制,我們隨便找個(gè)網(wǎng)站,將sorry轉(zhuǎn)為16進(jìn)制
轉(zhuǎn)完之后,將16進(jìn)制填上去
填完畢后,可以看到。hello已經(jīng)變成了sorry了
這里我們保存一下,還是再patch program里面,選擇apply xxxx input file 保存文件。保存完成后。
5.測(cè)試一下修改的pyd
還是同樣的代碼。
import test1 test1.say_hello() test1.say_sorry()
可以看到輸出的兩個(gè)sorry。可以看到我們的修改成功了。
6.其他方法
? 當(dāng)然,除了這個(gè)ida修改字符串等,還有其他方法,比如hook python代碼。獲取傳參等。比如,你通過(guò)dir函數(shù)看到這個(gè)pyd文件用了base64模塊。那你可以直接hook base64模塊。來(lái)獲取傳參。這里就不展開(kāi)了,有興趣,可以自己寫(xiě)個(gè)python代碼打包成pyd,自己逆向看看。
到此這篇關(guān)于pyd文件逆向的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)pyd文件逆向內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3實(shí)現(xiàn)163郵箱SMTP發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了Python3實(shí)現(xiàn)163郵箱SMTP發(fā)送郵件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05python算法學(xué)習(xí)雙曲嵌入論文代碼實(shí)現(xiàn)數(shù)據(jù)集介紹
由于雙曲嵌入相關(guān)的文章已經(jīng)有了一系列的代碼。本篇博客主要目的實(shí)現(xiàn)最開(kāi)始的雙曲嵌入論文,將論文中有些直接寫(xiě)出來(lái)的內(nèi)容進(jìn)行了細(xì)節(jié)的推導(dǎo),同時(shí)實(shí)現(xiàn)對(duì)應(yīng)的代碼2021-11-11將Python中的數(shù)據(jù)存儲(chǔ)到系統(tǒng)本地的簡(jiǎn)單方法
這篇文章主要介紹了將Python中的數(shù)據(jù)存儲(chǔ)到系統(tǒng)本地的簡(jiǎn)單方法,主要使用了pickle模塊,需要的朋友可以參考下2015-04-04Python結(jié)合Redis開(kāi)發(fā)一個(gè)消息訂閱系統(tǒng)
消息訂閱是一種常見(jiàn)的通信模式,用于實(shí)現(xiàn)系統(tǒng)之間的解耦和異步通信,本文將詳細(xì)介紹如何使用Python實(shí)現(xiàn)一個(gè)高效與可靠的消息訂閱系統(tǒng),有需要的可以了解下2025-03-03python threading和multiprocessing模塊基本用法實(shí)例分析
這篇文章主要介紹了python threading和multiprocessing模塊基本用法,結(jié)合實(shí)例形式詳細(xì)分析了Python中threading和multiprocessing模塊基本概念、功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-07-07python解析mdf或mf4文件利器之a(chǎn)sammdf用法
這篇文章主要介紹了python解析mdf或mf4文件利器之a(chǎn)sammdf用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06Python 高級(jí)庫(kù)15 個(gè)讓新手愛(ài)不釋手(推薦)
對(duì)于初學(xué)者來(lái)說(shuō),這是一種簡(jiǎn)單易學(xué)的編程語(yǔ)言;另一個(gè)原因:大量開(kāi)箱即用的第三方庫(kù),正是 23 萬(wàn)個(gè)由用戶提供的軟件包使得 Python 真正強(qiáng)大和流行,本文給大家分享15 個(gè)讓新手愛(ài)不釋手Python 高級(jí)庫(kù)的相關(guān)知識(shí),感興趣的朋友一起看看吧2021-05-05