当前访客身份:游客 [ 登录 | 加入开源中国 ]

代码分享

当前位置:
代码分享 » Python  » 图形和图像处理
分享到: 
收藏 +0
1
Author:彭添
Language: Python
Core Plugins: PIL
Purpose: 利用PIL将读取的文件流编码成PNG图片(本以为图片会很炫,but...),以此逃避防火墙/其他检测系统的文件类型检测
Others: 从事防火墙开发,突发奇想怎样才能逃过防火墙的文件类型检测。
标签: <无>

代码片段(4) [全屏查看所有代码]

1. [文件] file_encode.py ~ 4KB     下载(29)     跳至 [1] [全屏预览]

#!/usr/bin/python
#coding:utf-8
#Author:PENGTIAN
#Time:2016.08.20
#PS THE CODING DECLEARATION: "coding[:=]\s*([-\w.]+)"
# This is for encode a file into png to escape some firewall or some file type detection system,
#       this scrip can read the file as binary and compile it into a pixel, finally sava as png 
#       PS: i get the picture's height and width by sqrt, and there will be some deviation(00) 
#           in the last pic line(i try to modify last bytes of exe/gif/jpg, and DON'T MAKE ANY SENSE)
#           you can change it into 1*height or witdh*1 to avoid this deviation :)



import os, sys, binascii, math ,struct, optparse
from PIL import Image

def InitParams():
    pr = optparse.OptionParser()
    pr.add_option('-s','--src', type="string", dest='src',help="File source path")
    pr.add_option('-d','--dst', type="string", dest='dst',help="File destination path")
    pr.add_option('-e','--encode',type="int", dest='encode',help="Flag of encode, 1 to encode, 0 to decode")
    
    op, args = pr.parse_args()
    if (op.src == None) or (op.dst ==None) or (op.encode ==None): 
        pr.print_help()
        print op
        print args
        pr.exit(msg="Please input correct parameters.")
    else:
        return op
def CreateImgBySize(Size = 0):
    """
    size: bytes, each bytes is a pixel
    return a image 
    """
    s = int(math.ceil(math.sqrt(Size)))
    #create image
    return Image.new("RGB", (s, s),0)

def WriteListIntoImg(img, dataLst=[]):
    """
    img: PIL.Image object
    dataLst: a list of your file, format like [a,b..] tail...head
    """
    (xs,ys) = img.size
    # print "xs:",xs,"\tys:",ys
    try:
        for y in range(ys):
            for x in range(xs):
                img.putpixel((x,y), dataLst.pop())
    except Exception as e:
        pass
    finally:
        return img
def Encode2File(src, dst):
    fd = open(src, 'rb')
    size = os.path.getsize(src)
    print "Srouce File Size:",size,"Bytes"
    dataLst = []
    c = fd.read(3)
    while(c):
        color = int(binascii.hexlify(c[::-1]), base=16)
        dataLst.append(color)
        c = fd.read(3)
        # color[i] = int(binascii.b2a_hex(c), base=16)
        # if i>=2:
        #     color.reverse()
        #     # color.sort()
        #     # print "flag:",flag
        #     flag+=1
        #     dataLst.append(color[0]*256*256 + color[1]*256 + color[2])
        #     i = 0
        # else:
        #     i+=1
        # c = fd.read(1)
    dataLst.reverse()
    # print "Read Over..."
    img = WriteListIntoImg(CreateImgBySize(math.ceil(size/3)), dataLst=dataLst)
    img.save(dst, format="PNG")
    print "Save to ", dst, "OK"

def Decode2File(src,dst):
    img = Image.open(src,'r')
    (xs,ys) = img.size
    # print "xs:",xs,"\tys:",ys
    dataLst =[]
    i = 0
    try:
        for y in range(ys):
            for x in range(xs):
                 (r,g,b) = img.getpixel( (x,y) )
                 dataLst.append(r)
                 dataLst.append(g)
                 dataLst.append(b)
    except Exception as e:
        raise e
    finally:
        with open(dst,'wb') as fd:
            for i in dataLst:
                fd.write(struct.pack('B',i))
    # print "len(dataLst):",len(dataLst)
    print "Decode OK:",dst

def Main():
    option = InitParams()
    src = option.src
    dst = option.dst
    isencode = option.encode
    if isencode:
        Encode2File(src, dst)
    else:
        Decode2File(src, dst)

if __name__ == "__main__":
    Main()

2. [图片] JSL00105_10.jpg    

3. [图片] test.png    

4. [图片] detest.png    



开源中国-程序员在线工具:Git代码托管 API文档大全(120+) JS在线编辑演示 二维码 更多»

发表评论 回到顶部 网友评论(4)

  • 1楼:黑暗圣堂武士 发表于 2016-09-04 03:38 回复此评论
    你这个编码前后的文件大小对比是什么样的?放个数据看看。

    感觉转成文本不需要PIL
  • 2楼:彭添 发表于 2016-09-04 11:16 回复此评论

    引用来自“黑暗圣堂武士”的评论

    你这个编码前后的文件大小对比是什么样的?放个数据看看。

    感觉转成文本不需要PIL
    原图:JSL00105_10.jpg,大小:28.5 KB (29,251 字节),占用空间:32.0 KB (32,768 字节) 编码图:test.png,大小 24.5 KB (25,100 字节), 占用空间:28.0 KB (28,672 字节) 解码图:detest.png,28.7 KB (29,403 字节),占用空间:32.0 KB (32,768 字节) ---------没找到哪儿可以回复图片----------- 我做的这个是将任何文件以二进制读取后以图片形式保存下来,这样就可以通过其他方式传输了英文在保存图片的时候是以正方形的大小保存的,所以解码后会多余最后一排的像素信息,如果换成1*n的形式就可以避免这点误差
  • 3楼:黑暗圣堂武士 发表于 2016-09-04 11:20 回复此评论
    赞,效率要好不少。base85 base64之类的会大多34分之一。
  • 4楼:彭添 发表于 2016-09-04 11:27 回复此评论

    引用来自“黑暗圣堂武士”的评论

    你这个编码前后的文件大小对比是什么样的?放个数据看看。

    感觉转成文本不需要PIL
    而且如果手动把编码后的图片旋转后会导致像素重排,解码出来的文件也会不正确,旋转调整回去之后再次接码就OK了
开源从代码分享开始 分享代码