É possível inicializar um telefone Android a partir de uma unidade USB?


16

Existe alguma maneira de inicializar um telefone Android * a partir de uma unidade USB alimentada por barramento **? Em caso afirmativo, quais são as etapas para conseguir isso?

* Por exemplo, um com funcionalidade USB OTG.

** Por exemplo, uma unidade flash.

Respostas:


22

Esclareça qual é o objetivo pretendido e por quê?

Os telefones Android têm seus próprios gerenciadores de inicialização e não podem ser substituídos por outros meios.

Não é como o BIOS de um PC, onde você pode alternar a ordem de inicialização para inicializar a partir de determinados dispositivos, como Network PXE, USB, HDD principal / secundário.

Editar:

Após os comentários abaixo e em relação à pergunta do OP

Existe alguma maneira de inicializar um telefone Android (por exemplo, um com funcionalidade USB OTG.) Por meio de uma unidade USB alimentada por barramento

O gerenciador de inicialização genérico (* que reside no conjunto de chips) não tem conhecimento de USB etc., pois o lk (Little Kernel) está mais preocupado em capturar pressionamentos de teclas para carregar em cadeia a recuperação ou inicializar diretamente no ambiente Android (Ao pressionar a tecla Vol + Down nesta instância) - no pseudo-código ( isto é do contexto / aspecto do lk, e também, os endereços de memória relativos à leitura das partições são codificados nesse lk, portanto saber como processar a lógica! )

O kernel lk é o padrão de fato da Qualcomm para chipsets MSM (Snapdragon) e adotado por fabricantes como Sony, Motorola, LG, Samsung e pode ser encontrado na fonte AOSP em bootable/bootloader.

se ( A tecla Diminuir volume está pressionada? ), então

  • carregar o kernel em cadeia da /recoverypartição para um endereço específico na memória e pular para ele e iniciar a execução, criando o ambiente de recuperação

outro

  • carregue o kernel em cadeia da /systempartição para um endereço específico na memória e pule para ele e inicie a execução para exibir o ambiente Android.

fim se.

Como o kernel do lk é bastante limitado, considerando que a imagem binária do kernel é gravada no chip e, portanto, não há como modificá-lo . E também deve ser mencionado que lk contém o fastbootprotocolo em preparação para piscando /boot, /recovery, /systeme /datapartições. Existem duas seqüências para inicializar, inicialização primária e inicialização secundária, pois são:

  • Inicialização primária -> lk (dependendo do resultado da lógica)
  • Vá para Inicialização secundária -> /bootou/recovery

Nota lateral: A Samsung gosta do PBL / SBL (que é o carregador de inicialização primário e o carregador de inicialização secundário, respectivamente) em seus jargões quando se trata de modificação. O problema da Samsung é que, em alguns aparelhos, o PBL e o SBL podem ser criptografados (o Samsung Wave GT-S8500 é um exemplo, em que a transferência do Android para ele era quase impossível de fazer por causa do DRM dentro dos gerenciadores de inicialização, que era um pesadelo para lidar com e fez modding-lo extremamente difícil, no entanto, é uma espécie de trabalhar através de um exploit no código FOTA!)

É por isso que não existem recursos extras, como a funcionalidade OTG ou qualquer outra coisa, como comunicações seriais, leitura de SDCard, gráficos etc., pois isso tornaria o kernel lk maior do que o pretendido. Em outras palavras, é o menor tamanho possível de kernel designado para fazer exatamente o pseudo-código acima.

Além disso, uma outra maneira de olhar para ele é isso, e isso depende da versão Android - o USB funcionalidade OTG está totalmente trouxe até dentro do ambiente Android, ou seja, quando o aparece na tela inicial familiares, em seguida, a funcionalidade do OTG está habilitado. Infelizmente não é o caso quando se olha para ele da perspectiva de lk.

Se você estiver curioso, aqui está a entrada da Qualcomm no lk acima, que faz parte da pequena fonte C que possui o assembly ARM incluído e encontrado na fonte AOSP da JellyBean embootable/bootloader/legacy/usbloader/main.c

