Logo 逆向知识库

Python工具和包

解包PyInstaller#

serfend/pydumpck

pip install --upgrade pydumpck
pydumpck Py.exe

即可递归解包所有模块、程序

如果未生效,就用下面的办法:

PyInstaller Extractor 解包出 pyc,然后 在线Python pyc文件编译与反编译 (lddgo.net)

pycdc

使用方法

python pyinstxtractor.py Py.exe
.\pycdc.exe .\PyLu.pyc > PyLu.py

有个 pylingual 这个也很不错,解包 pyc 的

常用函数#

n = 123
hex(n) # 0x7b
hex(n)[2:] # 7b
bin(n) # 0b1111011
chr(n) # {
ord('{') # 123
all([true, true, false]) # false
any([true, false, false]) # true
enumerate()
map()

格式化输出#

print("{:x} {:x}".format(12345,123456)) # 3039 1e240
print("%02X" % 0xa) # 和 C 的格式化参数一样,0A

 

u 码转换#

s = "\\u6700\\u5927\\u6b63\\u6570"
print(s.encode().decode('unicode-escape'))  # 输出:最大正数

 

Crypto#

pip install pycryptodome z3-solver

bytes相关#

from Crypto.Util.number import bytes_to_long, long_to_bytes
from Crypto.Util.strxor import strxor

bytes.fromhex('7b') # b'{'
bytes([n]).hex() # 7b
bytearray.fromhex('7bab')

PyCryptodome官方文档

加密/解密相关#

from string import printable # 可打印字符集
from Crypto.Util.Padding import pad
from Crypto.Cipher import AES

print("c1 =", AES.new(key=key, nonce=iv,
      mode=AES.MODE_CTR).encrypt(pad(flag.encode(), 16)))

MD5#

r = "HelloWorld"
import hashlib
print(hashlib.md5(r.encode()).hexdigest())

解方程#

z3一把梭

Introduction | Online Z3 Guide (microsoft.github.io)

import z3
solver = z3.Solver()
flag = [z3.Int("i_%s" % (i+1)) for i in range(32)]
solver.add()
print(solver.check())
m = solver.model()
print(m)
simplify(solver.assertions()[47]) # 打印出简化的表达式

C++的z3

参考

  1. Release z3-4.13.0 · Z3Prover/z3 (github.com) 下载 z3-4.13.0-x64-win.zip
  2. 在项目中添加三个文件夹,分别为include、lib、bin
  3. 将 zip 中的 include 所有头文件、libz3.liblibz3.dll 分别放进上面的文件夹
  4. 新建VS c++ 项目,右键解决方案,属性
    • VC++目录---->包含目录 下拉 edit ---> 添加 $(ProjectDir)include
    • VC++目录---->库目录 下拉 edit ---> 添加 $(ProjectDir)lib
    • 调试 --->环境 设置 edit ---> 添加 PATH=$(ProjectDir)bin
    • Linker ---> General ---> Additional Library Directories ---> 添加 $(ProjectDir)lib
  5. 在cpp源文件加上 #pragma comment (lib, "libz3.lib")

代码示例 z3/examples/c++/example)

图形处理#

pip install opencv-contrib-python easyocr
import easyocr
# 创建reader对象
reader = easyocr.Reader(['en'],gpu=False, model_storage_directory="./Model")    result = reader.readtext(f'./data2/{i}.jpg')
# 导入所有必要的库
import cv2
import os
  
# 从指定的路径读取视频
cam = cv2.VideoCapture( "./iGotSmokynomial.mp4" )
  
try :
      
    # 创建名为data的文件夹
    if not os.path.exists( 'data' ):
        os.makedirs( 'data' )
  
# 如果未创建,则引发错误
except OSError:
    print ( 'Error: Creating directory of data' )
  
# frame
currentframe = 0
count = 0

while ( True ):
    # reading from frame
    ret, frame = cam.read()
  
    if ret:
        # 如果视频仍然存在,继续创建图像
        gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        white_pixel_count = cv2.countNonZero(gray_frame)
        total_pixels = frame.shape[0] * frame.shape[1]
        # 写入提取的图像
        if white_pixel_count > (0.99 * total_pixels):
            name = './data/' + str (count) + '.jpg'
            cv2.imwrite(name, gray_frame)
            count += 1
        # 增加计数器,以便显示创建了多少帧
        currentframe += 1
    else :
        break
# 一旦完成释放所有的空间和窗口
cam.release()
cv2.destroyAllWindows()

 

ipython#

增强版交互式python,可以显示更多信息

pip install ipython
ipython