#!perl -w # (C) 2003-2007 Willem Jan Hengeveld # Web: http://www.xs4all.nl/~itsme/ # http://wiki.xda-developers.com/ # # $Id: $ # # this script parses .dsm files # dsm files seem to contain installed package information, for wm2005 devices # use strict; use IO::File; my %areas; sub add_area { my ($ofs, $size, $desc)= @_; $areas{$ofs}= {ofs=>$ofs, size=>$size, desc=>$desc}; } my $fn= shift or die "need fn\n"; my $fh= IO::File->new($fn, "r"); binmode $fh; my $hdrdata= read_dsm_header($fh); my $hdr= parse_dsm_header($hdrdata); my $fileentdata= read_file_entries($fh, $hdr->{fileptr}, $hdr->{filecount}); my $fileentries= parse_file_entries($fileentdata); my $ent1Centdata= read_ent1C_entries($fh, $hdr->{ent1Cptr}, $hdr->{ent1Ccount}); my $ent1Centries= parse_ent1C_entries($ent1Centdata); my $ent10entdata= read_ent10_entries($fh, $hdr->{ent10ptr}, $hdr->{ent10count}); my $ent10entries= parse_ent10_entries($ent10entdata); my $signature= read_signature($fh, $hdr->{signatureptr}, $hdr->{signaturesize}); sub read_signature { my ($fh, $ofs, $size)= @_; return "" if ($ofs==0 || $size==0); add_area($ofs, $size, 'signature'); return readdata($fh, $ofs, $size); } sub readdata { my ($fh, $ofs, $size)= @_; my $data; $fh->seek($ofs, SEEK_SET); $fh->read($data, $size); return $data; } my $dsmname= read_string($fh, $hdr->{dsmnameptr}, $hdr->{dsmnamelength}); sub read_string { my ($fh, $ofs, $len)= @_; my $data; $fh->seek($ofs, SEEK_SET); $fh->read($data, $len*2); my $str= pack 'U*', unpack 'v*', $data; add_area($ofs, $len*2, 'string '.$str); return $str; } for (@$fileentries) { $_->{filename}= read_string($fh, $_->{nameptr}, $_->{namelen}); } $fh->seek(0, SEEK_END); my $eofptr= $fh->tell(); my $ofs= 0; for my $aofs (sort {$a<=>$b} keys %areas) { if ($ofs<$aofs) { printf("%08lx-%08lx: 0x%x unknown bytes: %s\n", $ofs, $aofs, $aofs-$ofs, unpack("H*", readdata($fh, $ofs, $aofs-$ofs))); } $ofs= $aofs+$areas{$aofs}{size}; printf("%08lx-%08lx: %s\n", $aofs, $ofs, $areas{$aofs}{desc}); } if ($ofs<$eofptr) { printf("%08lx-%08lx: 0x%x unknown bytes: %s\n", $ofs, $eofptr, $eofptr-$ofs, unpack("H*", readdata($fh, $ofs, $eofptr-$ofs))); } dump_dsm_header($hdr); dump_file_entries($fileentries); dump_ent1C_entries($ent1Centries); dump_ent10_entries($ent10entries); exit(0); sub guidstring { return sprintf("%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", unpack("VvvC*", $_[0])); } sub versionstring { return sprintf("%d.%d.%d.%d", unpack("v*", $_[0])); } sub read_dsm_header { my ($fh)= @_; my $data; $fh->read($data, 0x74); add_area(0, 0x74, 'dsm header'); return $data; } sub parse_dsm_header { my ($data)= @_; my %hdr; ( $hdr{cbsize}, # 0000 @{$hdr{dw}}[0..3], # 0004 always: 00000002 000001c2 000001f5 00000000 $hdr{dsmnamelength}, # 0014 $hdr{dsmnameptr}, # 0018 $hdr{ent1Ccount}, # 001c $hdr{ent1Cptr}, # 0020 $hdr{ent10count}, # 0024 dependencies $hdr{ent10ptr}, # 0028 $hdr{filecount}, # 002c $hdr{fileptr}, # 0030 $hdr{signaturesize}, # 0034 $hdr{signatureptr}, # 0038 $hdr{ver1}, # 003c : maj/min/qfe/build @{$hdr{dw}}[4..5], # 0044 $hdr{ver2}, # 004c : maj/min/qfe/build $hdr{pkgguid}, # 0054 - guid of this package $hdr{ifguid}, # 0064 ) = unpack("V15a8V2a8a16a16", $data); # __ver1__ dw_4 dw_5 __ver2__ # 1 00000000 00000000 00000000 00000000 00000000 00000000 # 1 00000001 10c60000 00000000 00000000 00000000 00000000 # 1 00010002 0334012d 00000000 00000000 00520000 00000898 # 1 00010005 3a500000 00000000 00000000 00520000 00000898 # 114 00010005 3a500898 00000000 00000000 00010005 3a500898 # 2 00010005 ffffffff 00000000 00000000 00010005 3a500898 # 1 00020002 0334012d 00000000 00000000 00520000 00000898 # 1 00030002 0334012d 00000000 00000000 00000000 00000000 # 1 00040002 0334012d 00000000 00000000 00000000 00000000 # 1 00060002 0334012d 00000000 00000000 00000000 00000000 # 4 00520000 00000000 00000000 00000000 00000000 00000000 # 11 00520000 00000000 00000000 00000000 00520000 00000898 return \%hdr; } sub dump_dsm_header { my ($hdr)= @_; printf("%s=%08lx\n", $_, $hdr->{$_}) for grep { $_ ne "dw" && $_ ne "ifguid" && $_ ne "pkgguid" && $_ !~ /^ver\d(?:build)?$/ } sort keys %$hdr; printf("pkgguid=%s\n", guidstring($hdr->{pkgguid})); printf("ifguid=%s\n", guidstring($hdr->{ifguid})); printf("ver1=%s\n", versionstring($hdr->{ver1})); printf("ver2=%s\n", versionstring($hdr->{ver2})); printf("dw[%d]=%08lx\n", $_, $hdr->{dw}[$_]) for 0..$#{$hdr->{dw}}; } ###### sub read_file_entries { my ($fh, $ofs, $count)= @_; $fh->seek($ofs, SEEK_SET); my $data; $fh->read($data, 0x14*$count); add_area($ofs, 0x14*$count, 'file entries'); return $data; } sub parse_file_entries { my ($data)= @_; my @ent; for (my $i=0 ; $i{flags}, $entry->{orig_vbase}, $entry->{filesize}, $entry->{filename}); } ###### sub read_ent1C_entries { my ($fh, $ofs, $count)= @_; return "" if ($ofs==0 || $count==0); $fh->seek($ofs, SEEK_SET); my $data; $fh->read($data, 0x1c*$count); add_area($ofs, 0x1c*$count, 'ent_1C entries'); return $data; } sub parse_ent1C_entries { my ($data)= @_; my @ent; for (my $i=0 ; $i{dw1}, versionstring($entry->{ver}), guidstring($entry->{guid})); } ###### sub read_ent10_entries { my ($fh, $ofs, $count)= @_; return "" if ($ofs==0 || $count==0); $fh->seek($ofs, SEEK_SET); my $data; $fh->read($data, 0x10*$count); add_area($ofs, 0x10*$count, 'ent_10 entries'); return $data; } sub parse_ent10_entries { my ($data)= @_; my @ent; for (my $i=0 ; $i{guid})); } # dump of ./0.82.301.0/files/76416281-5805-4c80-afa2-e95fc719c723.dsm __DATA__ 00000000: 00000074 cbsize 00000004: 00000002 00000008: 000001c2 0000000c: 000001f5 00000010: 00000000 00000014: 00000028 length of dsm filename 00000018: 000004f8 ptr to dsm filename 0000001c: 00000000 count 00000020: 00000000 ptr 00000024: 00000007 nr of dependencies 00000028: 00000254 ptr to list of dependencies 0000002c: 00000018 nr of files 00000030: 00000074 ptr to file entries 00000034: 00000233 length of signature 00000038: 000002c4 ptr to signature? 0000003c: 00520000 00000040: 00000000 00000044: 00000000 00000048: 00000000 0000004c: 00520000 00000050: 00000898 00000054: 76416281 4c805805 5fe9a2af 23c719c7 - guid - same as filename 00000064: 63c02a30 45056f96 67bfaf94 ad5d8d42 strlen ptr vbase filesize 00000074: 00000016 10000001 00000548 00000000 000027d0 : GifPlayer.exe.0413.mui 00000088: 00000018 10000001 00000574 00000000 000039d0 : STK_Service.dll.0413.MUI 0000009c: 00000016 10000001 000005a4 00000000 00002dd0 : USBSwitch.exe.0413.MUI 000000b0: 00000011 20000001 000005d0 00010000 00025fd0 : gwes.exe.0413.mui 000000c4: 00000013 10000001 000005f2 00000000 00005fd0 : WModem.exe.0413.MUI 000000d8: 00000014 20000003 00000618 00010000 00001090 : SimLock.exe.0413.mui 000000ec: 00000019 10000001 00000640 00000000 000027d0 : USSD_Service.dll.0413.MUI 00000100: 00000013 10000001 00000672 00000000 000029d0 : SIMMgr.exe.0413.mui 00000114: 0000001c 10000001 00000698 00000000 00005dd0 : IA_Task_Manager.exe.0413.mui 00000128: 00000018 20000103 000006d0 00100000 00000b10 : HtcColdBoot.exe.0413.MUI 0000013c: 0000001e 10000001 00000700 00000000 000015d0 : getMMSCtxMenuInfo.dll.0413.mui 00000150: 0000001a 10000001 0000073c 00000000 000019d0 : SubDisplayDll.dll.0413.mui 00000164: 00000019 10000001 00000770 00000000 000017d0 : ClearStorage.exe.0413.MUI 00000178: 00000013 10000001 000007a2 00000000 0000057b : CannedText_0413.bin 0000018c: 00000013 10000001 000007c8 00000000 0000d1d0 : ArcMMS.dll.0413.mui 000001a0: 00000017 10000001 000007ee 00000000 000013d0 : StorageLow.exe.0413.MUI 000001b4: 00000022 10000001 0000081c 00000000 00001dd0 : ExternalScreenSetting.dll.0413.mui 000001c8: 00000018 10000001 00000860 00000000 00001fd0 : CommManager.exe.0413.mui 000001dc: 00000013 10000001 00000890 00000000 000083d0 : Camera.exe.0413.mui 000001f0: 00000014 10000001 000008b6 00000000 00001bd0 : SysInfo.dll.0413.MUI 00000204: 00000018 10000001 000008de 00000000 000029d0 : HTCSettings.dll.0413.mui 00000218: 00000014 10000001 0000090e 00000000 00000276 : MMSTemplates0413.inf 0000022c: 0000001b 10000001 00000936 00000000 00001bd0 : Authentication.dll.0413.MUI 00000240: 00000028 10000003 0000096c 00000000 000003fa : 76416281-5805-4c80-afa2-e95fc719c723.rgu list of dependencies ( package guids ) 00000254: 9b 44 f4 b1 84 18 db 48 88 61 67 70 4a 40 8a 63 00000264: cf 55 09 06 88 25 c6 45 9d 6b 2a fe 6d b2 98 50 00000274: fe b1 d1 b5 58 d0 95 4a a9 0e 32 1e a5 c3 13 f1 00000284: dc 22 f7 fe 5c 69 b2 44 b5 3b c2 d8 76 58 9b 37 00000294: 61 6a af f7 7b da d5 42 98 8c 62 81 40 c9 97 a1 000002a4: fd f1 9f f8 7c 1c eb e8 57 99 f8 b6 1a 8d 54 ee 000002b4: 93 59 b7 25 5b 5b ca 4a a2 4a dc 89 2d 43 3b b8 ----000002c4 l=00000234 signature?? openssl asn1parse -inform DER -in 76416281-5805-4c80-afa2-e95fc719c723.dsm -offset 708 -length 563 -i -dump 0:d=0 hl=4 l= 559 cons: SEQUENCE 4:d=1 hl=4 l= 408 cons: SEQUENCE 8:d=2 hl=2 l= 3 cons: cont [ 0 ] 10:d=3 hl=2 l= 1 prim: INTEGER :02 13:d=2 hl=2 l= 16 prim: INTEGER :-2F976E6EE23D1779BEB4AFB464832E33 31:d=2 hl=2 l= 13 cons: SEQUENCE 33:d=3 hl=2 l= 9 prim: OBJECT :md5WithRSAEncryption 44:d=3 hl=2 l= 0 prim: NULL 46:d=2 hl=2 l= 39 cons: SEQUENCE 48:d=3 hl=2 l= 37 cons: SET 50:d=4 hl=2 l= 35 cons: SEQUENCE 52:d=5 hl=2 l= 3 prim: OBJECT :commonName 57:d=5 hl=2 l= 28 prim: BMPSTRING L"OEM_UpdateCert" 87:d=2 hl=2 l= 30 cons: SEQUENCE 89:d=3 hl=2 l= 13 prim: UTCTIME :060110090553Z 104:d=3 hl=2 l= 13 prim: UTCTIME :391231235959Z 119:d=2 hl=2 l= 39 cons: SEQUENCE 121:d=3 hl=2 l= 37 cons: SET 123:d=4 hl=2 l= 35 cons: SEQUENCE 125:d=5 hl=2 l= 3 prim: OBJECT :commonName 130:d=5 hl=2 l= 28 prim: BMPSTRING L"OEM_UpdateCert" 160:d=2 hl=3 l= 159 cons: SEQUENCE 163:d=3 hl=2 l= 13 cons: SEQUENCE 165:d=4 hl=2 l= 9 prim: OBJECT :rsaEncryption 176:d=4 hl=2 l= 0 prim: NULL 178:d=3 hl=3 l= 141 prim: BIT STRING openssl asn1parse -inform DER -in 76416281-5805-4c80-afa2-e95fc719c723.dsm -offset 890 -length 140 -i -dump | 0:d=0 hl=3 l= 137 cons: SEQUENCE | 3:d=1 hl=3 l= 129 prim: INTEGER :A37ADFFCB5F011CED7A606BEDF4A8C68DB42FEF0BC5100586DC58239F6083B1E711D2C60A5657130D1E3578B45E2D117C4FC9C200CA8D33820331D1DF38EEBAC0114EF46C5A20FF7AD4F5E7E5B511CA081ADF82049E03DA8BE6970E63C03FD22749EE3AC30BC06C65172E8610C95B2EAC6253B96C369C105BA3A1DF5B9F9C097 | 135:d=1 hl=2 l= 3 prim: INTEGER :010001 322:d=2 hl=2 l= 92 cons: cont [ 3 ] 324:d=3 hl=2 l= 90 cons: SEQUENCE 326:d=4 hl=2 l= 88 cons: SEQUENCE 328:d=5 hl=2 l= 3 prim: OBJECT :2.5.29.1 333:d=5 hl=2 l= 81 prim: OCTET STRING openssl asn1parse -inform DER -in 76416281-5805-4c80-afa2-e95fc719c723.dsm -offset 1043 -length 81 -i -dump | 0:d=0 hl=2 l= 79 cons: SEQUENCE | 2:d=1 hl=2 l= 16 prim: cont [ 0 ] ;014DE6918B8920AA6380FB478DB554F1 | 20:d=1 hl=2 l= 41 cons: cont [ 1 ] | 22:d=2 hl=2 l= 39 cons: SEQUENCE | 24:d=3 hl=2 l= 37 cons: SET | 26:d=4 hl=2 l= 35 cons: SEQUENCE | 28:d=5 hl=2 l= 3 prim: OBJECT :commonName | 33:d=5 hl=2 l= 28 prim: BMPSTRING L"OEM_UpdateCert" | 63:d=1 hl=2 l= 16 prim: cont [ 2 ] ;D06891911DC2E886414B504B9B7CD1CD 416:d=1 hl=2 l= 13 cons: SEQUENCE 418:d=2 hl=2 l= 9 prim: OBJECT :md5WithRSAEncryption 429:d=2 hl=2 l= 0 prim: NULL 431:d=1 hl=3 l= 129 prim: BIT STRING 0000 - 00 08 05 71 f4 f2 14 26-3d b1 47 7b 18 36 af 4a 0010 - 0c 68 ae f3 1f 66 8a 16-9a e7 bd 71 20 44 48 4e 0020 - 14 ae c2 6d 44 d5 5e c7-82 21 09 c3 23 ef 7d 65 0030 - b8 9d 92 89 13 46 92 98-aa 3c 99 d0 51 e9 57 85 0040 - ec fb 70 9d dd 2f b0 61-43 99 81 7d 51 e7 a5 98 0050 - 86 ab 8f a3 44 19 c0 e6-1e fd d4 66 ae a5 4b 4e 0060 - e0 39 7d ca 14 6e 15 b8-ba a5 b4 a9 1e 62 fb 8e 0070 - f1 10 e6 e3 1c 20 d5 0e-04 c8 e4 bf 66 6a a8 f4 0080 - f3 modexp 080571F4F214263DB1477B1836AF4A0C68AEF31F668A169AE7BD712044484E14AEC26D44D55EC7822109C323EF7D65B89D928913469298AA3C99D051E95785ECFB709DDD2FB0614399817D51E7A59886AB8FA34419C0E61EFDD466AEA54B4EE0397DCA146E15B8BAA5B4A91E62FB8EF110E6E31C20D50E04C8E4BF666AA8F4F3 10001 A37ADFFCB5F011CED7A606BEDF4A8C68DB42FEF0BC5100586DC58239F6083B1E711D2C60A5657130D1E3578B45E2D117C4FC9C200CA8D33820331D1DF38EEBAC0114EF46C5A20FF7AD4F5E7E5B511CA081ADF82049E03DA8BE6970E63C03FD22749EE3AC30BC06C65172E8610C95B2EAC6253B96C369C105BA3A1DF5B9F9C097 | 01 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF | FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF | FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF | FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF | FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF | FF FF FF FF FF FF FF FF FF FF FF FF 00 30 20 30 | 0C 06 08 2A 86 48 86 F7 0D 02 05 05 00 04 10 D4 | 4F CF 2F B3 5A 26 E3 AB A6 1E C0 A7 3D 3E FB openssl asn1parse -inform DER -in x1itsme.bin -dump -i | 0:d=0 hl=2 l= 32 cons: SEQUENCE | 2:d=1 hl=2 l= 12 cons: SEQUENCE | 4:d=2 hl=2 l= 8 prim: OBJECT :md5 | 14:d=2 hl=2 l= 0 prim: NULL | 16:d=1 hl=2 l= 16 prim: OCTET STRING | 0000 - d4 4f cf 2f b3 5a 26 e3-ab a6 1e c0 a7 3d 3e fb .O./.Z&......=>. 000004f8: 76416281-5805-4c80-afa2-e95fc719c723.dsm 00000548: GifPlayer.exe.0413.mui 00000574: STK_Service.dll.0413.MUI 000005a4: USBSwitch.exe.0413.MUI 000005d0: gwes.exe.0413.mui 000005f2: WModem.exe.0413.MUI 00000618: SimLock.exe.0413.mui 00000640: USSD_Service.dll.0413.MUI 00000672: SIMMgr.exe.0413.mui 00000698: IA_Task_Manager.exe.0413.mui 000006d0: HtcColdBoot.exe.0413.MUI 00000700: getMMSCtxMenuInfo.dll.0413.mui 0000073c: SubDisplayDll.dll.0413.mui 00000770: ClearStorage.exe.0413.MUI 000007a2: CannedText_0413.bin 000007c8: ArcMMS.dll.0413.mui 000007ee: StorageLow.exe.0413.MUI 0000081c: ExternalScreenSetting.dll.0413.mui 00000860: CommManager.exe.0413.mui 00000890: Camera.exe.0413.mui 000008b6: SysInfo.dll.0413.MUI 000008de: HTCSettings.dll.0413.mui 0000090e: MMSTemplates0413.inf 00000936: Authentication.dll.0413.MUI 0000096c: 76416281-5805-4c80-afa2-e95fc719c723.rgu