use IO::File; my @POSSIBLE_DATA_TYPES = (); my %POSSIBLE_OPCODE = (); ################################## DATA TYPES DEF ################################## my %DATA_TYPES=( '01' => "Informacin del Receptor.", '02' => "Informacin del proveedor secundario", '03' => "Ultimo PPV pagado", '04' => "Informacin indirecta (alias de canales)", '05' => "Informacin de fecha", '06' => "Info. de serv. publico. Incluye info de bloqueo y claves de decodificacion.", '07' => "Info. de clave. Incluye la clave de verificacin de decodificacin.", '08' => "Serv. de canal vlidos (activa canales en la gua de programas, el IRD puede decidir por si mismo si un canal est suscrito y si no, mostrar el mensaje ?este canal es de suscripcin)", '09' => "Informacin de tema/nivel de PPV", '0A' => "Informacin de nro. de PPV", '0B' => "Servicios vlidos de PPV (el IRD puede decidir por si mismo si ha de mostrar el mensaje ?este evento PPV no ha sido comprado?)", '0C' => "Informacin de lmite de crdito/gasto" ); ################################## OPCODES ################################## my %OPCODES=( "A9" => ["ADC",2], "B9" => ["ADC",2], "C9" => ["ADC",3], "F9" => ["ADC",1], "E9" => ["ADC",2], "D9" => ["ADC",3], "90F9" => ["ADC",2], "90E9" => ["ADC",3], "90D9" => ["ADC",4], "92B9" => ["ADC",3], "92C9" => ["ADC",3], "92E9" => ["ADC",3], "92D9" => ["ADC",3], "91E9" => ["ADC",3], "91D9" => ["ADC",3], "AB" => ["ADD",2], "BB" => ["ADD",2], "CB" => ["ADD",3], "FB" => ["ADD",1], "EB" => ["ADD",2], "DB" => ["ADD",3], "90FB" => ["ADD",2], "90EB" => ["ADD",3], "90DB" => ["ADD",4], "92BB" => ["ADD",3], "92CB" => ["ADD",3], "92EB" => ["ADD",3], "92DB" => ["ADD",3], "91EB" => ["ADD",3], "91DB" => ["ADD",3], "A4" => ["AND",2], "B4" => ["AND",2], "C4" => ["AND",3], "F4" => ["AND",1], "E4" => ["AND",2], "D4" => ["AND",3], "90F4" => ["AND",2], "90E4" => ["AND",3], "90D4" => ["AND",4], "92B4" => ["AND",3], "92C4" => ["AND",3], "92E4" => ["AND",3], "92D4" => ["AND",3], "91E4" => ["AND",3], "91D4" => ["AND",3], "A5" => ["BCP",2], "B5" => ["BCP",2], "C5" => ["BCP",3], "F5" => ["BCP",1], "E5" => ["BCP",2], "D5" => ["BCP",3], "90F5" => ["BCP",2], "90E5" => ["BCP",3], "90D5" => ["BCP",4], "92B5" => ["BCP",3], "92C5" => ["BCP",3], "92E5" => ["BCP",3], "92D5" => ["BCP",3], "91E5" => ["BCP",3], "91D5" => ["BCP",3], "1" => ["BRES or BSET",2], "921" => ["BRES or BSET",3], "0" => ["BTJF or BTJT",3], "920" => ["BTJF or BTJT",4], "BD" => ["CALL",2], "CD" => ["CALL",3], "FD" => ["CALL",1], "ED" => ["CALL",2], "DD" => ["CALL",3], "90FD" => ["CALL",2], "90ED" => ["CALL",3], "90DD" => ["CALL",4], "92BD" => ["CALL",3], "92CD" => ["CALL",3], "92ED" => ["CALL",3], "92DD" => ["CALL",3], "91ED" => ["CALL",3], "91DD" => ["CALL",3], "AD" => ["CALLR",2], "92AD" => ["CALLR",3], "4F" => ["CLR",1], "5F" => ["CLR",1], "905F" => ["CLR",2], "3F" => ["CLR",2], "7F" => ["CLR",1], "6F" => ["CLR",2], "907F" => ["CLR",2], "906F" => ["CLR",3], "923F" => ["CLR",3], "926F" => ["CLR",3], "916F" => ["CLR",3], "A1" => ["CP",2], "B1" => ["CP",2], "C1" => ["CP",3], "F1" => ["CP",1], "E1" => ["CP",2], "D1" => ["CP",3], "90F1" => ["CP",2], "90E1" => ["CP",3], "90D1" => ["CP",4], "92B1" => ["CP",3], "92C1" => ["CP",3], "92E1" => ["CP",3], "92D1" => ["CP",3], "91E1" => ["CP",3], "91D1" => ["CP",3], "A3" => ["CP",2], "B3" => ["CP",2], "C3" => ["CP",3], "F3" => ["CP",1], "E3" => ["CP",2], "D3" => ["CP",3], "92B3" => ["CP",3], "92C3" => ["CP",3], "92E3" => ["CP",3], "92D3" => ["CP",3], "90A3" => ["CP",3], "90B3" => ["CP",3], "90C3" => ["CP",4], "90F3" => ["CP",2], "90E3" => ["CP",3], "90D3" => ["CP",4], "91B3" => ["CP",3], "91C3" => ["CP",3], "91E3" => ["CP",3], "91D3" => ["CP",3], "43" => ["CPL",1], "53" => ["CPL",1], "9053" => ["CPL",2], "33" => ["CPL",2], "73" => ["CPL",1], "63" => ["CPL",2], "9073" => ["CPL",2], "9063" => ["CPL",3], "9233" => ["CPL",3], "9263" => ["CPL",3], "9163" => ["CPL",3], "4A" => ["DEC",1], "5A" => ["DEC",1], "905A" => ["DEC",2], "3A" => ["DEC",2], "7A" => ["DEC",1], "6A" => ["DEC",2], "907A" => ["DEC",2], "906A" => ["DEC",3], "923A" => ["DEC",3], "926A" => ["DEC",3], "916A" => ["DEC",3], "8E" => ["HALT",1], "4C" => ["INC",1], "5C" => ["INC",1], "905C" => ["INC",2], "3C" => ["INC",2], "7C" => ["INC",1], "6C" => ["INC",2], "907C" => ["INC",2], "906C" => ["INC",3], "923C" => ["INC",3], "926C" => ["INC",3], "916C" => ["INC",3], "80" => ["IRET",1], "BC" => ["JP",2], "CC" => ["JP",3], "FC" => ["JP",1], "EC" => ["JP",2], "DC" => ["JP",3], "90FC" => ["JP",2], "90EC" => ["JP",3], "90DC" => ["JP",4], "92BC" => ["JP",3], "92CC" => ["JP",3], "92EC" => ["JP",3], "92DC" => ["JP",3], "91EC" => ["JP",3], "91DC" => ["JP",3], "20" => ["JRA",2], "9220" => ["JRA",3], "25" => ["JRC",2], "9225" => ["JRC",3], "27" => ["JREQ",2], "9227" => ["JREQ",3], "21" => ["JREF",2], "9221" => ["JREF",3], "29" => ["JRH",2], "9229" => ["JRH",3], "2F" => ["JRIH",2], "922F" => ["JRIH",3], "2E" => ["JRIL",2], "922E" => ["JRIL",3], "2D" => ["JRM",2], "922D" => ["JRM",3], "2B" => ["JRMI",2], "922B" => ["JRMI",3], "24" => ["JRNC",2], "9224" => ["JRNC",3], "26" => ["JRNE",2], "9226" => ["JRNE",3], "28" => ["JRNH",2], "9228" => ["JRNH",3], "2C" => ["JRNM",2], "922C" => ["JRNM",3], "2A" => ["JRPL",2], "922A" => ["JRPL",3], "20" => ["JRT",2], "9220" => ["JRT",3], "24" => ["JRUGE",2], "9224" => ["JRUGE",3], "22" => ["JRUGT",2], "9222" => ["JRUGT",3], "23" => ["JRULE",2], "9223" => ["JRULE",3], "25" => ["JRULT",2], "9225" => ["JRULT",3], "A6" => ["LD",2], "B6" => ["LD",2], "C6" => ["LD",3], "F6" => ["LD",1], "E6" => ["LD",2], "D6" => ["LD",3], "90F6" => ["LD",2], "90E6" => ["LD",3], "90D6" => ["LD",4], "92B6" => ["LD",3], "92C6" => ["LD",3], "92E6" => ["LD",3], "92D6" => ["LD",3], "91E6" => ["LD",3], "91D6" => ["LD",3], "B7" => ["LD",2], "C7" => ["LD",3], "F7" => ["LD",1], "E7" => ["LD",2], "D7" => ["LD",3], "90F7" => ["LD",2], "90E7" => ["LD",3], "90D7" => ["LD",4], "92B7" => ["LD",3], "92C7" => ["LD",3], "92E7" => ["LD",3], "92D7" => ["LD",3], "91E7" => ["LD",3], "91D7" => ["LD",3], "AE" => ["LD",2], "BE" => ["LD",2], "CE" => ["LD",3], "FE" => ["LD",1], "EE" => ["LD",2], "DE" => ["LD",3], "92BE" => ["LD",3], "92CE" => ["LD",3], "92EE" => ["LD",3], "92DE" => ["LD",3], "BF" => ["LD",2], "CF" => ["LD",3], "FF" => ["LD",1], "EF" => ["LD",2], "DF" => ["LD",3], "92BF" => ["LD",3], "92CF" => ["LD",3], "92EF" => ["LD",3], "92DF" => ["LD",3], "90AE" => ["LD",3], "90BE" => ["LD",3], "90CE" => ["LD",4], "90FE" => ["LD",2], "90EE" => ["LD",3], "90DE" => ["LD",4], "91BE" => ["LD",3], "91CE" => ["LD",3], "91EE" => ["LD",3], "91DE" => ["LD",3], "90BF" => ["LD",3], "90CF" => ["LD",4], "90FF" => ["LD",2], "90EF" => ["LD",3], "90DF" => ["LD",4], "91BF" => ["LD",3], "91CF" => ["LD",3], "91EF" => ["LD",3], "91DF" => ["LD",3], "97" => ["LD",1], "9F" => ["LD",1], "9097" => ["LD",2], "909F" => ["LD",2], "9093" => ["LD",2], "93" => ["LD",1], "9E" => ["LD",1], "95" => ["LD",1], "96" => ["LD",1], "94" => ["LD",1], "9096" => ["LD",2], "9094" => ["LD",2], "42" => ["MUL",1], "9042" => ["MUL",2], "40" => ["NEG",1], "50" => ["NEG",1], "9050" => ["NEG",2], "30" => ["NEG",2], "70" => ["NEG",1], "60" => ["NEG",2], "9070" => ["NEG",2], "9060" => ["NEG",3], "9230" => ["NEG",3], "9260" => ["NEG",3], "9160" => ["NEG",3], "9D" => ["NOP",1], "AA" => ["OR",2], "BA" => ["OR",2], "CA" => ["OR",3], "FA" => ["OR",1], "EA" => ["OR",2], "DA" => ["OR",3], "90FA" => ["OR",2], "90EA" => ["OR",3], "90DA" => ["OR",4], "92BA" => ["OR",3], "92CA" => ["OR",3], "92EA" => ["OR",3], "92DA" => ["OR",3], "91EA" => ["OR",3], "91DA" => ["OR",3], "84" => ["POP",1], "85" => ["POP",1], "9085" => ["POP",2], "86" => ["POP",1], "88" => ["PUSH",1], "89" => ["PUSH",1], "9089" => ["PUSH",2], "8A" => ["PUSH",1], "98" => ["RCF",1], "81" => ["RET",1], "9A" => ["RIM",1], "49" => ["RLC",1], "59" => ["RLC",1], "9059" => ["RLC",2], "39" => ["RLC",2], "79" => ["RLC",1], "69" => ["RLC",2], "9079" => ["RLC",2], "9069" => ["RLC",3], "9239" => ["RLC",3], "9269" => ["RLC",3], "9169" => ["RLC",3], "46" => ["RRC",1], "56" => ["RRC",1], "9056" => ["RRC",2], "36" => ["RRC",2], "76" => ["RRC",1], "66" => ["RRC",2], "9076" => ["RRC",2], "9066" => ["RRC",3], "9236" => ["RRC",3], "9266" => ["RRC",3], "9166" => ["RRC",3], "9C" => ["RSP",1], "A2" => ["SBC",2], "B2" => ["SBC",2], "C2" => ["SBC",3], "F2" => ["SBC",1], "E2" => ["SBC",2], "D2" => ["SBC",3], "90F2" => ["SBC",2], "90E2" => ["SBC",3], "90D2" => ["SBC",4], "92B2" => ["SBC",3], "92C2" => ["SBC",3], "92E2" => ["SBC",3], "92D2" => ["SBC",3], "91E2" => ["SBC",3], "91D2" => ["SBC",3], "99" => ["SCF",1], "9B" => ["SIM",1], "48" => ["SLA or SLL",1], "58" => ["SLA or SLL",1], "9058" => ["SLA or SLL",2], "38" => ["SLA or SLL",2], "78" => ["SLA or SLL",1], "68" => ["SLA or SLL",2], "9078" => ["SLA or SLL",2], "9068" => ["SLA or SLL",3], "9238" => ["SLA or SLL",3], "9268" => ["SLA or SLL",3], "9168" => ["SLA or SLL",3], "47" => ["SRA",1], "57" => ["SRA",1], "9057" => ["SRA",2], "37" => ["SRA",2], "77" => ["SRA",1], "67" => ["SRA",2], "9077" => ["SRA",2], "9067" => ["SRA",3], "9237" => ["SRA",3], "9267" => ["SRA",3], "9167" => ["SRA",3], "44" => ["SRL",1], "54" => ["SRL",1], "9054" => ["SRL",2], "34" => ["SRL",2], "74" => ["SRL",1], "64" => ["SRL",2], "9074" => ["SRL",2], "9064" => ["SRL",3], "9234" => ["SRL",3], "9264" => ["SRL",3], "9164" => ["SRL",3], "A0" => ["SUB",2], "B0" => ["SUB",2], "C0" => ["SUB",3], "F0" => ["SUB",1], "E0" => ["SUB",2], "D0" => ["SUB",3], "90F0" => ["SUB",2], "90E0" => ["SUB",3], "90D0" => ["SUB",4], "92B0" => ["SUB",3], "92C0" => ["SUB",3], "92E0" => ["SUB",3], "92D0" => ["SUB",3], "91E0" => ["SUB",3], "91D0" => ["SUB",3], "4E" => ["SWAP",1], "5E" => ["SWAP",1], "905E" => ["SWAP",2], "3E" => ["SWAP",2], "7E" => ["SWAP",1], "6E" => ["SWAP",2], "907E" => ["SWAP",2], "906E" => ["SWAP",3], "923E" => ["SWAP",3], "926E" => ["SWAP",3], "916E" => ["SWAP",3], "4D" => ["TNZ",1], "5D" => ["TNZ",1], "905D" => ["TNZ",2], "3D" => ["TNZ",2], "7D" => ["TNZ",1], "6D" => ["TNZ",2], "907D" => ["TNZ",2], "906D" => ["TNZ",3], "923D" => ["TNZ",3], "926D" => ["TNZ",3], "916D" => ["TNZ",3], "83" => ["TRAP",1], "8F" => ["WFI",1], "A8" => ["XOR",2], "B8" => ["XOR",2], "C8" => ["XOR",3], "F8" => ["XOR",1], "E8" => ["XOR",2], "D8" => ["XOR",3], "90F8" => ["XOR",2], "90E8" => ["XOR",3], "90D8" => ["XOR",4], "92B8" => ["XOR",3], "92C8" => ["XOR",3], "92E8" => ["XOR",3], "92D8" => ["XOR",3], "91E8" => ["XOR",3], "91D8" => ["XOR",3] ); ################################## my $data_type_1st = '0C'; ################################## sub Read { my ($fh,$ofs, $size,$desc)= @_; $fh->seek($fh, $ofs); my $data; $fh->read($data, $size); return unpack("V",$data); } ################################## sub ReadAll { my ($fh,$size)= @_; #$fh->seek($fh, 0); my $data; print STDOUT "\nFilesize:$size\n"; $fh->read($data, $size); return $data; } ################################## sub PrintData { my ($all_data,$temp,$fh) = @_; my %t = %{$temp}; open(FILE,"+> ./$fh") if defined($fh); #print FILE $all_data."\n\n"; foreach my $u (sort {$a cmp $b} (keys %t)) { print STDOUT "$u : ".$t{$u}."\n"; print FILE "$u : ".$t{$u}."\n" if defined($fh); } close(FILE) if defined($fh); } ################################## sub GetData { my @temp = @_; my $data=""; my $value = $temp[0].$temp[1]; for (my $n=4;$n<=hex($value)*2+1;$n++) { $data.=$temp[$n]; } return $data; } ################################## sub ShiftData { my ($s,@u) = @_; my $lixo; $lixo = shift(@u); $lixo = shift(@u); for (my $n=0;$n<($s*2);$n++) { $lixo = shift(@u); } return @u; } ################################## sub Process_datatypes { my @temp = @_; my @temp2 = split(//,$data_type_1st); my $size_1st = scalar(@temp2); my $count=0; my $zz = scalar(@temp); my @tmp = @temp; while($zz){ $p=""; my $cc = $size_1st; while($cc--) { $p.=shift(@temp); $count++; } if ($p eq $data_type_1st) { my $key = "".$temp[2].$temp[3].""; if (defined($DATA_TYPES{$key}) && $DATA_TYPES{$key} ne "") { my $a; $a->{'pos'} = $count/2-1; $a->{'keytype'} = $key; $a->{'type'} = $DATA_TYPES{$key}; $a->{'size'} = "".$temp[0].$temp[1].""; $a->{'data'} = GetData(@temp); if ($count eq 2 || $tmp[$count-3] ne "9") { my $s_t = hex($temp[0].$temp[1]); @temp = ShiftData(hex($temp[0].$temp[1]),@temp); $zz = $zz - 2 - $s_t*2; $count = $count + 2 + $s_t*2; push(@POSSIBLE_DATA_TYPES,$a); } } } $zz=$zz-2; } } ################################## sub Print_Possible_Datatypes { my @temp = @_; print STDOUT "\nData types count:".scalar(@temp)."\n"; print STDOUT "\n-----------------"; foreach my $u (@temp) { print STDOUT "\nAddress: #".sprintf("%x",$u->{'pos'}); print STDOUT "\nCode: ".$data_type_1st.$u->{'size'}.$u->{'keytype'}; print STDOUT "\nSize: ".$u->{'size'}; print STDOUT "\nType code: ".$u->{'keytype'}; print STDOUT "\nData type: ".$u->{'type'}; print STDOUT "\nData: ".$u->{'data'}; print STDOUT "\n-----------------\n"; } } ################################## sub Process_opcode { my @temp = @_; } ################################## my $fh= IO::File->new($ARGV[0], "r"); my $fileSize = -s "./$ARGV[0]"; binmode $fh; #$fileSize = 2048; my $size = $ARGV[1]; $flag = $fileSize; my $ttt = $fileSize*2; my $data = unpack('H*',ReadAll($fh,$fileSize)); my @DATA_STORAGE = split(//,$data); my %DATA_FINAL = (); my $add=0; my $address = $add-($size/2); while($flag ne 0 && $flag >0) { my $value=""; for (my $n=0;$n<$size;$n++) { $value.= $DATA_STORAGE[$add+$n]; } $address+=($size/2); $DATA_FINAL{sprintf("%8x",$address)} = $value; $flag-=($size/2); $add+=$size; } PrintData($data,\%DATA_FINAL,"out"); ##while($flag) ##{ ## ## #print STDOUT "".($fileSize-$flag)."\n"; ## print STDOUT "'".$data."'\n"; ## $flag-=$size; ##} #print STDOUT unpack("V",); #print STDOUT ; $fh->close(); Process_datatypes(@DATA_STORAGE); Print_Possible_Datatypes(@POSSIBLE_DATA_TYPES); Process_opcode(@DATA_STORAGE);