• Olá Visitante, se gosta do forum e pretende contribuir com um donativo para auxiliar nos encargos financeiros inerentes ao alojamento desta plataforma, pode encontrar mais informações sobre os várias formas disponíveis para o fazer no seguinte tópico: leia mais... O seu contributo é importante! Obrigado.

Openbox V6 F7S V8S etc Firmware para ALI3511

Status
Não está aberto para novas respostas.

flash242424

GF Bronze
Membro Inactivo
Entrou
Dez 10, 2010
Mensagens
39
Gostos Recebidos
0
Como já tinha publicado é possível ter as Openboxes V6 F7S V8S a funcionar sem problemas de imagem nos canais SD (problema conhecido onde temos som mas não temos imagem).
Para tal é necessário instalar a firmware da Solovox V8S plus seja este por USB ou RS232 (null modem).
O problema é que a Solovox não fornece as suas firmwares de forma grátis e tem um processo de licenciamento que deve ser feito por cabo RS232 e software deles.

Decidi abrir este tópico para tornar publico as estratégias que em conjunto com outros utilizadores temos vindo a trabalhar, bem como as nossas descobertas.
Não irei citar esses mesmos que se desejarem identifiquem-se neste tópico.

Ferramentas/Software/Firmware Solovox
http://www.solovox.xyz/download

