zoukankan      html  css  js  c++  java
  • 提取iOS App中的png图片资源(转)

    挺邪恶的,直接看人家的图片资源,无奈个人艺术设计实力实在不强,只好借鉴下比较好的app了。

    在编译打包到app的过程中,原有的png都被在最后加上了特定都数据段,这样从app里直接取出来图片既不能看,也不能用,所以需要工具来进行还原。

    所幸,伟大的开源界已经提供了这样的pyhton脚本:

    http://www.axelbrz.com.ar/?mod=iphone-png-images-normalizer

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    
    #---
    # iPIN - iPhone PNG Images Normalizer v1.0
    # Copyright (C) 2007
    #
    # Author:
    #  Axel E. Brzostowski
    #  http://www.axelbrz.com.ar/
    #  axelbrz@gmail.com
    # 
    # References:
    #  http://iphone.fiveforty.net/wiki/index.php/PNG_Images
    #  http://www.libpng.org/pub/png/spec/1.2/PNG-Contents.html
    # 
    # This program is free software: you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation, either version 3 of the License.
    # 
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    # GNU General Public License for more details.
    # 
    #---
     
    from struct import *
    from zlib import *
    import stat
    import sys
    import os
     
    def getNormalizedPNG(filename):
        pngheader = "\x89PNG\r\n\x1a\n"
     
        file = open(filename, "rb")
        oldPNG = file.read()
        file.close()
     
        if oldPNG[:8] != pngheader:
            return None
     
        newPNG = oldPNG[:8]
     
        chunkPos = len(newPNG)
     
        # For each chunk in the PNG file
        while chunkPos < len(oldPNG):
     
            # Reading chunk
            chunkLength = oldPNG[chunkPos:chunkPos+4]
            chunkLength = unpack(">L", chunkLength)[0]
            chunkType = oldPNG[chunkPos+4 : chunkPos+8]
            chunkData = oldPNG[chunkPos+8:chunkPos+8+chunkLength]
            chunkCRC = oldPNG[chunkPos+chunkLength+8:chunkPos+chunkLength+12]
            chunkCRC = unpack(">L", chunkCRC)[0]
            chunkPos += chunkLength + 12
     
            # Parsing the header chunk
            if chunkType == "IHDR":
                width = unpack(">L", chunkData[0:4])[0]
                height = unpack(">L", chunkData[4:8])[0]
     
            # Parsing the image chunk
            if chunkType == "IDAT":
                try:
                    # Uncompressing the image chunk
                    bufSize = width * height * 4 + height
                    chunkData = decompress( chunkData, -8, bufSize)
     
                except Exception, e:
                    # The PNG image is normalized
                    return None
     
                # Swapping red & blue bytes for each pixel
                newdata = ""
                for y in xrange(height):
                    i = len(newdata)
                    newdata += chunkData[i]
                    for x in xrange(width):
                        i = len(newdata)
                        newdata += chunkData[i+2]
                        newdata += chunkData[i+1]
                        newdata += chunkData[i+0]
                        newdata += chunkData[i+3]
     
                # Compressing the image chunk
                chunkData = newdata
                chunkData = compress( chunkData )
                chunkLength = len( chunkData )
                chunkCRC = crc32(chunkType)
                chunkCRC = crc32(chunkData, chunkCRC)
                chunkCRC = (chunkCRC + 0x100000000) % 0x100000000
     
            # Removing CgBI chunk 
            if chunkType != "CgBI":
                newPNG += pack(">L", chunkLength)
                newPNG += chunkType
                if chunkLength > 0:
                    newPNG += chunkData
                newPNG += pack(">L", chunkCRC)
     
            # Stopping the PNG file parsing
            if chunkType == "IEND":
                break
     
        return newPNG
     
    def updatePNG(filename):
        data = getNormalizedPNG(filename)
        if data != None:
            file = open(filename, "wb")
            file.write(data)
            file.close()
            return True
        return data
     
    def getFiles(base):
        global _dirs
        global _pngs
        if base == ".":
            _dirs = []
            _pngs = []
     
        if base in _dirs:
            return
     
        files = os.listdir(base)
        for  file in files:
            filepath = os.path.join(base, file)
            try:
                st = os.lstat(filepath)
            except os.error:
                continue
     
            if stat.S_ISDIR(st.st_mode):
                if not filepath in _dirs:
                    getFiles(filepath)
                    _dirs.append( filepath )
     
            elif file[-4:].lower() == ".png":
                if not filepath in _pngs:
                    _pngs.append( filepath )
     
        if base == ".":
            return _dirs, _pngs
     
    print "-----------------------------------"
    print " iPhone PNG Images Normalizer v1.0"
    print "-----------------------------------"
    print " "
    print "[+] Searching PNG files...",
    dirs, pngs = getFiles(".")
    print "ok"
     
    if len(pngs) == 0:
        print " "
        print "[!] Alert: There are no PNG files found. Move this python file to the folder that contains the PNG files to normalize."
        exit()
     
    print " "
    print " -  %d PNG files were found at this folder (and subfolders)." % len(pngs)
    print " "
    while True:
        normalize = raw_input("[?] Do you want to normalize all images (Y/N)? ").lower()
        if len(normalize) > 0 and (normalize[0] == "y" or normalize[0] == "n"):
            break
     
    normalized = 0
    if normalize[0] == "y":
        for  ipng in xrange(len(pngs)):
            perc = (float(ipng) / len(pngs)) * 100.0
            print "%.2f%% %s" % (perc, pngs[ipng])
            if updatePNG(pngs[ipng]):
                normalized += 1
    print " "
    print "[+] %d PNG files were normalized." % normalized

    以QQ阅读1.5.1的ipa为例,先进入解压后的app目录, 同样实在终端进行操作,将python脚本命名为pickUpPng.py
    $mv pickUpPng.py /usr/bin
    将基本放入到/usr/bin目录,方便日后使用和操作
    在app目录下
    $mkdir realPng
    $mv *.png realPng
    $cd realPng
    $python pickUpPng.py
    这样就可以将所有png图片还原回去,并且如果需要直接查看的话可以使用open command。

  • 相关阅读:
    在cnBlogs上使用MarsEdit发blog
    如何将netbeans生成的项目文件打包发布到其他的Tomcat服务器上?
    Android activity中单击返回键或home键彻底退出应用
    C语言基础之自增自减运算符及注意事项
    [给自己扫盲]名词解释——LAMP、MEAN、Web应用框架等
    第一个Mac程序——倒计时v1&v2
    iOS开发 Swift开发数独游戏(二)数独题目的生成
    解决ADT大量出现"Unexpected value from nativeGetEnabledTags: 0"的问题
    C语言基础之指针
    [给自己扫盲]Node.js 究竟是什么?
  • 原文地址:https://www.cnblogs.com/yaoliang11/p/2725677.html
Copyright © 2011-2022 走看看