贴一篇自己写的压缩包伪加密破解破解脚本

发布于 2023-04-21  369 次阅读


  • 上一篇misc有一道压缩包伪加密的题目,自己写了个脚本,以后就不用手改16进制辣
  • 仅用于做伪加密的题目,最好不要用于日常使用,经过测试可能出现部分文件丢失
  • 一个压缩包只包含单个的非压缩包文件,使用winrar生成压缩可以减少此脚本可能造成的压缩文件部分丢失现象

原理

  • 上一篇已经提到了,这里复述一下

  • 一个zip文件由三部分组成:压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志。

  • 50 4B 03 04:整体头文件标记

  • 00 00:密码标记1:头文件标记后2bytes(隔4个数)

  • 50 4B 01 02:目录中文件文件头标记

  • 00 00:密码标记2:目录中文件文件头标记后4byte(隔8个数)

  • 50 4B 05 06:目录结束标记

  • 只需要将50 4B 03 04和50 4B 01 02两者后面的密码标记都改成0x00即可,这里的x是奇数都行,按习惯改成9

脚本

  • 为了不用正则,逻辑有点绕
#懒得写注释了,反正也就我自己用

b=input("请输入文件名(带后缀):\n")
a=input("输入1回车解密,输入2回车加密:\n")
if(a=='1'):
    with open(b, 'rb') as f:
        str = f.read().hex()

    target = "0000"           
    mark="66666666"
    index = str.find("504b0304")  
    while(index != -1):   
        str = str[:index] + mark + str[index+8:]  

        index += 12     
        str = str[:index] + target + str[index+4:]  

        index = str.find("504b0304")
    index = str.find("66666666")  
    mark="504b0304"
    while(index != -1):    
        str = str[:index] + mark + str[index+8:]  
        index = str.find("66666666")

    target = "0000"          
    mark="66666666"
    index = str.find("504b0102")  
    while(index != -1):    
        str = str[:index] + mark + str[index+8:]  
        index += 16     
        str = str[:index] + target + str[index+4:]  
        index = str.find("504b0102")
    index = str.find("66666666")  
    mark="504b0102"
    while(index != -1):    
        str = str[:index] + mark + str[index+8:]  
        index = str.find("66666666")

    with open(b, 'wb') as f:
        f.write(bytes.fromhex(str))

if(a=='2'):
    with open(b, 'rb') as f:
        str = f.read().hex()
    target = "0900"           
    mark="66666666"
    index = str.find("504b0304")  
    while(index != -1):   
        str = str[:index] + mark + str[index+8:]  

        index += 12     
        str = str[:index] + target + str[index+4:]  

        index = str.find("504b0304")
    index = str.find("66666666")  
    mark="504b0304"
    while(index != -1):    
        str = str[:index] + mark + str[index+8:]  
        index = str.find("66666666")

    target = "0900"          
    mark="66666666"
    index = str.find("504b0102")  
    while(index != -1):    
        str = str[:index] + mark + str[index+8:]  
        index += 16     
        str = str[:index] + target + str[index+4:]  
        index = str.find("504b0102")
    index = str.find("66666666")  
    mark="504b0102"
    while(index != -1):    
        str = str[:index] + mark + str[index+8:]  
        index = str.find("66666666")

    with open(b, 'wb') as f:
        f.write(bytes.fromhex(str))

print("done!")

届ける言葉を今は育ててる
最后更新于 2024-02-07