題:
用Python編寫的逆向工程程序,使用“ freeze”編譯
ThatOneGuy
2014-07-15 10:22:21 UTC
view on stackexchange narkive permalink

我試圖對使用Python附帶的“ Freeze”或“ pfreeze”實用程序編譯的EXE進行反向工程(不要與“ cx_freeze”混淆)。 EXE內有一個名為 PyImport_FrozenModules 的內存數組。當程序啟動時,該數組將填充程序的字節碼(aka .pyo / .pyc文件)。我已經對此進行了幾個月的研究,但現在我處於停滯狀態。我需要找到一種從該數組中提取字節碼的方法。該程序最初連接到服務器,因此一旦執行EXE,它將在崩潰前運行約10-20秒。要延長10-20秒,我需要暫停程序(使用“ Process Explorer”很容易做到)

我需要幫助的實際上是轉儲 PyImport_FrozenModules ,因此我可以獲取.pyc,然後從那裡繼續。

我已經可以將其轉到::enter image description here
鏈接: http:// gyazo。 com / 83bcde5240df7fb9ec34e7e3de7699ba sub>

將exe加載到ollydbg之類的調試器中,找到導入行,然後將其設置為NOP。有人說我必須寫一個腳本,其他人說這比我想像的要容易。我只是不知道從哪裡開始。

任何幫助都將受到讚賞。謝謝。

我了解到您可以在“所有名稱”中輕鬆找到功能。還在何處,如何以及何時為不同版本的python計算python幻數?
一 回答:
0xec
2014-07-15 15:06:14 UTC
view on stackexchange narkive permalink

這是在這種情況下的處理方法。

步驟1 :在可執行程序中加載可執行文件,例如Ollydbg。

步驟2 :在內存轉儲窗口中,通過按 Ctrl kbd> + G kbd>

導航到 PyImport_FrozenModules >步驟3 PyImport_FrozenModules 是一個指針,該指針已初始化為指向 struct _frozen 記錄的數組。在 dump 中跟隨此指針。

第4步:現在,您位於存在 _frozen 數組的位置結構。此結構定義為

  struct _frozen {char * name;無符號字符* code; int size;};  

上面的數組由其所有成員均為null的結構終止。

步驟5 :在在上述結構中,第一個成員是指向凍結模塊名稱的指針, 第二個成員是指向模塊字節碼的指針。 (這就是您要找的東西) 。最後一個成員將為您提供字節碼的大小(以字節為單位)。使用大小將字節碼轉儲到文件中。 (對於python 2.7,它是03 F3 0D 0A,後跟4個字節的時間戳)添加標頭,現在文件應該是可反編譯的。

要使上述過程自動化,您還可以編寫腳本。


UPDATE

這裡是一個PyCommand(抗擾度調試程序腳本)以轉儲凍結的模塊。加載所有凍結的模塊後,需要運行腳本。為此,您可以在函數 PyImport_ImportFrozenModule()上設置一個斷點,以便可以在每個凍結的模塊加載時對其進行跟踪。如果您不熟悉Immunity Debugger,請參閱

  import immlib
DESC ='PyCommand轉儲凍結的python模塊'PYTHONMAGIC ='\ x03 \ xF3 \ x0D \ x0A \ x00 \ x00 \ x00 \ x00'#根據使用的python版本更改此值。此處給出的值適用於Python 2.7''',當所有凍結的模塊都加載後運行此py命令,這會將每個凍結的模塊轉儲到抗擾調試器安裝目錄中的.pyc文件中''''def main(args):imm = immlib。 Debugger()addr = imm.getAddress('PyImport_FrozenModules')structAddr = imm.readLong(addr)而True:ptrToName = imm.readLong(structAddr)ptrToCode = imm.readLong(structAddr + 4)sizeOfCode = imm.readLong(structAddr + 8)structAddr + = 12#如果ptrToName == 0且ptrToCode == 0且sizeOfCode == 0,則該數組以其成員為null的結構終止:如果sizeOfCode > 0和sizeOfCode < 2147483647:模塊名= imm.readString( ptrToName)moduleCode = imm.readMemory(ptrToCode,sizeOfCode)#您可以在此處更改輸出路徑open(moduleName +'.pyc','wb')。write(PYTHONMAGIC + moduleCode)return'[*] Frozen m odules' 

轉儲凍結的模塊後,對生成的 pyc 文件使用反編譯器。您可以為此使用 Easy Python Decompiler

