hard2reg
V2EX  ›  PHP

php 的 pack 函数写出图片文件遇到的问题

  •  
  •   hard2reg · Aug 23, 2016 · 2846 views
    This topic created in 3550 days ago, the information mentioned may be changed or developed.
    $buf = file_get_contents("photo.dat");
    $buf = unpack("C*", $buf);
    $GLOBALS["magic"] = $buf[1] ^ 0xff;
    $photo = array_map("my_xor", $buf);
    // 这上面都是对的
    $photo = pack("H*", $photo);
    file_put_contents("photo.jpg", $photo);
    

    结果写出的图片大小才几个字节。。。 想知道是哪里错了。。。 实在 google 不出来

    Supplement 1  ·  Aug 24, 2016

    不好意思,Callback函数忘记贴上来了。。

    function my_xor($b)
    {
    	return $b ^ $magic;
    }
    
    Supplement 2  ·  Aug 24, 2016
    结帖!感谢各位的帮助!
    21 replies    2016-08-25 14:16:19 +08:00
    yao978318542
        1
    yao978318542  
       Aug 23, 2016
    告诉我你用的什么代理 我就告诉你怎么解决
    hard2reg
        2
    hard2reg  
    OP
       Aug 23, 2016
    @yao978318542 代理是指什么?
    yao978318542
        3
    yao978318542  
       Aug 23, 2016
    你都能 google 了 翻墙的梯子啊!
    hard2reg
        4
    hard2reg  
    OP
       Aug 23, 2016
    @yao978318542 用的 Shadowsocks 啊。。。你可以教我怎么解决了吧。。
    yao978318542
        5
    yao978318542  
       Aug 23, 2016
    我先听一下你的需求吧 看你的代码容易和你犯同样的错误
    hard2reg
        6
    hard2reg  
    OP
       Aug 23, 2016
    @yao978318542 就是读取 dat 文件,把里面的每个字节与指定十六进制数异或,然后将异或后的数据保存为 jpg 。
    wesley
        7
    wesley  
       Aug 23, 2016
    图片开头若干个字符是描述信息,你做异或运算不应该包含这些字符
    hard2reg
        8
    hard2reg  
    OP
       Aug 23, 2016
    @wesley 不是描述信息,整个图片的数据都被加密了。
    hard2reg
        9
    hard2reg  
    OP
       Aug 23, 2016
    这贴就这么死了?
    yao978318542
        10
    yao978318542  
       Aug 24, 2016
    my_xor 函数贴出来啊 加密是你加的吗?还是你要破解
    des
        11
    des  
       Aug 24, 2016 via Android
    为什么不用 fopen ??
    你应该去看一下 pack 是怎么传参的。
    还有“ my_xor ”是什么鬼?
    hard2reg
        12
    hard2reg  
    OP
       Aug 24, 2016
    @yao978318542 已贴出来,我要破解。
    @des 已贴出来。

    按理来说字节数异或后应该是不变的,但是写出文件后字节数居然变了。。。
    yao978318542
        13
    yao978318542  
       Aug 24, 2016
    感觉悬 看来帮不上你了
    hard2reg
        14
    hard2reg  
    OP
       Aug 24, 2016
    @yao978318542 /(ㄒoㄒ)/~~
    des
        15
    des  
       Aug 24, 2016
    @hard2reg 你是想要这样??
    $photo = array_map(function($b){return pack('H',$b^$magic)}, $buf);
    yao978318542
        16
    yao978318542  
       Aug 24, 2016
    @hard2reg 要不你把文件发给我 我帮你试试?
    hard2reg
        17
    hard2reg  
    OP
       Aug 24, 2016
    @des pack 之前要先 unpack 吗
    hard2reg
        18
    hard2reg  
    OP
       Aug 24, 2016
    @des 嗯,现在写出文件后文件大小对了,但是。。。貌似解密失败?

    $buf = file_get_contents('photo.dat');
    $buf = unpack('C*', $buf);
    $magic = $buf[1] ^ 0xff;
    $photo = array_map(function($b){return pack('H', $b ^ $magic);}, $buf);
    $b = file_put_contents('photo.jpg', $photo);

    这是正确解密的 Python 代码

    def _decode_pc_dat(self, datfile):
    with open(datfile, 'rb') as f:
    buf = bytearray(f.read())

    magic = 0xff ^ list(buf)[0] if buf else 0x00
    imgfile = re.sub(r'.dat$', '.jpg', datfile)
    with open(imgfile, 'wb') as f:
    newbuf = bytearray([b ^ magic for b in list(buf)])
    f.write(newbuf)
    hard2reg
        19
    hard2reg  
    OP
       Aug 24, 2016
    @yao978318542 自己解决了!
    @des 感谢帮助!你提供的代码很有用!
    yao978318542
        20
    yao978318542  
       Aug 25, 2016
    @hard2reg 能吧代码发给我一份参考一下吗?多谢
    hard2reg
        21
    hard2reg  
    OP
       Aug 25, 2016
    @yao978318542

    $buf = unpack('C*', $buf);
    $magic = $buf[1] ^ 0xff;
    $photo = array_map(function($b){return pack('C', $b ^ $GLOBALS['magic']);}, $buf);
    $file_name = md5(microtime()) . '.jpg';
    $b = file_put_contents($file_name, $photo);
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   968 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 61ms · UTC 20:00 · PVG 04:00 · LAX 13:00 · JFK 16:00
    ♥ Do have faith in what you're doing.