首页
论坛
课程
招聘
[原创]发个以前的ithmb解析的代码
2016-3-17 15:55 11493

[原创]发个以前的ithmb解析的代码

obaby 活跃值
20
2016-3-17 15:55
11493
原理请参考:
http://bbs.pediy.com/showthread.php?t=187820

代码是python的,只处理到iOS7 ,对于8 和9 没有做处理,也没做分析。如果有童鞋感兴趣可以完善这份代码。如果有任何修改,请在帖子中说明,感谢大家对共享精神的支持。
######################################################################################
#iThmbUnpacker by obaby 
#Unpack the .ithmb file 
#Date:2014.5.15 
#Site:http://www.h4ck.org.cn
######################################################################################

import sys
import os,os.path,platform,struct


def ithmbunpack120(filename):
        i120width=120
        i120height=120
        i120size=i120height*i120width*2

        i120header_data=b'BM'
        i120header_data+=struct.pack('l', i120size+0x36)
        i120header_data+=b'\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00\x00\x00'
        i120header_data+=struct.pack('l', i120width)+struct.pack('l', -i120height)
        i120header_data+=b'\x01\x00\x10\x00\x00\x00\x00\x00'
        i120header_data+=struct.pack('l', i120size)
        i120header_data+=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        infile =open(filename,'rb')
        bitmapfileno =1
        while True:
                data = infile.read(i120size)
                outfile = open(os.path.dirname(os.path.realpath(__file__))+'/bmp120/'+str(bitmapfileno) +'.bmp','wb+')
                outfile.write(i120header_data)
                outfile.write(data)
                outfile.close
                infile.read(28)
                bitmapfileno = bitmapfileno+1
                if not data:break

def ithmbunpack158(filename):
        width=160
        height=158
        size=height*width*2

        header_data=b'BM'
        header_data+=struct.pack('l', size+0x36)
        header_data+=b'\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00\x00\x00'
        header_data+=struct.pack('l', width)+struct.pack('l', -height)
        header_data+=b'\x01\x00\x10\x00\x00\x00\x00\x00'
        header_data+=struct.pack('l', size)
        header_data+=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        infile =open(filename,'rb')
        bitmapfileno =1
        while True:
                data = infile.read(size)
                outfile = open(os.path.dirname(os.path.realpath(__file__))+'/bmp158/'+str(bitmapfileno) +'.bmp','wb+')
                outfile.write(header_data)
                outfile.write(data)
                outfile.close
                infile.read(28)
                bitmapfileno = bitmapfileno+1
                if not data:break

def PrintRuler():
        for i in range(0,16):    
            print "%3s" % hex(i) ,    
        print    
        for i in range(0,16):    
            print "%-3s" % "#" ,    
        print

def iOS7ithmb2Pix(ithmb):
        return{
                "3303":22,
                "3309":64,
                "3319":157,
                "4031":120
                }.get(ithmb,110)
######################################################################################
#ithmb type in iOS7:
#               iOS7type Width Height RealWidth RealHeight
#                 3303 [24  22 ]
#                 3309 [64  64]
#                 3319 [160 157]
#                 3141 [160 158 150 150 true true 2],
#                 3041 [80 79 75 75 true true 1],
#                 
#                 4131 [240 240 240 240 false],
#                 4031 [120 120 120 120 false],
#                 4132 [64 64 64 64 false],
#                 4032 [32 32 32 32 false],
#                 
#                 4140 [336 332 304 332 false false 4],
#                 4040 [168 166 152 166 false false 2],
######################################################################################
def ithmbunpack(filename):
       
        ifilename = os.path.basename(filename)
        if (ifilename.find("x") != -1):
                itmbsize = int(ifilename.split(".")[0].split("x")[0])
        else:
                itmbsize = iOS7ithmb2Pix(ifilename.split(".")[0])
                
        print ('The bitmap is in resoulation :'+str(itmbsize))
        
        PrintRuler()
        
        if itmbsize ==22: #done
                width =24
                height =22
        if itmbsize ==64:
                width =64
                height =64
        if itmbsize ==157: #done 
                width =160
                height =157
                
        if itmbsize == 32:
                width =32
                height = 32
        if itmbsize == 79:
                width = 80
                height = 79
        if itmbsize == 120:
                width = 120
                height = 120
        if itmbsize == 158:
                width =160
                height = 158
        if itmbsize == 166:
                width = 168
                height = 166

        
        size=height*width*2

        header_data=b'BM'
        header_data+=struct.pack('l', size+0x36)
        header_data+=b'\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00\x00\x00'
        header_data+=struct.pack('l', width)+struct.pack('l', -height)
        header_data+=b'\x01\x00\x10\x00\x00\x00\x00\x00'
        header_data+=struct.pack('l', size)
        header_data+=b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        infile =open(filename,'rb')
        bitmapfileno =1
        while True:
                data = infile.read(size)
                outfile = open(os.path.dirname(os.path.realpath(__file__))+'/bmp/'+str(bitmapfileno) +'.bmp','wb+')
                outfile.write(header_data)
                outfile.write(data)
                outfile.close
                #infile.read(28) #print the data between the bitmap file
                index= 0
                for f in range (0,28):
                        temp=infile.read(1)    
                        if len(temp) == 0:    
                                break    
                        else:    
                                print "%3s" % temp.encode('hex'),    
                                index=index+1    
                        if index == 16:    
                                index=0    
                                print
                print("\n")
        
                bitmapfileno = bitmapfileno+1
                if not data:break
        print("\nTotal: " + str(bitmapfileno) +" unpacked!")


def printusage():
        print("================================================================")
        print(sys.argv[0].split("\\")[-1] + " By obaby")
        print("Usage:\n    " +sys.argv[0].split("\\")[-1] + " <.ithmb>")
        print(".ithmb is the file u want to unpacked!")
        print("================================================================")
	pass

if __name__=="__main__":

        if len(sys.argv)>1:
                filename = sys.argv[1]
                print("================================================================")
                print(sys.argv[0].split("\\")[-1] + " By obaby \n")
                print("Start to unpack the file :\n    " + filename)
                ithmbunpack(filename)
                print("================================================================")                
	else:
                printusage()
                



bitbucket 链接:https://bitbucket.org/obaby/ithmbunpacker

[注意] 招人!base上海,课程运营、市场多个坑位等你投递!

收藏
点赞0
打赏
分享
打赏 + 10.00
打赏次数 1 金额 + 10.00
 
赞赏  yjmwxwx   +10.00 2019/03/05 精品文章~
最新回复 (6)
雪    币: 0
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
香菇 活跃值 2016-3-17 17:12
2
0
前排支持。
雪    币: 5
活跃值: 活跃值 (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
影子不寂寞 活跃值 2016-3-17 17:18
3
0
谢谢楼主分享技术贴
雪    币: 0
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
香菇 活跃值 2016-3-17 17:44
4
0
不过,貌似IOS7上的不能用了。
雪    币: 196
活跃值: 活跃值 (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qqsunqiang 活跃值 2016-3-17 19:08
5
0
留个记号,以后研究。
雪    币: 3
活跃值: 活跃值 (385)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zjjhszs 活跃值 2016-3-17 19:30
6
0
看到这风骚的大腿  不顶不行  对不起眼睛
雪    币: 14259
活跃值: 活跃值 (1919)
能力值: ( LV15,RANK:880 )
在线值:
发帖
回帖
粉丝
obaby 活跃值 20 2016-3-18 14:16
7
0
ios7 是可以得,新的8 和9 没有分析,如果感兴趣可以参考签名提到的原理自己解析这个数据完善代码。
游客
登录 | 注册 方可回帖
返回