- 上一篇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!")