非常感謝你的答复。我只是停留在“ struct_frozen”數組上。另外,當您說“將字節碼轉儲到文件中”時,我不確定您的意思。謝謝。
@ThatOneGuy我的意思是在Ollydbg內存轉儲窗口中,選擇包含字節碼的範圍,然後右鍵單擊->備份->將數據保存到文件。這樣,您可以轉儲字節碼。
我被困在這,我的壞。告訴我這是否正確:我將在反彙編程序中找到此行http://gyazo.com/f9e8c1db5bd63b314658cc901792a184然後,我右鍵單擊並單擊“跟隨轉儲”,然後從那裡繼續。那是對的嗎?我為他的新手和緊張感到抱歉。
例如,我將在右鍵單擊並單擊“跟隨轉儲”後從轉儲中復製字節,並且僅獲得十六進制值,如:00401299 A1 C4 20 40 00
@ThatOneGuy您在評論中發布的圖像不正確。您需要在“內存轉儲”窗口中遵循**`PyImport_FrozenModules` **。
-1
內存轉儲窗口,也稱為“內存映射”正確嗎?
@ThatOneGuy不,內存映射不同。參見*** [this](http://pt.gregooverse.net/?c=olly&id=2#c2)***
您介意我向您發送此程序的副本,您看看嗎?我很困惑。我以前使用過ollydbg,但似乎無法應付您的指示。
@ThatOneGuy很好,發布程序鏈接,我稍後再看。
http://www.mediafire.com/download/g228iu7ezweehj8/PiratesOnline.zip。我相信panda24.dll來自PyImport_FrozenModules
另外,在內存轉儲窗口中,我將數據保存到文件中,然後再將其擴展名更改為“ .pyc”。更改了幻數,考慮到文件大小約為4kb,在反編譯後並沒有真正放任何東西。我想我在丟錯東西。
該程序已經有一個可逆的指南。 *** [在這裡](https://www.usenix.org/legacy/event/woot08/tech/full_papers/portnoy/portnoy.pdf)***中找到它。另請參閱*** [this](http://dvlabs.tippingpoint.com/blog/2008/06/23/hacking-the-pirates-of-the-caribbean-online-mmorpg)***帖子
在互聯網上找不到防凍劑。
您是否嘗試過自己的程序?
如果有人有任何想法,請告訴我!我真的很喜歡
任何想法的@Extreme編碼器?
我猜沒人知道怎麼做:(
@ThatOneGuy我正在編寫一個ImmDbg腳本來自動執行任務。
@ThatOneGuy更新了答案。
@ThatOneGuy歡迎您。如果答案解決了您的問題,請將其標記為已回答。
一個簡單的問題,反編譯不起作用。它說“無效的.pyc / pyo”(獲取所有.pyc並嘗試反編譯它們之後)
@ThatOneGuy轉儲了多少個文件?遊戲製作用的python版本是什麼?如果與Python 2.7不同,則必須適當地更改`PYTHONMAGIC`變量。還嘗試一次反編譯文件而不是整堆文件。
它是用Python 2.4製成的
-1
HTTP://嗚嗚嗚.Media fire.com/download/請8輛大卡車也承認寶馬2如果/pirates.battle.enemy global是.培養出
-1
http://gyazo.com/d4ab515ef3d4cc97f21c3db814c1fea1看起來正確嗎?
@ThatOneGuy是的。現在再次運行腳本並反編譯。應該會成功。
@ThatOneGuy這是上面的pyc文件的反編譯版本。 http://www.datafilehost.com/d/edce8086
現在,在更改了這些內容之後,沒有任何東西可以丟棄。它說它已完成轉儲,但文件夾中沒有任何內容
@ThatOneGuy腳本應與上一個腳本相同。唯一的變化應該是“ PYTHONMAGIC ='\ x6D \ xF2 \ x0D \ x0A \ x00 \ x00 \ x00 \ x00”。您必須在運行或查找轉儲位置時犯了一些錯誤。
97%的內容均可完美反編譯。或多或少,大約3-8失敗了。它將使反編譯器崩潰。從這裡到將剩下的.pyc進行反編譯的方式是什麼?
@ThatOneGuy [嘗試使用此反編譯器](http://murphey.org/code/decompyle-2.4.tgz)
感謝一切!都做完了有什麼辦法可以刪除此問題?
@ThatOneGuy您不應該刪除問題。這將對將來的用戶有所幫助。但是,如果需要,您可以刪除指向上傳文件的鏈接(以註釋形式)。
好吧,男人!感謝您所做的一切!
你知道Python 2.4反編譯器嗎?


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...