Resumo do que sabemos em relação à firmware da solovox:
  1. A firmware no código vai ler uma chave à memoria (vou chamar password) e valida-a com o numero de serie se esta password está certa caso não estivesse dava "NO AUTH"
  2. Existe um servidor para gerir as licenças que a Solovox vende e é este que gerava as passwords para as boxes (actualmente em https://45.248.86.44)
  3. Existe um software (dpt_main_2.4.exe) para licenciar as boxes que:
    1. Pergunta à box qual o numero de serie
    2. Envia ao servidor o numero de serie
    3. Servidor gera a password e marca a licença como gasta
    4. Guarda na box essa password em processo OTP

  • Anular licenciamento na firmware - reverse engeniring da firmware
    É necessário usar um firmware decrypter para começar por separar as varias partes da firmware, apenas encontrei uma parte (AppsData) de diferença entre a firmware da solovox e a original, esta parte nada deve influenciar para o que queremos fazer, então extrai o maincode.
    Este maincode em lzma se estiver tudo ok deve ser possível descompactar com 7-zip.
    O problema é que está cifrado e não sabemos qual é a chave para fazer o decrypt.
    Alguém sabe como passar este problema?

    Código:
    [SIZE=2]File size = 7340032 bytes ( 7168 kB )
    ---------------Part1---------------
    Name        : bootloader
    ID          : 0x23010010
    SIZE DATA   : 0x00000000
    OFFSET      : 0x0001EE00
    Version     : DVBS2---0.1.0
    Date        : 2017-08-22
    Actual CRC  : 0x4E435243
    No CRC!  - OK!
    ------------------------------------
    ---------------Part2---------------
    Name        : MemCfg
    ID          : 0x07F80100
    SIZE DATA   : 0x00000870
    OFFSET      : 0x00001000
    Version     : 00000001
    Date        : 2014-5-15
    Actual CRC  : 0x4E435243
    No CRC!  - OK!
    ------------------------------------
    ---------------Part3---------------
    Name        : upgcode
    ID          : 0x05FA0100
    SIZE DATA   : 0x00000000
    OFFSET      : 0x00010200
    Version     : upg 1.0.0
    Date        : 2017-08-22
    Actual CRC  : 0x4E435243
    No CRC!  - OK!
    ------------------------------------
    ---------------Part4---------------
    Name        : maincode
    ID          : 0x01FE0101
    SIZE DATA   : 0x002613E6
    OFFSET      : 0x00380000
    Version     : M3511 HD
    Date        : 2017-08-22
    Actual CRC  : 0x1242DF8D
    Calculate CRC   : 0x1242DF8D - OK!
    ------------------------------------
    ---------------Part5---------------
    Name        : seecode
    ID          : 0x06F90101
    SIZE DATA   : 0x00111797
    OFFSET      : 0x0011FF80
    Version     : MSEE Demo
    Date        : 2017-08-22
    Actual CRC  : 0xFA52204F
    Calculate CRC   : 0xFA52204F - OK!
    ------------------------------------
    ---------------Part6---------------
    Name        : AppsData
    ID          : 0x50AF0100
    SIZE DATA   : 0x00010070
    OFFSET      : 0x00040080
    Version     : 1.0.0
    Date        : 2016-2-27
    Actual CRC  : 0x4E435243
    No CRC!  - OK!
    ------------------------------------
    ---------------Part7---------------
    Name        : BOOTLOG
    ID          : 0x02FD0200
    SIZE DATA   : 0x0000F3A9
    OFFSET      : 0x00010000
    Version     : 1.0.0
    Date        : 2017-08-22
    Actual CRC  : 0xDCB91805
    Calculate CRC   : 0xDCB91805 - OK!
    ------------------------------------
    ---------------Part8---------------
    Name        : Radioback
    ID          : 0x02FD0100
    SIZE DATA   : 0x00009566
    OFFSET      : 0x00010000
    Version     : 1.0.0
    Date        : 2017-08-22
    Actual CRC  : 0x9482F52C
    Calculate CRC   : 0x9482F52C - OK!
    ------------------------------------
    ---------------Part9---------------
    Name        : defaultdb
    ID          : 0x03FC0100
    SIZE DATA   : 0x000193C0
    OFFSET      : 0x0001FF80
    Version     : 1.1.0
    Date        : 2014-4-15
    Actual CRC  : 0x2075EFDC
    Calculate CRC   : 0x2075EFDC - OK!
    ------------------------------------
    ---------------Part10---------------
    Name        : userdb
    ID          : 0x04FB0100
    SIZE DATA   : 0x00170070
    OFFSET      : 0x00000000
    Version     : 1.0.0
    Date        : 2017-8-22
    Actual CRC  : 0x4E435243
    No CRC!  - OK!
    ------------------------------------[/SIZE]

    Abaixo deixo ferramentas que usei:
    FirmwareDecrypter_v8.9.zip
    http://www.satedu.cba.pl/index.php?action=downloadfile&filename=FirmwareDecrypter_v8.9.zip&directory=Test%20Folder&

    Ali__tools_Console_v4.0__CRC_FIXER.rar
    http://www.satedu.cba.pl/index.php?action=downloadfile&filename=Ali__tools_Console_v4.0__CRC_FIXER.rar&directory=Test%20Folder&


  • Snifar pedidos HTTP com Wireshark
    Ainda sem sucesso devido aos chineses não serem amadores e terem usado no servidor de licenças certificado SSL (https) para dificultar o sniffing dos pedidos HTTP.


  • Snifar porta serie (RS232) para perceber como é feito o licenciamento
    Sei que começa pelo comando ".getsn 8." para pedir à box o numero de serie.
    Ainda não tenho um snifing completo dos comandos da porta serie porque uma vez a box licenciada não dá para licenciar de novo.
    Se alguém por licenciar uma box por favor use um snifer por software ou hardware e guarde os comandos trocados entre o software de autenticação e a box.


  • Reverse engeniring do software de licencimento
    Consegui fazer decompile ao software de autenticação da solovox (dpt_main_2.4.exe).
    Já tenho uma versão em Python legível mas ainda não perfeita, contudo já descobri que estou certo na estratégia que usaram para licenciar as boxes.
    Outra coisa que descobri foi os endpoints do servidor para a API.

    RSC_ORDER_INFO = '/order_info'
    RSC_PRODUCTION = '/chip_with_sn_production'

    Exemplo order_info para receber informação das licenças:
    https://45.248.86.44/dpt/api/order_info?key=bbd43b00-a99e-55e3-9828-71ba26097347

    (com key vazia curiosamente tem licenças por usar)
    https://45.248.86.44/dpt/api/order_info?key=

    Exemplo chip_with_sn_production para receber password:
    https://45.248.86.44/dpt/api/chip_with_sn_production?key=bbd43b00-a99e-55e3-9828-71ba26097347&chip_sn=Ainda_n_sei_formato

    Continuo a tentar ler o código para perceber quais os comandos usados na porta serie.

    Código Python das principais classes (tenho completo se alguém necessitar peça por mp)
    Código:
    [SIZE=2]# -*- coding: utf-8 -*-
    
    __author__     = "Roy Wang (roy.dicovi@gmail.com)"
    __version__    = "2.4"
    __date__       = "$Date: 2013/11/26 14:00:00 $"
    __copyright__  = "Copyright (c) 2013 Dicovi"
    __license__    = "Dicovi"
    
    
    from PyQt4.QtGui import *  
    from PyQt4.QtCore import *
    import sys, os
    from dpt_client import *
    from ui_dpt import *
    import serial
    import sip, decimal
    import dpt_qrc
    
    class DptClientCfg():
        def __init__(self):
            self.port = 0
            self.key = ''
            self.api = ''
            self.lan = "english"
            self.cfgfilename = './production.cfg'
            
        def readcfg(self):
            if not os.path.exists(self.cfgfilename):
                return False
            try:
                file_hander = open(self.cfgfilename, 'r')
            except (IOError, OSError):
                return False
            
            lines  = file_hander.readlines()
            file_hander.close()
        
            for line in lines:
                line = str(line).strip()
                if line.startswith('#'):
                    continue
                value = str(line.split('=')[1]).strip()
                if line.startswith('port') or line.startswith('PORT'):
                    value = value.lstrip('COM')
                    value = value.lstrip('com')
                    if not value.isdigit():
                        return False
                    self.port = int(value)
                if line.startswith('productionkey') or line.startswith('PRODUCTIONKEY'):
                    self.key = value
                if line.startswith('LANGUAGE') or line.startswith('language'):
                    self.lan = value
                if line.startswith('API') or line.startswith('api'):
                    self.api = value
            if self.port == 0:
                return False
            if self.key == '':      
                return False
            return True
        
        def writecfg(self):        
            try:
                file_hander = open(self.cfgfilename, 'w')
            except (IOError, OSError):
                return False
            
            item = "language=" + self.lan + "\n"
            file_hander.write(item)
            item = "port=COM"+str(self.port) + "\n"
            file_hander.write(item)
            item = "productionkey=" + self.key + "\n"
            file_hander.write(item)
            item = "api=" + self.api + "\n"
            file_hander.write(item)
            file_hander.close()
            return True
    
    '''
    class MovieSplashScreen(QSplashScreen):
        def __init__(self, movie, parent = None):
            movie.jumpToFrame(0)
            pixmap = QPixmap(movie.frameRect().size())
            QSplashScreen.__init__(self, pixmap)
            self.movie = movie
            self.movie.frameChanged.connect(self.repaint)
            
        def showEvent(self, event):
            self.movie.start()
            
        def hideEvent(self, event):
            self.movie.stop()
            
        def paintEvent(self, event):
            painter = QPainter(self)
            pixmap = self.movie.currentPixmap()
            self.setMask(pixmap.mask())
            painter.drawPixmap(0, 0, pixmap)
            
        def sizeHint(self):
            return self.movie.scaledSize()
    '''
        
    class waitDlg(QDialog):
        def __init__(self, parent=None,  win_x=0, win_y=0, win_w=0, win_h=0):
            super(waitDlg, self).__init__(parent)
            w = h = 128
            x = win_x + (win_w - w)/2
            y = win_y + (win_h - h)/2
            self.setGeometry(x,y,w,h)
            self.resize(128,128)
            #self.gif = QGraphicsView("./icon/loading.gif")
            
            self.label = QLabel(self)
            #self.label.setText("Waitting...")
            self.label.resize(128,128)
            self.movie = QMovie(":/icon/loading.gif")
            #print self.movie.currentImage()
            #print self.movie.currentPixmap()
        
            self.label.setMovie(self.movie)
            self.setWindowFlags(Qt.FramelessWindowHint)
            self.setAutoFillBackground(True)
            self.movie.start()
        def __del__(self):
            self.movie.stop()
    
    
      
    class DptMainWin(QMainWindow):
        def scan_serial(self):
            """scan for available ports. return a list of tuples (num, name)"""
            available = []
            for i in range(16):
                try:
                    s = serial.Serial(i)
                    available.append(s.portstr)
                    s.close()   # explicit close 'cause of delayed GC in java
                except serial.SerialException:
                    pass
            return available
        
        def update_translate(self):
            self.setWindowTitle(self.tr("Production Tools"))
            self.ui.menuHelp.setTitle(self.tr("Help"))
            self.ui.actionAbout.setText(self.tr("About"))
            self.ui.label_lan.setText(self.tr("Language"))
            self.ui.label_port.setText(self.tr("Serial Port"))
            self.ui.label_api.setText(self.tr("API"))
            self.ui.label_key.setText(self.tr("Production Key"))
            self.ui.label_info.setText(self.tr("Information"))
            self.ui.label_model.setText(self.tr("Model"))
            self.ui.label_order.setText(self.tr("Order"))
            self.ui.label_total.setText(self.tr("Total"))
            self.ui.label_producted.setText(self.tr("Producted"))
            self.ui.start.setText(self.tr("Start")) 
        
        def __init__(self, app, parent=None):
            super(DptMainWin, self).__init__(parent)
            self.app = app
            
            self.cfg = DptClientCfg()
            self.cfg.readcfg() 
            self.trans = None
            if self.cfg.lan == "chinese":
                trans = QTranslator()
                trans.load(":/zh_CN.qm")
                self.app.installTranslator(trans)
                self.trans = trans
            
            ui = Ui_mainWindow()
            ui.setupUi(self)
            self.ui = ui
            self.update_translate()
            
            ui.lan.addItems((u"English", u"简体中文"))
            if self.cfg.lan == "chinese":
                ui.lan.setCurrentIndex(1)
            else:
                ui.lan.setCurrentIndex(0)
            
            self.connect(ui.lan, SIGNAL("currentIndexChanged(int)"), self.change_lan)
            available_port = self.scan_serial()
            ui.port.addItems(available_port)
            
           
            if self.cfg.port > 0:
                port = "COM" + str(self.cfg.port)
                idx = ui.port.findText(port)
                if idx >= 0:
                    ui.port.setCurrentIndex(idx)
            
            if len(self.cfg.api) > 0:
                ui.api.setText(self.cfg.api)
            if len(self.cfg.key) > 0:
                ui.production_key.setText(self.cfg.key)
            
            ui.total.setProperty("intValue", 0)
            ui.producted.setProperty("intValue", 0)
            ui.result.setProperty("intValue", 0)
            #ui.info.setDisabled(True)
            #ui.model.setDisabled(True)
            #ui.order.setDisabled(True)
            
            self.connect(ui.start,SIGNAL("clicked()"),self.tweak_production)
            #self.connect(ui.actionAbout, SIGNAL("clicked()"), self.showAbout)
            ui.actionAbout.triggered.connect(self.showAbout)
            
            self.worker = DptClientWorker()  
            self.connect(self.worker, SIGNAL("msg_out"), self.update_msg)
            self.connect(self.worker, SIGNAL("update_num"), self.update_num)
            self.connect(self.worker, SIGNAL("update_info"), self.update_info)
            self.connect(self.worker, SIGNAL("finished()"), self.stop_update_ui) 
            self.connect(self.worker, SIGNAL("terminated()"), self.stop_update_ui)
            self.connect(self.worker, SIGNAL("update_result"), self.update_result_led)
            
            
            self.productioning = False       
            self.wait = None
        
        def closeEvent(self, event):
            if self.productioning:
                self.worker.stop()
                if None == self.wait:
                    self.wait = waitDlg(win_x=self.x(), win_y=self.y(), win_w=self.width(), win_h=self.height()) #waitDlg()
                    self.wait.exec_()
            while self.productioning:
                time.sleep(0.1)
                
        def change_lan(self, idx):
            if idx == 1:
                self.cfg.lan = "chinese"
            else:
                self.cfg.lan = "english"
            self.cfg.writecfg()
            
            if self.trans is not None:
                self.app.removeTranslator(self.trans)
                self.trans = None
                
            if self.cfg.lan == "chinese":
                trans = QTranslator()
                trans.load(":/zh_CN.qm")
                self.app.installTranslator(trans)
                self.trans = trans
                
            self.update_translate()
                
    
        def tweak_production(self):
            if not self.productioning:
                key = self.ui.production_key.text()
                api = self.ui.api.text()
                key = str(key).strip()
                api = str(api).strip()
                if len(api)==0 or len(key) == 0:
                    return
                if not str(api).startswith("https://"):
                    return
                
                portstr = str(self.ui.port.currentText())
                if len(portstr) == 0:
                    return
                
                #print "start production"
                port = int(portstr.lstrip("COM").lstrip("com"))
                self.ui.api.setDisabled(True)
                self.ui.lan.setDisabled(True)
                self.ui.port.setDisabled(True)
                self.ui.production_key.setDisabled(True)
                self.ui.start.setText(self.tr("Stop"))
    
                self.ui.info.clear()
                self.worker.set_param(unicode(api), port, unicode(key))
                self.cfg.port = port
                self.cfg.key = key
                self.cfg.api = api
                self.cfg.writecfg()
                self.worker.start()
                self.productioning = True
            else:
                #print "stop production"
                self.worker.stop()
                if None == self.wait:
                    self.wait = waitDlg(win_x=self.x(), win_y=self.y(), win_w=self.width(), win_h=self.height()) 
                    self.wait.exec_()            
                #if not self.wait.isActiveWindow():
                #    self.wait.exec_()
    
        
        def stop_update_ui(self):
            #print "stop_update_ui"
            ui = self.ui
            ui.lan.setDisabled(False)
            ui.port.setDisabled(False)
            ui.api.setDisabled(False)
            ui.production_key.setDisabled(False)
            ui.model.clear()
            ui.order.clear()
            ui.info.clear()
            ui.total.setProperty("intValue", 0)
            ui.producted.setProperty("intValue", 0)
            ui.result.setProperty("intValue", 0)
            
            #ui.info.clear()
            ui.start.setText(self.tr("Start"))
            ui.start.setDisabled(False)
            
            #self.******.finish(self)
            if None != self.wait:
                self.wait.close()
                self.wait.destroy()
                self.wait = None
            #if self.wait.isActiveWindow():
            #    self.wait.close()
            self.productioning = False
            
        
        def update_msg(self, clean=0, msg=""):
            ui = self.ui
            if clean == 1:
                ui.info.clear()
            if msg != "":
                ui.info.append(msg)
            
            
        def update_num(self, total=0, producted=0):
            ui = self.ui
            ui.total.setProperty("intValue", total)
            ui.producted.setProperty("intValue", producted)
            
        def update_result_led(self, result = 0):
            ui = self.ui
            ui.result.setProperty("intValue", result)
            
            
        def update_info(self, info):
            if not isinstance(info, dict):
                return
            ui = self.ui
            if dict(info).has_key('model_description'):
                ui.model.setText(info['model_description'])
            if dict(info).has_key('order_description'):
                ui.order.setText(info['order_description'])
            if dict(info).has_key('number'):
                ui.total.setProperty("intValue", info['number'])
            if dict(info).has_key('producted'):
                ui.producted.setProperty("intValue", info['producted'])
        
        def showAbout(self):
            QMessageBox.about(self, self.tr("About"), self.tr("DTP Version: ") + __version__)
    
    
    #trans = QTranslator()
    #trans.load("zh_CN")
    app=QApplication(sys.argv)
    #app.installTranslator(trans)
    #app.removeTranslator(trans)
    win=DptMainWin(app=app)
    win.show()
    app.exec_()[/SIZE]
    https://pastebin.com/tP61q2tv
    https://pastebin.com/ZHt5DUqa


  • Desenvolver ou corrigir problema numa firmware antiga
    Alguém sabe onde se pode encontrar código fonte duma firmware para estes processadores?

Com todas estas estratégias combinadas é certo que conseguimos colocar estas boxs com processador ALI3511 de volta a funcionar sem ter de se pagar licenças.
Toda ajuda é bem-vinda.
Tentarei de futuro organizar a informação melhor.
 
Última edição:

Qu4k3

Super-Moderador
Team GForum
Entrou
Abr 9, 2009
Mensagens
166
Gostos Recebidos
88
Bom trabalho. A parte do sniff amanha ja devo ter algo. Cumps
 

Qu4k3

Super-Moderador
Team GForum
Entrou
Abr 9, 2009
Mensagens
166
Gostos Recebidos
88
Boa partilha Qu4k3, é um começo mas o ideal era encontrar o maincode, quando tiver tempo vou dar uma vista de olhos.
Estou a ver que vou ter de aprender chinês que estás firmwares estão todas em chinoca ahhahaha

Estive a dar uma vista de olhos no que postaste.
Ja pensaste em alterar a parte em que o dptclient envia a informacao a api para atualizar o "producted" para este nao enviar o "+1" ? Se o resultado for positivo poderiamos guardar uma key fixa pelo menos ate eles descobrirem a manobra...

Quanto a ideia de que tinhamos falado de enviar sempre a mesma info para as box, nao vai dar:

Error: This chip sn already producted':

Eles guardam o sn.

:/
 
Última edição:

alheir0

GF Bronze
Membro Inactivo
Entrou
Set 9, 2017
Mensagens
9
Gostos Recebidos
0
a solovox colocou hoje no site deles de como funciona o processo de autenticação das boxes com chipset ali3511, dêm uma olhada, pode dar algumas informações interessantes.
 

flash242424

GF Bronze
Membro Inactivo
Entrou
Dez 10, 2010
Mensagens
39
Gostos Recebidos
0
Estive a dar uma vista de olhos no que postaste.
Ja pensaste em alterar a parte em que o dptclient envia a informacao a api para atualizar o "producted" para este nao enviar o "+1" ? Se o resultado for positivo poderiamos guardar uma key fixa pelo menos ate eles descobrirem a manobra...

Quanto a ideia de que tinhamos falado de enviar sempre a mesma info para as box, nao vai dar:

Error: This chip sn already producted':

Eles guardam o sn.

:/
A ideia é boa vou analisar melhor porque acho que o +1 (licença utilizada) é contabilizado quando é pedido ao servidor a password para guardar na box.
Se assim for não temos como saltar o +1.
Analisa a parte do RSC_PRODUCTION em https://pastebin.com/tP61q2tv a ver se concordas.

a solovox colocou hoje no site deles de como funciona o processo de autenticação das boxes com chipset ali3511, dêm uma olhada, pode dar algumas informações interessantes.
Sim publicaram dia 8 de março mas apenas explicam como usar o software de autencticação deles.

Estive a fazer sniffing a uma box e pelo que vi eles acedem a um servidor FTP
Boa descoberta!!! Vamos ter de analisar aquele script_new.pak, mais uma peça no puzzle.
Repara no contudo do servidor ftp://uyw3463610001:987654321a@47.88.101.81 parece o ftp onde a firmware vai buscar os updates para listas de canais e firmwares.
Grande porta abriste, boa!

Temos novos dados que acrencento ao topico.
Sniffing da box com numero de serie OPHDV8201811L05226
Código:
[SIZE=2]
getsn 8
       GSN¦¦x
             H+
               burnsn 8 64 32
                             ¦x
                               H+d¦/o¦¦??/g¦¦¤s=iX¦¦¦/¦PQ¦? *MY¦¦¦¦¦^¦,E¦B¦Kn¦¦m>¦¦¦j¦a¦.¦¦cJo¦¦¦¦¦^@¦¦?¦¦H
                           burnok

                                 getsn 8

                                        getsn 8

                                               getsn 8
                                                      url = ftp://47.88.101.81/script_new.pak
user_name = uyw3463610001
pwd= 987654321a

getsn 8

       getsn 8

              getsn 8

                     getsn 8
                            netif:lo is default
netif:en is default

getsn 8

       getsn 8

              getsn 8
                     fepg_com_data_load 24 cnt load mm!

getsn 8

       getsn 8
              pvr_push_vod_test: test path:/mnt/uda1/pvod

getsn 8

       getsn 8

              getsn 8

                     getsn 8

                            getsn 8

                                   getsn 8

                                          getsn 8

                                                 getsn 8

                                                        getsn 8

                                                               getsn 8

                                                                      getsn 8

                                                                             get                                                                                        sn 8

    getsn 8

           getsn 8

                  getsn 8

                         getsn 8

                                getsn 8

                                       getsn 8
                                              fepg_com_fake_update_task start.

getsn 8

       getsn 8

              getsn 8

                     getsn 8

                            getsn 8

                                   getsn 8

                                          getsn 8

                                                 getsn 8

                                                        getsn 8

                                                               getsn 8

                                                                      getsn 8
                                                                             url                    [/SIZE]
 
Última edição:

flash242424

GF Bronze
Membro Inactivo
Entrou
Dez 10, 2010
Mensagens
39
Gostos Recebidos
0
Código:
[SIZE=2]START=|APP|10|0
NAME=|570065006100740068006500720020004100700070006C00690063006100740069006F006E002E000000
DESC=|5900610068006F006F00200077006500610074006800650072002C002000610064006400200061006E0020006100700070006C00690063006100740069006F006E00200074006F0020004E006500740077006F0072006B0020004100700070002E000000
DATE=|21.10.2013
URL=|ftp://47.88.101.81/weather.pak
USER=|uyw3463610001
PWD=|987654321a
VER=|0
FILE_SIZE=|218823
PLATFORM=|255
OEM_ID=|2
END=|APP

START=|DBS|10|0
NAME=|540050004C006900730074005F00500052004F0047005F004100750073007400720061006C00690061005F0032003000310037003000330033000000
DESC=|540050004C006900730074005F00500052004F0047005F004100750073007400720061006C00690061005F00320030003100370030003300330031000000
DATE=|25.07.2017
URL=|ftp://47.88.101.81/TPList_PROG_Australia_20170331.pak
USER=|uyw3463610001
PWD=|987654321a
VER=|1
FILE_SIZE=|72781
PLATFORM=|1
OEM_ID=|2
END=|DBS

START=|DBS|10|0
NAME=|540050004C006900730074005F00500052004F0047005F004500750072006F00700065005F003100370030003800300031000000
DESC=|540050004C006900730074005F00500052004F0047005F004500750072006F00700065005F003100370030003800300031000000
DATE=|01.08.2017
URL=|ftp://47.88.101.81/TPList_PROG_Europe_170801.pak
USER=|uyw3463610001
PWD=|987654321a
VER=|1
FILE_SIZE=|171683
PLATFORM=|1
OEM_ID=|2
END=|DBS

START=|DBS|10|0
NAME=|540050004C006900730074005F00500052004F0047005F004900720065006C0061006E0064005F00320030003100370030003500300033000000
DESC=|540050004C006900730074005F00500052004F0047005F004900720065006C0061006E0064005F00320030003100370030003500300033000000
DATE=|25.07.2017
URL=|ftp://47.88.101.81/TPList_PROG_Ireland_20170503.pak
USER=|uyw3463610001
PWD=|987654321a
VER=|1
FILE_SIZE=|94429
PLATFORM=|1
OEM_ID=|2
END=|DBS

START=|DBS|10|0
NAME=|540050004C006900730074005F00500052004F0047005F0055004B005F00320030003100370030003700320035000000
DESC=|540050004C006900730074005F00500052004F0047005F0055004B005F00320030003100370030003700320035000000
DATE=|25.07.2017
URL=|ftp://47.88.101.81/TPList_PROG_UK_20170725.pak
USER=|uyw3463610001
PWD=|987654321a
VER=|1
FILE_SIZE=|102664
PLATFORM=|1
OEM_ID=|2
END=|DBS

START=|DBS|10|0
NAME=|5400500020004C006900730074002000460069006C006500200046006F007200200041007300690061000000
DESC=|5400500020004C006900730074002000460069006C006500200046006F007200200041007300690061000000
DATE=|25.07.2017
URL=|ftp://47.88.101.81/TP_List_File_For_Asia.pak
USER=|uyw3463610001
PWD=|987654321a
VER=|1
FILE_SIZE=|59465
PLATFORM=|1
OEM_ID=|2
END=|DBS

START=|DBS|10|0
NAME=|540050005F004C006900730074002000460069006C006500200046006F00720020004D006900640064006C006500200045006100730074000000
DESC=|540050005F004C006900730074002000460069006C006500200046006F00720020004D006900640064006C006500200045006100730074000000
DATE=|25.07.2017
URL=|ftp://47.88.101.81/TP_List_File_For_Middle_East.pak
USER=|uyw3463610001
PWD=|987654321a
VER=|1
FILE_SIZE=|64923
PLATFORM=|1
OEM_ID=|2
END=|DBS

START=|DBS|10|0
NAME=|5400500020004C006900730074002000460069006C006500200046006F00720020004E006F00720074006800200041006D0065007200690063000000
DESC=|5400500020004C006900730074002000460069006C006500200046006F00720020004E006F00720074006800200041006D00650072006900630061000000
DATE=|25.07.2017
URL=|ftp://47.88.101.81/TP_List_File_For_North_America.pak
USER=|uyw3463610001
PWD=|987654321a
VER=|1
FILE_SIZE=|44383
PLATFORM=|1
OEM_ID=|2
END=|DBS

START=|DBS|10|0
NAME=|5400500020004C006900730074002000460069006C006500200046006F007200200053006F00750074006800200041006D0065007200690063000000
DESC=|5400500020004C006900730074002000460069006C006500200046006F007200200053006F00750074006800200041006D00650072006900630061000000
DATE=|25.07.2017
URL=|ftp://47.88.101.81/TP_List_File_For_South_America.pak
USER=|uyw3463610001
PWD=|987654321a
VER=|1
FILE_SIZE=|39021
PLATFORM=|1
OEM_ID=|2
END=|DBS

START=|DBS|10|0
NAME=|540050005F00500052004F0047005F0053007000610069006E005F00320030003100380030003700330031000000
DESC=|540050005F00500052004F0047005F0053007000610069006E005F00320030003100380030003700330031000000
DATE=|31.07.2018
URL=|ftp://47.88.101.81/TP_PROG_Spain_20180731.pak
USER=|uyw3463610001
PWD=|987654321a
VER=|1
FILE_SIZE=|81632
PLATFORM=|1
OEM_ID=|2
END=|DBS

START=|DBS|10|0
NAME=|540050005F00500052004F0047005F0050006F00720074007500670075006500730065005F00320030003100390030003200320032000000
DESC=|540050005F00500052004F0047005F0050006F00720074007500670075006500730065005F00320030003100390030003200320032000000
DATE=|22.02.2019
URL=|ftp://47.88.101.81/TP_PROG_Portuguese_20190222.pak
USER=|uyw3463610001
PWD=|987654321a
VER=|1
FILE_SIZE=|46550
PLATFORM=|1
OEM_ID=|2
END=|DBS

START=|SOFTCAM|10|0
NAME=|53006F0066007400630061006D0020004B00650079000000
DESC=|53006F0066007400630061006D0020004B0065007900200066006F00720020007500700064006100740069006E0067000000
DATE=|29.12.2017
URL=|ftp://47.88.101.81/softcam_180316.pak
USER=|uyw3463610001
PWD=|987654321a
VER=|1
FILE_SIZE=|11882
PLATFORM=|255
OEM_ID=|2
END=|SOFTCAM

START=|SW_BIN|10|0
NAME=|4F00500045004E0042004F0058005F00560036005F00560037005F005600380050004C00550053005F004C00450044005F0031003700300038000000
DESC=|4F00500045004E0042004F0058005F00560036005F00560037005F005600380050004C00550053005F004C00450044005F003100370030003800320034000000
DATE=|03.01.2018
URL=|ftp://47.88.101.81/OPENBOX_V6_V7_V8PLUS_LED_170824.pak
USER=|uyw3463610001
PWD=|987654321a
VER=|1
FILE_SIZE=|3793225
PLATFORM=|32
OEM_ID=|1
END=|SW_BIN

START=|SW_BIN|10|0
NAME=|53004F004C004F0056004F0058005F00560036005F00560037005F005600380050004C00550053005F004C00450044005F0031003700300038000000
DESC=|53004F004C004F0056004F0058005F00560036005F00560037005F005600380050004C00550053005F004C00450044005F003100370030003800320034000000
DATE=|03.01.2018
URL=|ftp://47.88.101.81/SOLOVOX_V6_V7_V8PLUS_LED_170824.pak
USER=|uyw3463610001
PWD=|987654321a
VER=|1
FILE_SIZE=|3797763
PLATFORM=|32
OEM_ID=|1
END=|SW_BIN

START=|SW_BIN|10|0
NAME=|53005F0042004F0058005F00560036005F00560037005F005600380050004C00550053005F004C00450044005F003100370030003800320034000000
DESC=|53005F0042004F0058005F00560036005F00560037005F005600380050004C00550053005F004C00450044005F003100370030003800320034000000
DATE=|03.01.2018
URL=|ftp://47.88.101.81/S_BOX_V6_V7_V8PLUS_LED_170824.pak
USER=|uyw3463610001
PWD=|987654321a
VER=|1
FILE_SIZE=|3840992
PLATFORM=|32
OEM_ID=|1
END=|SW_BIN

START=|SW_BIN|10|0
NAME=|53005F0042004F0058005F00560037005F005600370050004C00550053005F005600460044005F003100370030003800320034000000
DESC=|53005F0042004F0058005F00560037005F005600370050004C00550053005F005600460044005F003100370030003800320034000000
DATE=|03.01.2018
URL=|ftp://47.88.101.81/S_BOX_V7_V7PLUS_VFD_170824.pak
USER=|uyw3463610001
PWD=|987654321a
VER=|1
FILE_SIZE=|3840983
PLATFORM=|32
OEM_ID=|1
END=|SW_BIN[/SIZE]

Infelizmente o scrypt_new.pak não tem nada de interessante e apenas uma lista de updates para firmware.
Vou continuar analisar os dados do sniffing da porta serie.
 

Qu4k3

Super-Moderador
Team GForum
Entrou
Abr 9, 2009
Mensagens
166
Gostos Recebidos
88
A ideia é boa vou analisar melhor porque acho que o +1 (licença utilizada) é contabilizado quando é pedido ao servidor a password para guardar na box.
Se assim for não temos como saltar o +1.
Analisa a parte do RSC_PRODUCTION em https://pastebin.com/tP61q2tv a ver se concordas.


Sim publicaram dia 8 de março mas apenas explicam como usar o software de autencticação deles.


Boa descoberta!!! Vamos ter de analisar aquele script_new.pak, mais uma peça no puzzle.
Repara no contudo do servidor ftp://uyw3463610001:987654321a@47.88.101.81 parece o ftp onde a firmware vai buscar os updates para listas de canais e firmwares.
Grande porta abriste, boa!

Temos novos dados que acrencento ao topico.
Sniffing da box com numero de serie OPHDV8201811L05226
Código:
[SIZE=2]
getsn 8
       GSN¦¦x
             H+
               burnsn 8 64 32
                             ¦x
                               H+d¦/o¦¦??/g¦¦¤s=iX¦¦¦/¦PQ¦? *MY¦¦¦¦¦^¦,E¦B¦Kn¦¦m>¦¦¦j¦a¦.¦¦cJo¦¦¦¦¦^@¦¦?¦¦H
                           burnok

                                 getsn 8

                                        getsn 8

                                               getsn 8
                                                      url = ftp://47.88.101.81/script_new.pak
user_name = uyw3463610001
pwd= 987654321a

getsn 8

       getsn 8

              getsn 8

                     getsn 8
                            netif:lo is default
netif:en is default

getsn 8

       getsn 8

              getsn 8
                     fepg_com_data_load 24 cnt load mm!

getsn 8

       getsn 8
              pvr_push_vod_test: test path:/mnt/uda1/pvod

getsn 8

       getsn 8

              getsn 8

                     getsn 8

                            getsn 8

                                   getsn 8

                                          getsn 8

                                                 getsn 8

                                                        getsn 8

                                                               getsn 8

                                                                      getsn 8

                                                                             get                                                                                        sn 8

    getsn 8

           getsn 8

                  getsn 8

                         getsn 8

                                getsn 8

                                       getsn 8
                                              fepg_com_fake_update_task start.

getsn 8

       getsn 8

              getsn 8

                     getsn 8

                            getsn 8

                                   getsn 8

                                          getsn 8

                                                 getsn 8

                                                        getsn 8

                                                               getsn 8

                                                                      getsn 8
                                                                             url                    [/SIZE]

Esse sniff fizeste durante a auth?
O ftp e sem duvuda o que eles usam na firmware para update by network. E mais uma box, a eutubox que sao dos mesmos fabricantes.. tambem usa o mesmo ftp.
 

mister jo

GF Bronze
Entrou
Set 24, 2006
Mensagens
19
Gostos Recebidos
0
bom dia, eu não percebo nada de programação , se esta pergunta não se enquadrar neste topico peço já imensa desculpa.
eu ao tentar inserir uma nova firmware aparece atualização de dados muito grande, será que tirando partes da firmware,e assim ser mais pequena, pondo uma firmware so com o essencial, permitiria a box aceita la ? e será que assim depois permitiria de fazer uma atualização da SOLOVOX, via network da box?
muito obrigado
 

Qu4k3

Super-Moderador
Team GForum
Entrou
Abr 9, 2009
Mensagens
166
Gostos Recebidos
88
bom dia, eu não percebo nada de programação , se esta pergunta não se enquadrar neste topico peço já imensa desculpa.
eu ao tentar inserir uma nova firmware aparece atualização de dados muito grande, será que tirando partes da firmware,e assim ser mais pequena, pondo uma firmware so com o essencial, permitiria a box aceita la ? e será que assim depois permitiria de fazer uma atualização da SOLOVOX, via network da box?
muito obrigado

Estas a fugir ao topico, mas a resposta a tua duvida é que para ja isso é impossivel. Ainda nao se conseguiu modificar a firmware. Ja se conseguir sacar o ftp, possivelmente num futuro proximo poderemos aplicalo na firmware anterior.
A estudar....
Cumps
 

flash242424

GF Bronze
Membro Inactivo
Entrou
Dez 10, 2010
Mensagens
39
Gostos Recebidos
0
Esse sniff fizeste durante a auth?
O ftp e sem duvuda o que eles usam na firmware para update by network. E mais uma box, a eutubox que sao dos mesmos fabricantes.. tambem usa o mesmo ftp.

Foi feito pelo Diogovictoriano mas sim durante a autenticação.
Pena os dados estarem um pouco baralhados, comandos da box misturados com comandos do software, nem sei bem onde começam e acabam.
Mas para ja é o que temos que é melhor que nada ;)

