7.27 pyc文件反編譯到Python源碼及base64模塊在python中的應用

對 Python 加密時可能會有兩種形式,一種是對Python轉成的exe進行保護,另一種是直接對.py或者.pyc文件進行保護。
所以對這個.pyc文件我們直接在python在線反編譯工具(https://tool.lu/pyc/) 打開,得到了如下的代碼:

#!/usr/bin/env python
# visit http://tool.lu/pyc/ for more information
import base64
def encode(message):
    s = ''
    for i in message:
        x = ord(i) ^ 32
        x = x + 16
        s += chr(x)

    return base64.b64encode(s)#對s進行base64編碼

correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
flag = ''
print 'Input flag:'
flag = raw_input()#輸入flag
if encode(flag) == correct:#如果flag調用上面的函數後值等於 correct,就輸出correct
    print 'correct'
else:
    print 'wrong'

分析上述代碼,我們只要將這個串”XlNkVmtUI1MgXWBZXCFeKY+AaXNt”解一次base64
再將每個字符ascii碼都減下16,接着與32異或即可得到flag。
用python編寫腳本如下:

import base64
correct='XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
s = base64.b64decode(correct)#對correct進行解碼
flag =''
for i in range(len(s)):
   x=ord(s[i])
   x=x-16
   flag += chr(x^32)
print flag

python2中進行base64編碼和解碼

import base64
s = ‘我是字符串’
a = base64.b64encode(s)#編碼
print a
ztLKx9fWt/u0rg==
print base64.b64decode(a)#解碼
我是字符串
python3不太一樣:因爲3.x中字符都爲unicode編碼,而b64encode函數的參數爲byte類型,所以必須先轉碼。
import base64
encodestr = base64.b64encode(‘abcr34r344r’.encode(‘utf-8’))
print(encodestr)
打印結果爲
b’YWJjcjM0cjM0NHI=’
結果和我們預想的有點區別,我們只想要獲得YWJjcjM0cjM0NHI=,而字符串被b”包圍了。
b 表示 byte的意思,我們只要再將byte轉換回去就好了。。。源碼如下
import base64
encodestr = base64.b64encode(‘abcr34r344r’.encode(‘utf-8’))
print(str(encodestr,’utf-8’))
打印結果爲
YWJjcjM0cjM0NHI=

補充:
base64模塊真正用的上的方法只有8個,分別是encode, decode, encodestring, decodestring, b64encode,b64decode, urlsafe_b64decode,urlsafe_b64encode。他們8個可以兩兩分爲4組,encode,decode一組,專門用來編碼和 解碼文件的,也可以對StringIO裏的數據做編解碼;encodestring,decodestring一組,專門用來編碼和解碼字符串; b64encode和b64decode一組,用來編碼和解碼字符串,並且有一個替換符號字符的功能。這個功能是這樣的:因爲base64編碼後的字符除 了英文字母和數字外還有三個字符 + / =, 其中=只是爲了補全編碼後的字符數爲4的整數,而+和/在一些情況下需要被替換的,b64encode和b64decode正是提供了這樣的功能。至於什 麼情況下+和/需要被替換,最常見的就是對url進行base64編碼的時候,urlsafe_b64encode和urlsafe_b64decode 一組,這個就是用來專門對url進行base64編解碼的,實際上也是調用的前一組函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章