@@ -161,6 +161,16 @@ def get_newidblock_entries(data, header, delay):
161
161
offset += size
162
162
163
163
164
+ def get_idblock_entries (data , header , delay ):
165
+ offset , size = header .init_offset * 512 , header .init_size * 512
166
+ yield 0x471 , data [offset :offset + size ], delay
167
+ if header .init_boot_size > header .init_size :
168
+ offset = (header .init_offset + header .init_size ) * 512
169
+ size = (header .init_boot_size - header .init_size ) * 512
170
+ if size != 524288 :
171
+ yield 0x472 , data [offset :offset + size ], 0
172
+
173
+
164
174
def parse_image_header (data ):
165
175
tag = int .from_bytes (data [:4 ], 'little' )
166
176
RKBootHeader = namedtuple ('RKBootHeader' , [
@@ -189,6 +199,15 @@ def parse_image_header(data):
189
199
digest != data [1536 :1536 + len (digest )]:
190
200
raise ValueError (f"Digest mismatch for header" )
191
201
return header , get_newidblock_entries
202
+ RKIDBlockHeader0 = namedtuple ('RKIDBlockHeader0' , [
203
+ 'tag' , 'disable_rc4' , 'init_offset' , 'init_size' , 'init_boot_size' ,
204
+ ])
205
+ if tag == 0xfcdc8c3b :
206
+ keystream = rc4_prga (rc4_ksa (RK_RC4_KEY ))
207
+ data = bytes (byte ^ next (keystream ) for byte in data [:512 ])
208
+ header = RKIDBlockHeader0 ._make (unpack ('<L4xLH492xHH2x' , data [:512 ]))
209
+ if header .tag == 0x0ff0aa55 and header .init_size > 0 :
210
+ return header , get_idblock_entries
192
211
return None , None
193
212
194
213
0 commit comments