Para já sabemos que existem os seguintes comandos:
  • getsn 8
    Serve para obter o numero de serie do chip/box aquele "8" suspeito que seja o tamanho de bits ou algo do género, no servidor de licenças tambem há uma referencia a "chipsn_len": 8

  • burnsn 8 64 32 ¦xH+d¦/o¦¦??/g¦¦¤s=iX¦¦¦/¦PQ¦? *MY¦¦¦¦¦^¦,E¦B¦Kn¦¦m>¦¦¦j¦a¦.¦¦cJo¦¦¦¦¦^@¦¦?¦¦H
    Serve para indicar à box a password a guardar ainda não percebo os parâmetros "8" "64" "32"

  • burnok
    Serve para box confirmar que OTP correu bem

  • url = ftp:// 47.88.101.81/script_new.pak
    Serve para definir endereço do ftp provavelmente

  • user_name = uyw3463610001
    Serve para definir username do ftp provavelmente

  • pwd = 987654321a
    Serve para definir password do ftp provavelmente

  • fepg_com_fake_update_task start.
  • pvr_push_vod_test: test path:/mnt/uda1/pvod
  • fepg_com_data_load 24 cnt load mm!
  • netif:lo is default
  • netif:en is default
    Não faço ideia se é lixo enviado pela porta serie ou se importa
 
