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