ludufre Posted January 22, 2019 Share Posted January 22, 2019 (edited) [GUIA] Correção de assinatura BIOS Insyde H2O Recentemente comprei um notebook Lenovo L440 pra instalar o macOS Mojave e fui substituir a placa wireless pela DW1560 porque a atual não é compatível. Descobri que existia uma whitelist de placas permitidas que as fabricantes estão adotando recentemente (no meu caso utiliza uma bios Phoenix Insyde BIOS H2O). Procurei em fórums de BIOS MODDING e encontrei pessoas que fizeram o patch pra mim. Só que após substituir a BIOS notei que o computador ficava apitando 5 vezes todas vez que ligava e fui me aprofundar no caso. E foi aí que descobri como resolver isso e por isso criei esse guia baseado nas informações que achei em alguns fóruns russos. Prefácio Quando a BIOS falha no teste te integridade, algumas funcionalidades Intel AMT param de funcionar e é emitido uma sequência de 5 apitos duas vezes no boot. Após modificar para remover whitelist (habilitar placas WI-FI não autorizadas), destravar MSR 0xe2 (hackintosh), habilitar menu avançado, etc. a BIOS não vai passar no teste de integridade causando esse problema. Essa verificação de integridade é feita através da assinatura RSA do bloco da BIOS chamado TCPABIOS (mais informações abaixo) com a chave pública no formato modulus 3 também armazenada na BIOS. Esse bloco TCPABIOS armazena os checksums de cada volume da BIOS. O que faremos é gerar novos checkums para esses volumes que foram modificados, gerar um para de chaves RSA (privada e pública), assinar esse bloco com a chave privada e substituir a chave pública. Ferramentas necessárias - EFITool NE alpha 54: https://github.com/LongSoft/UEFITool/releases - HxD 2.1.0: https://mh-nexus.de/en/hxd/ - OpenSSL: http://gnuwin32.sourceforge.net/packages/openssl.htm (Download -> Binaries) - Microsoft File Checksum Integrity Verifier (FCIV.exe): https://www.microsoft.com/en-us/download/details.aspx?id=11533 Passo a passo Vamos abrir a BIOS modificada, localizar o bloco TCPABIOS e entender sua anatomia. 1. Abra a BIOS no HxD (Vamos utilizar nesse guia a BIOS modificada no fórum MyDigitalLife.com pelo usuário Serg008 para o notebook Lenovo B590) 2. Busque a palavra TCPABIOS: 3. O bloco começa com TCPABIOS e termina com antes de TCPACPUH 4. Anatomia: 54 43 50 41 42 49 4F 53 48 31 38 34 61 31 31 2F 32 36 2F 31 33 49 42 4D 53 45 43 55 52 00 FD 27 34 2A 35 AB 41 26 39 E3 32 E5 B6 8A D6 49 5B 0B 77 F9 82 58 48 00 00 00 CE 18 1F 00 00 00 03 00 00 00 00 00 00 00 27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF 83 04 D4 52 52 95 C5 D7 21 55 78 0E 5C AD 47 EE C4 3D 1D C1 EC 69 03 2B 51 A5 42 61 96 22 F9 7B 88 57 B7 A8 9D D0 20 DB 5B 11 10 55 07 84 6C 62 DF FA 2F 6A A8 43 0C 8A 40 AF 79 0D 31 DB 5A 5D C8 2F EB F8 7C 87 B0 A6 3D 2A 88 AE 91 9D 88 E3 AA 85 E3 5A B3 91 7F 28 68 1F BA 92 C4 7E 10 F5 1A 7E 75 A9 6F CE C0 4F BA FA 79 A5 98 2B 50 60 BA 09 73 7B 03 D1 0C 3E A2 9C 44 DF E9 F2 92 34 7B Cinza: Nome e informações do bloco Vermelho: Informações dos volumes (Checksum e Cabeçalho) Azul: Separação da lista de volumes para a assinatura do bloco Verde: Assinatura do bloco TCPABIOS são os últimos 128 bytes Lista de Volumes: Cada volume tem o formato: 00 FD 27 34 2A 35 AB 41 26 39 E3 32 E5 B6 8A D6 49 5B 0B 77 F9 82 58 48 00 00 00 CE 18 1F 00 00 00 03 00 00 00 00 00 (prefixo 3 bytes + checksum 20 bytes + offset 4 bytes + tamanho do volume 6 bytes + separador do fim 6 bytes) Os volumes são enumerados e utilizam o primeiro byte no prefixo para isso (00 FD 27), começando do 0. A BIOS utilizada nesse exemplo possui somente um volume, mas no caso de mais de um volume, seria: 00 FD 27 .., 01 FD 27 ..., 02 FD 27 ... - Checksum é o cálculo SHA1 do volume. - Offset é a posição do volume dentro da BIOS. Os bytes ficam invertidos, nesse caso seria 00 00 00 48 ou seja: 48h - Tamanho do volume também está com os bytes invertidos, então: 1F18CEh Então é isso. Precisamos corrigir essas informações (checksum, offset e tamanho) 5. Para extrair os volumes abra a BIOS com o UEFITool e veja como identificar os volumes (nosso exemplo há somente um volume, se houvessem outros estariam também dentro de EfiFirmwareFileSystemGuid): Na BIOS original, circulado em vermelho podemos ver o nosso volume. Observe que em azul temos Offset e verde o tamanho. Exatamente como verificamos acima no HxD. Já na BIOS modificada vemos que está diferente o tamanho: Oridinal: 1F18CEh Modificada: 1F12D5h (vamos precisar disso mais tarde) 6. Vamos extrair esse volume escolhendo a opção “Extract as is...” 7. Utilize esse comando para obter o checkum desse volume: fciv.exe -sha1 File_Volume_image_FvMainCompact.ffs Agora temos o checksum que é 396e0dc987219b4369b1b9e010166302ce635202 8. Substitua as informações no bloco TCPABIOS: Observe que o tamanho do volume precisa ter os bytes invertidos, então se o total são 6 bytes e é 1F12D5h, fica D5 12 1F 00 00 00 no lugar de CE 18 1F 00 00 00. Se o offset for diferente, também realizar o mesmo procedimento invertendo os bytes. Checksum alterar de 34 2A 35 AB 41 26 39 E3 32 E5 B6 8A D6 49 5B 0B 77 F9 82 58 para 39 6E 0D C9 87 21 9B 43 69 B1 B9 E0 10 16 63 02 CE 63 52 02 Faça esse procedimento para cada volume na BIOS. 9. Agora precisamos gerar o checksum de todo o bloco TCPABIOS mas sem considerar os últimos 131 bytes, ou seja desconsiderar de FF FF 83 + 80 bytes da assinatura anterior. Copie para um novo arquivo no HxD e salve como tcpabios Utilize o comando para gerar o checksum desse bloco: fciv.exe -sha1 tcpabios Checksum do bloco TCPABIOS: 0da6715509839a376b0a52e81fdf9683a8e70e52 Crie um novo arquivo no HxD e adicione 108 bytes com 00 e cole o checksum no final e salve como tcpabios_sha, ficando assim: 10. Agora vamos gerar a chave privada RSA com modulus 3: openssl genrsa -3 -out my_key.pem 1024 Assinar o arquivo tcpabios_sha: openssl rsautl -inkey my_key.pem -sign -in tcpabios_hash -raw > tcpabios_sign Agora aproveite para gerar a chave publica: openssl rsa -in my_key.pem -outform der -pubout -out my_key_pub.der E gerar modulus 3 da chave pública: openssl rsa -pubin -inform der -in my_key_pub.der -text -noout Copie e cole a chave em um arquivo de texto para utilizar daqui a pouco. Remova todos os “:” e coloque tudo em uma única linha, ficando assim: 11. Abra o arquivo tcpabios_sign no HxD, copie o conteúdo e substitua a assinatura no final do bloco TCPABIOS: 12. Agora vamos localizar na BIOS o local da chave pública e substituir. Essa chave começa com 12 04 e termina com 01 03 FF e fica após o bloco TCPABBLK. A chave fica assim: 12 04 + 81 bytes + 01 03 FF. Faça uma busca por 01 03 FF para localizar mais facilmente. Verifique se antes dos 81 bytes tem os bytes 12 04 para ter certeza que achou. Agora substitua pela chave pública que ficou anotado no arquivo de texto anteriormente, ficando assim: Salve e está pronto. Sua BIOS está assinada e pronta. Edited January 22, 2019 by ludufre 2 Link to comment Share on other sites More sharing options...
Recommended Posts