int boot_linux_from_flash(void)
{
    boot_img_hdr *hdr = (void*) raw_header;
    unsigned n;
    ptentry *p;
    unsigned offset = 0;
    const char *cmdline;

    if((p = flash_find_ptn("boot")) == 0) {
        cprintf("NO BOOT PARTITION\n");
        return -1;
    }

    if(flash_read(p, offset, raw_header, 2048)) {
        cprintf("CANNOT READ BOOT IMAGE HEADER\n");
        return -1;
    }
    offset += 2048;

    if(memcmp(hdr->magic, BOOT_MAGIC, BOOT_MAGIC_SIZE)) {
        cprintf("INVALID BOOT IMAGE HEADER\n");
        return -1;
    }

    n = (hdr->kernel_size + (FLASH_PAGE_SIZE - 1)) & (~(FLASH_PAGE_SIZE - 1));
    if(flash_read(p, offset, (void*) hdr->kernel_addr, n)) {
        cprintf("CANNOT READ KERNEL IMAGE\n");
        return -1;
    }
    offset += n;

    n = (hdr->ramdisk_size + (FLASH_PAGE_SIZE - 1)) & (~(FLASH_PAGE_SIZE - 1));
    if(flash_read(p, offset, (void*) hdr->ramdisk_addr, n)) {
        cprintf("CANNOT READ RAMDISK IMAGE\n");
        return -1;
    }
    offset += n;

    dprintf("\nkernel  @ %x (%d bytes)\n", hdr->kernel_addr, hdr->kernel_size);
    dprintf("ramdisk @ %x (%d bytes)\n\n\n", hdr->ramdisk_addr, hdr->ramdisk_size);

    if(hdr->cmdline[0]) {
        cmdline = (char*) hdr->cmdline;
    } else {
        cmdline = board_cmdline();
        if(cmdline == 0) {
            cmdline = "mem=50M console=null";
        }
    }
    cprintf("cmdline = '%s'\n", cmdline);

    cprintf("\nBooting Linux\n");

    create_atags(ADDR_TAGS, cmdline,
                 hdr->ramdisk_addr, hdr->ramdisk_size);

    boot_linux(hdr->kernel_addr);
    return 0;
}

Questão de galinha / ovo aqui: eu queria uma resposta à minha pergunta, a fim de diminuir os casos de uso com base na viabilidade; você está me pedindo para fornecer casos de uso primeiro :) Então, só posso esclarecer vagamente meus objetivos por enquanto. Pode-se obter sth como criptografia de disco completo inicializando a partir de uma unidade USB criptografada por hardware (Lok-It / dataShur / etc), para que a inserção de uma senha na unidade evite a necessidade de digitar uma senha de descriptografia no dispositivo Android. Idealmente, isso pode ser feito para que, uma vez inicializado o telefone, a unidade possa ser removida, deixando o telefone ainda funcionando bem até a próxima reinicialização.
sampablokuper

Certo ... Interessante - nunca ouvi falar de um caso como esse - de qualquer maneira - por quê? Alimento para o pensamento, onde você digitaria essa senha? O ICS do Android para cima tem a capacidade de criptografar todo o volume IIRC - Você não examinou isso?
t0mm13b

A senha seria inserida usando o teclado incorporado à unidade. (Se você não sabe o que quero dizer com isso, procure as unidades que mencionei.) E sim, examinei a criptografia interna do Android, mas (a) não é sem inconvenientes (veja, por exemplo, segurança. stackexchange.com/q/10529 ; v.gd/6hOcmd ), (b) ele não funciona em todos os telefones, mesmo aqueles que têm ICS ROMs + disponíveis dos fabricantes (por exemplo, alguns modelos Xperia), e (c) há outros casos de uso em potencial para os quais seria possível inicializar um telefone / tablet a partir de um dispositivo de armazenamento em massa USB seria desejável.
sampablokuper

Para ser franco, isso não é possível, para começar, não existe um carregador de inicialização para smartphone que simplesmente, de uma perspectiva de alto nível, "pause" até que uma senha seja digitada! O que você está solicitando está acima e além deste fórum e requer arena de nicho especializada, se não, de gerenciadores de inicialização personalizados para conseguir isso! Para começar, o gerenciador de inicialização genérico, lk (está no AOSP em inicializável / gerenciador de inicialização) é adotado de fato pela Qualcomm para seus chipsets, que são usados ​​por empresas como Sony, LG, Motorola, para citar apenas alguns ... apenas dizendo, a pergunta não é construtiva!
t0mm13b

