pyc文件反编译
pyc文件結構
文件格式:
03f3 0d0a magic表示python的版本信息,此處03f30d0a是python2.7的標識;
6206 b160 時間戳,編譯的時間信息
63 Blockde的開頭
后4字節0000 0000 :argcount參數個數
后4字節0000 0000: nlocals局部變量個數
后4字節1b00 0000: stacksize棧空間大小
后4字節4000 0000:flags
73:類型string
3501 0000 字節長度(小端模式)
之后即為opcode
參考:PYC文件格式分析
?其中目前我們比較關注的是字節長度,因為如果修改了其源代碼,則長度必隨之改變,因此這個數值也要隨之修改,并且注意他是小端序存儲。
源碼混肴:
可以反編譯出來,但是反編譯出來很難使人們看懂。比較著名的有AST語法樹。
pyc混肴
對于可執行的pyc,我們可以使用pycdump工具進行轉儲,查看其字節碼形式。
將相應pyc文件保存在pycdump文件夾下,運行 python dump.py test.py
?這是一種直接跳轉混肴:
前三個jump運行邏輯上沒有問題,但是會導致反編譯失敗 其字節碼為 0x71 0x**
我們可以插入許多這樣類似的指令,任意的不合法指令(其實隨機數據都可以),然后用一些 JUMP 指令去跳過這樣的不合法指令,造成混肴的目的,并且不影響程序正常運行。
處理辦法:我們將這三條指令刪除,并且將code_string的長度減少6個字節。也就是上面的
3501 0000 字節長度(小端模式),然后保存。最后再使用uncompyle6反編譯,進行分析。
重疊指令:
# 例1 Python單重疊指令 0 JUMP_ABSOLUTE [71 05 00] 5 3 PRINT_ITEM [47 -- --] 4 LOAD_CONST [64 64 01] 356 7 STOP_CODE [00 -- --]# 例1 實際執行 0 JUMP_ABSOLUTE [71 05 00] 5 5 LOAD_CONST [64 01 00] 1?這里跳轉到了第三行,但是沒有執行第三行的所有代碼,而是把他的操作數看成代碼執行。
uncompyle6 -o total.py .\test.pyc
參考:?
更多的字節碼混淆技術?
簡單入門python字節碼混淆
總結
- 上一篇: Hgame 2022 Answer‘s
- 下一篇: DFS算法走迷宫(python实现)