Última edição:

Qu4k3

Super-Moderador
Team GForum
Entrou
Abr 9, 2009
Mensagens
166
Gostos Recebidos
88
Foi feito pelo Diogovictoriano mas sim durante a autenticação.
Pena os dados estarem um pouco baralhados, comandos da box misturados com comandos do software, nem sei bem onde começam e acabam.
Mas para ja é o que temos que é melhor que nada ;)

Para já sabemos que existem os seguintes comandos:
  • getsn 8
    Serve para obter o numero de serie do chip/box aquele "8" suspeito que seja o tamanho de bits ou algo do género, no servidor de licenças tambem há uma referencia a "chipsn_len": 8
  • burnsn 8 64 32 ¦xH+d¦/o¦¦??/g¦¦¤s=iX¦¦¦/¦PQ¦? *MY¦¦¦¦¦^¦,E¦B¦Kn¦¦m>¦¦¦j¦a¦.¦¦cJo¦¦¦¦¦^@¦¦?¦¦H
    Serve para indicar à box a password a guardar ainda não percebo os parâmetros "8" "64" "32"
  • burnok
    Serve para box confirmar que OTP correu bem
  • url = ftp://47.88.101.81/script_new.pak[/url]
    Serve para definir endereço do ftp provavelmente
  • user_name = uyw3463610001
    Serve para definir username do ftp provavelmente
  • pwd = 987654321a
    Serve para definir password do ftp provavelmente
  • fepg_com_fake_update_task start.
  • pvr_push_vod_test: test path:/mnt/uda1/pvod
  • fepg_com_data_load 24 cnt load mm!
  • netif:lo is default
  • netif:en is default
    Não faço ideia se é lixo enviado pela porta serie ou se importa

Hoje ao final da tarde devo ter um sniff completo. Depois dou novidades. Entretanto estou a ver o ftp deles.

So nao compreendo a parte de ele ir ao ftp durante a autentificacao. Porque mesmo sem auth o ftp funciona..
 
Última edição:

mister jo

GF Bronze
Entrou
Set 24, 2006
Mensagens
19
Gostos Recebidos
0
ok, muito obrigado pelo informação e pelo o vosso trabalho em tentar solucionar os problemas da v8s
Cumprimentos
 
Status
Não está aberto para novas respostas.
Topo