2
Em suma - há de zero maneira de fazer isso, você parece estar esquecendo que a ênfase em meus comentários em relação ao bootloader eo fato de que os smartphones não têm BIOS é ou .... apenas dizendo.
t0mm13b

6

É possível, em certo sentido, no entanto. Dadas as limitações mencionadas na resposta de @ t0mm13b, faz sentido que o carregador de inicialização mencionado (lk) seja incapaz de fazer isso. Portanto, inicializamos um kernel personalizado a partir de fastboot(para teste), que é inicializado, habilita a funcionalidade OTG e, quando um kernel válido é encontrado no dispositivo OTG conectado, carrega-o em cadeia e transfere o controle para ele. Provavelmente, isso pode até ser integrado a recuperações personalizadas modernas, como TWRP, que têm suporte para OTG e (em alguns casos) MultiROM.

Na verdade, isso foi usado para inicializar o Ubuntu em um tablet Nexus 9, usando o método:

  1. fastboot boot <otg_chainloader_kernel>
  2. <otg_chainloader_kernel> inicializa e ativa o OTG e aguarda a conexão do dispositivo OTG.
  3. O dispositivo está desconectado do PC e da unidade flash USB com a imagem inicializável do Ubuntu conectada a ele via OTG.
  4. <otg_chainloader_kernel> detecta um kernel Linux válido no dispositivo OTG e passa o controle para ele após carregá-lo em cadeia na memória.

Agora, se você quiser, pode inicializar uma imagem compatível da ROM do Android de maneira semelhante, mas lembre-se de que a unidade OTG precisaria ser mantida conectada ao dispositivo até você decidir retornar ao SO nativo (já que todos os aplicativos carregariam de, e todos os dados seriam gravados na unidade flash USB, a menos que toda a ROM do Android pudesse ser configurada como um ramdisk (já ouviu falar do Puppy Linux?), que, dadas as atuais capacidades de memória de dispositivos Android comuns e o tamanho do A própria ROM atualmente é impraticável). Isso impede a cobrança durante a inicialização no sistema operacional OTG também na maioria dos dispositivos com portas de dados / carregador unificadas.

Fonte: subforum XDA-Developers Nexus 9


Poderia ser possível fazer isso para Android para que eu possa iniciar a pré-visualização N sem instalar
Suici Doga

@SuiciDoga, acho que o TWRP MultiROM suporta o OTG Boot? Ele usa a técnica AFAIK acima, apenas sem todos os fastboots. O kexec-hardbootpatch para o kernel usado pelo TWRP MultiROM é basicamente o que OTG-Chainloader-Kerneleu falo.
Tamoghna Chowdhury

Agora isso também depende do dispositivo em que você pode experimentar este exercício. O Nexus 9 e o Nexus Player têm TWRP, mas a coisa do MultiROM não funciona neles (problemas de x64 / ARM64?). IDK sobre o Nexii atual também.
Tamoghna Chowdhury

0

seu posible e eu fiz isso no meu tablet Acer iconia !!!!

conecte uma unidade flash ao seu pc e formate ao fat32 use o rufus para portar o iso / dd à sua unidade flash

conecte-o ao otg e ao seu telefone / tablet .. mantenha pressionada a tecla liga / desliga e toque no volume para baixo, se não inicializar, tente segurar a tecla liga-desliga e toque no volume para cima

depois, usando as teclas de volume, mude para o UDisk (marca da sua unidade flash) ou SATA; UDISK (não precisa ser sua marca USB, pode dizer armazenamento USB) e clique na tecla liga / desliga para confirmar

bem, eu tive um problema grave ao inicializar no menu, então, de alguma forma, consegui evitar o kernel para inicializar e, com isso, interromper o android para inicializar

eu acho que era assim: eu me conectei ao pc e apaguei todos os aspectos do tablet, mas copiei a pasta Android

O kernel foi removido e após a inicialização, conectado novamente ao PC com um hub usb

bem espero ter ajudado :)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.