NMOS IC Engenharia reversa Recentemente, eu estavaenganado faloupara examinar a matriz de um circuito integrado (IC) - o YM2151, um sintetizador FM de chip único. Eu gosto desses chips antigos da Yamaha, então não me importo de fazer isso, mas é definitivamente um projeto de longo prazo que espero levar meses. No entanto, não é necessário fazer RE uma parte significativa de um IC para entender os fundamentos do RE. Informações sobre a operação de um chip podem ser vislumbradas examinando pequenas unidades e prevendo sua relação umas com as outras. As informações sobre como fazer a engenharia reversa do IC ainda são limitadas, embora projetos como siliconpr0n e tudo o que Ken Shirrif esteja trabalhando a qualquer momento estejam mudando isso. Como estou aprendendo a RE ICs, decidi documentar como decodifiquei uma pequena ROM no YM2151 que suspeito estar sendo usada como parte da máquina de estado de controle. Esta pequena ROM demonstra o básico de CIs REing, incluindo: Separando as várias camadas de uma matriz IC. Mapeamento de entradas e saídas de ROM. Lendo manualmente o conteúdo da ROM. Obtendo uma Imagem de Matriz Antes de podermos examinar uma matriz IC, temos que capturar digitalmente uma imagem da matriz. Não vou discutir isso em detalhes, mas obter uma imagem de matriz normalmente envolve: Removendo o pacote IC com produtos químicos corrosivos, chamados decap. Tirar uma série de fotos usando uma câmera digital com um microscópio. Juntando todas as imagens individuais para produzir um mapa completo da matriz do IC com os transistores individuais visíveis. Eu realmente não tenho acesso ao equipamento para fazer isso mesmo em pequena escala, mas felizmente esse trabalho foi feito anteriormente no caso do YM2151 (ampliação de 20x). Eu me refiro ao artigo de Travis Goodspeed na seção 9 do POC||GTFO #4 ) se estiver interessado em fazer o decap por conta própria. Imagem da matriz YM2151 com ampliação de 20x, matriz completa. A imagem em tamanho real tem 617 MB de origem . O que é NMOS? O YM2151 usa um processo NMOS . A família lógica NMOS usa transistores de efeito de campo (MOSFETs) semicondutores de óxido de metal tipo n para criar portas lógicas digitais. Os MOSFETs são dispositivos de quatro terminais que permitem ou impedem que a corrente flua entre dois dos terminais, chamados dreno e fonte, dependendo da tensão do terceiro terminal, chamado porta, em relação ao dreno ou à fonte. O quarto terminal, chamado corpo, é insignificante por enquanto. Símbolos Esquemáticos MOSFET A imagem abaixo mostra dois tipos diferentes de MOSFETS: depleção do tipo n e modo de aprimoramento do tipo n. Em cada MOSFET, o terminal central conectado à coluna da esquerda é a entrada do portão. A fonte e o dreno são os terminais inferior e superior, respectivamente. Cada MOSFET tem a fonte conectada a um quarto terminal, que por sua vez se conecta a uma seta apontando para dentro da coluna da direita, indicando MOSFETs do tipo n. Simplificando, a direção da seta corresponde à polaridade do dispositivo em uma área específica dentro do MOSFET. A conexão fonte-corpo é um efeito colateral do símbolo MOSFET que usei e podemos ignorá-lo. Uma coluna segmentada à direita representa o modo de aprimoramento e uma coluna sólida à direita representa o modo de esgotamento. Um circuito MOSFET tipo n de modo de depleção e aprimoramento e um circuito equivalente. O MOSFET do modo de depleção atua como um resistor e o MOSFET do modo de aprimoramento como um interruptor. Um raciocínio rápido sobre o símbolo esquemático é dado no parágrafo acima. On é 5V, off 0V. Um MOSFET é um dispositivo simétrico, então dreno e fonte podem ser rotulados arbitrariamente. No entanto, de acordo com Sedra e Smith, o dreno é, por convenção, sempre a uma tensão mais alta que a fonte. "Teoria" rápida de MOSFETs "tipo n" refere-se às propriedades do silício que transporta corrente através de um MOSFET. Para os propósitos desta postagem no blog, não preciso entrar em suas propriedades. Em cálculos manuais, um MOSFET tem pelo menos três modos de operação . Não estou interessado em fazer simulação neste post de blog (talvez no futuro eu faça!), mas para completar, as regiões são: Corte, sem condução do dreno para a fonte. Triodo, região linear, age como um resistor. Saturado, aumentar a tensão do gate não aumenta a corrente. Os MOSFETs de modo de aprimoramento e modo de depleção são usados na família de lógica NMOS. Os MOSFETs de modo de depleção conduzem corrente mesmo quando a porta e a fonte estão na mesma voltagem; a porta deve ter uma tensão menor que a fonte para que ocorra o corte. Eles são comumente, mas não exclusivamente , usados como resistores pull-up, operando na região linear e sempre ligados. Por outro lado, os MOSFETs de modo de aprimoramento são usados para implementar portas lógicas, permitindo ou não a passagem de corrente. Eles operam em corte e saturação. A porta deve estar em uma tensão mais alta que a fonte para conduzir a corrente. A queda de tensão tende a ser insignificante nos MOSFETs de modo de aprimoramento; consulte a lógica proporcional no link anterior para obter mais informações. Com os dois parágrafos acima em mente, aqui está um exercício: Como você implementaria uma porta NMOS NOR (dica: MOSFETs em paralelo)? Porta NAND (dica: MOSFETs em série)? Inversor (NOT) (dica: observe atentamente a imagem do meu MOSFET)? Observe como as portas com inversores são mais fáceis de implementar? Eu me pergunto se essa é uma razão pela qual as entradas e saídas de baixa atividade são tão comuns nesses chips? Estou lidando com NMOS ? Como detectar um chip NMOS? Para ser honesto, fui informado de antemão que o YM2151 usa um processo NMOS. O ano em que este chip foi produzido pela primeira vez (1984-5) também é uma dica. No entanto, quando comparado ao chip CMOS de um chip Yamaha de era semelhante, noto algumas diferenças: Apenas um tamanho de via em um dado CMOS, muitos em NMOS. Nenhuma indicação óbvia de pullup MOSFETs em CMOS, predominante em NMOS. A matriz CMOS é mais bem organizada, em comparação com a NMOS. No momento, a lista acima provavelmente não é tão significativa: P. Discutirei o que quero dizer na próxima seção. Como você pode esperar, meu método de análise só funciona para ICs feitos com um processo NMOS. No entanto, isso ainda é útil para preservar muitos chips antigos onde a emulação completa de seu comportamento é desejada (YM2151) ou mesmo necessária (chips de segurança) para preservar o hardware. Camadas IC Resolvi digitalizar (ou vetorizar) uma ROM no topo do chip, aproximadamente um terço do comprimento longitudinalmente. Trecho do YM2151 que pretendo vetorizar, antes de iniciarmos qualquer trabalho. ICs - bem, não os de ponta - tendem a ser feitos pela aplicação de camadas planas de material condutor e semicondutor. Portanto, tende a ser seguro representar cada camada de material como uma camada 2D em uma imagem vetorial, sem se preocupar com a profundidade da camada ou poços que seriam aparentes em um corte 3D. Cada camada pode, assim, ser inferida e examinando as interseções e os contornos deixados durante o decap. Posso dizer que o acima é uma ROM das tiras de metal de largura igual (lembre-se, o metal tende a ser consistentemente colorido) e os "buracos" circulares distribuídos pelas tiras de metal. Esses "buracos" são propriamente chamados de "vias". Vias são furos perfurados, formando uma conexão com qualquer camada que se cruze em sua localização. Além disso, existem contatos enterrados que conectam diretamente (normalmente? sempre?) as camadas poli e ativas. Uma camada de metal pode ser colocada em cima de um contato enterrado sem criar uma conexão. Os contatos enterrados podem frequentemente ser identificados por um contorno quadrado claro onde o polígono e o ativo se cruzam, mas isso não é garantido. Às vezes, contatos ocultos devem ser inferidos a partir do contexto. A conclusão aqui é: vias e contatos enterrados formam duas camadas lógicas adicionais que precisam ser vetorizadas. Contatos enterrados são diferentes de portas MOSFET b/ca porta MOSFET não é uma conexão direta. Um portão tem uma camada de óxido isolante separando o polissilício e a camada/poços ativos abaixo. No entanto, tende a ser óbvio a partir do contexto e da inspeção visual que tipo de conexão existe, mesmo sem ter uma visão de corte 3D que mostraria as diferenças. Nem todos os ICs têm o mesmo número de camadas ou o mesmo tipo de material de camada, mas no caso do NMOS, é seguro dividir uma matriz de IC em pelo menos três camadas: Metal, material condutor. Normalmente uma tonalidade esbranquiçada que se destaca, no caso do alumínio (que é o que o YM2151 usa). Polissilício, silício puro. Usado para portas MOSFET. A cor não pode ser assumida, mas os contornos são óbvios. Silício dopado ativo usado para dreno e fonte. A cor não pode ser assumida, mas os contornos são óbvios. Vamos digitalizar! Com o exposto acima, vamos digitalizar a camada de metal e as vias da ROM. Observe que em algumas imagens posso perder uma seção :P. Eu o corrijo em uma etapa posterior, a menos que indicado de outra forma. Tabela de Cores da Camada Camada Cor Metal Amarelo polissilício Vermelho Ativo Azul Através da Verde Contato enterrado Rosa A camada de metal é facilmente visível. Aqui, a matriz ROM, as entradas ROM e os trilhos de alimentação e terra são digitalizados. Mostrarei como inferir os três últimos em breve. Aqui, digitalizamos a maioria das vias de interesse. A imagem ficou um pouco cheia depois de digitalizar o metal e as camadas, então por enquanto vou desativá-las. Vamos começar a procurar por transistores. Pessoalmente, gosto de começar com pullups, porque os pullups têm uma forma muito distinta em um dado NMOS, e o trilho de alimentação também pode ser inferido. Como mencionado anteriormente, os pullups NMOS são MOSFETs de modo de depleção e possuem larguras de porta muito grandes para criar um caminho de corrente mesmo sem uma tensão de porta aplicada. Além disso, para fornecer o efeito pullup, existe uma conexão com a camada ativa no lado da fonte do MOSFET que se parece com um gancho. Pullup MOSFETs, portanto, tendem a se parecer com "retângulos com um gancho", com um pouco mais de ênfase no gancho para criar a conexão source-to-gate. Agora podemos vetorizar com segurança os pullups e traços de polissilício imediatos que emanam dos pullups. Vetorizamos nosso primeiro portão MOSFET! Um MOSFET de modo de depleção. Todos os pullups, camada de polisilício, vetorizados. Pelo processo de eliminação, sabemos que os dois lados restantes da ROM são as entradas ou saídas. Em nossos pullups do modo de depleção, a camada ativa que consiste em fonte e dreno passa pelo centro do portão largo. Podemos traçar a camada ativa completamente agora, mas parei deliberadamente. O cruzamento de duas camadas perto dos pullups na parte inferior é significativo. Podemos começar a vetorizar a camada ativa que forma a fonte e o dreno dos pullups. Observe que cada faixa da camada de metal conectada no topo da ROM termina em uma via. A via se conecta a uma camada abaixo, ativa ou poli, que percorre toda a extensão da ROM. Essa camada termina abruptamente após cruzar a camada ativa que se conecta diretamente à origem do pullup. Houve um transistor formado devido a esse cruzamento durante a fabricação! Podemos assumir com segurança que eles são transistores de modo de aprimoramento usados como interruptores devido ao tamanho do portão. Nossa camada desconhecida deve ser poli porque forma a porta de um transistor. Além disso, como o metal na parte superior da ROM se conecta diretamente à porta de um transistor para cada entrada, a parte superior da ROM deve ser nossa entrada. Por processo de eliminação, a saída da nossa ROM está à direita. Nossos primeiros transistores de modo de aprimoramento. Observe como o portão é muito menor para cada um em comparação com o modo de depleção. Agora decidi fazer uma pausa no poli e vetorizar os contatos enterrados. Os contatos enterrados nesta seção são todos visíveis como quadrados em poli e cruzamentos ativos. Como um pullup deve ter um contato enterrado para conectar o gate e a fonte, vamos começar com os pullups. Você consegue encontrar o contorno dos outros contatos ocultos antes de rolar para a segunda imagem? Alguns contatos ocultos devido a conexões pull-up foram digitalizados. Todos os contatos ocultos de interesse nesta seção são visíveis. Restantes contatos de interesse enterrados digitalizados. Agora finalizo a camada ativa, que por processo de eliminação vai ficar com os traços não vetorizados restantes. Estes formam uma série de comutadores MOSFET de modo de aprimoramento distribuídos pela matriz ROM. Em qualquer lugar que o polígono cruze a camada ativa, há um transitor! Camada ativa restante formando a matriz ROM digitalizada. Eu acidentalmente perdi parte da camada ativa na parte inferior da segunda coluna ao tirar essas imagens. Com a camada ativa (menos o meu erro) digitalizada, a ROM foi totalmente vetorizada. Reabilito as camadas de metal e via para mostrar o resultado final. Além disso, vetorizei mais algumas seções em todas as camadas, das quais apenas uma é relevante para a ROM. O traço de metal espesso abaixo da ROM que se conecta à camada ativa da matriz ROM (nos terminais de origem dos MOSFETs de modo de aprimoramento imediatamente conectados aos pullups do modo de depleção) é, na verdade, um traço de terra. Por experiência, posso esperar que as colunas ativas que passam pela matriz ROM sejam conectadas ao terra. Vou explorar o porquê na próxima seção. ROM totalmente vetorizada, além de algumas conexões extras. Captura esquemática Estou rotulando arbitrariamente as linhas de barramento mais à esquerda e mais abaixo como os LSBs da entrada e da saída, respectivamente. Assim, as posições dos bits aumentam à medida que se viaja da esquerda para a direita e de baixo para cima na matriz ROM. Inicialmente, eu tinha imagens intermediárias do meu progresso criando o esquema. Infelizmente, por vários motivos de formatação (números de transistores repetidos, resolução inconsistente), as imagens intermediárias não ficaram como eu gostaria, então as removi. Eu criei o esquema de uma maneira muito semelhante a como eu vetorizei começando com os pullups, adicionando as entradas e suas conexões de switch MOSFET correspondentes. Então eu adicionei as saídas ROM. Em seguida, adicionei os fios restantes que percorrem a matriz ROM coluna a coluna, que se conectam à fonte dos MOSFETs do modo de aprimoramento do switch e dos MOSFETs do modo de depleção pull-up, respectivamente. Concluí a captura esquemática adicionando os transistores de comutação adicionais que existem em qualquer lugar em que a camada ativa cruze o poli dentro da matriz. Para cada trio de fios da coluna, o fio mais à esquerda é a entrada ROM, o fio do meio é a camada ativa que atravessa cada linha da matriz ROM e o fio mais à direita é conectado ao seu pullup correspondente. Esquema completo. Esta ROM 5x10 contém quase 60 transistores! Cometi um erro ao desenhar o esquema acima. Por convenção, a fonte deve estar em uma tensão mais baixa que o dreno, mas para os transistores dentro da matriz ROM, troquei acidentalmente a fonte e o dreno. Em um IC, isso não importa, pois um MOSFET é simétrico e a troca de fonte e dreno não afeta a operação do dispositivo (para nossas intenções e propósitos). No entanto, sem esse aviso, tenho certeza de que confundirei as pessoas. Talvez a distinção dreno e fonte seja melhor ignorada para este esquema. Lendo o conteúdo da ROM Com o esquema acima, podemos vislumbrar algumas informações interessantes sobre o funcionamento da ROM. Presumo que as entradas da ROM sejam sempre 1 ou 0 válidos, porque estou assumindo que essa ROM é acionada pela lógica de controle interno. Se qualquer entrada de barramento for 0, a entrada não ligará os transistores de chaveamento na parte inferior da ROM, colocados imediatamente antes dos pullups. Isso significa que os pullups não são ativamente conduzidos para baixo e o terminal de origem dos pullups permanece em um valor lógico alto. O alto lógico é propagado para todos os transistores cujas portas estão conectadas à fonte pullup; esses transistores estão ligados. Todos os transistores cujas portas estão conectadas à entrada do barramento estão em corte e não têm efeito na operação do circuito. Observe que o metal correspondente a cada bit de saída é anexado a todos os transistores em uma linha em paralelo. Isso significa que, se qualquer um dos transistores em uma determinada linha estiver ligado, toda a linha de metal e, consequentemente, a saída, também será reduzida. Isso também é chamado de AND com fio . De maneira semelhante, se qualquer entrada de barramento for 1, a entrada ligará o transistor de comutação e o nível lógico na fonte pullup será reduzido. Todos os transistores cujas portas estão conectadas ao terminal de fonte pull-up estarão em corte e não abaixarão as tiras de metal. No entanto, como a entrada do barramento é lógica alta, qualquer transistor cuja porta esteja conectada à entrada do barramento acionará sua saída de bit correspondente baixa. Agora temos informações suficientes para criar expressões booleanas e uma tabela verdade para toda a ROM! Bits de saída direcionados para baixo para cada linha de barramento de entrada Linha de Ônibus+Valor Bits de saída direcionados para baixo eu alto O1 , O6 , O7 I Baixo O0 , O5 , O8 , O9 eu alto O0 , O3 , O6 , O7 I Baixo O ,O ,O ,O ,O eu alto O2 , I baixo O ,O ,O ,O ,O ,O ,O ,O eu alto O1 I baixo O ,O ,O ,O ,O eu alto ou I Baixo Ou 0 0 1 1 2 2 3 3 4 4 1 4 _ 5 _ _ 8 9 O5_ _ 0 1 3 4 6 , O2 , O3 , O6 , O7 0 4 5 7 8 _ 8 9 6 0 Equações de linha de barramento de saída Linha de onibus Expressão Booleana Ou ~(~I | I | ~I | ~I | ~I ) O 0 1 de 2 0 1 2 3 ~(I | ~I | ~I | I ) 0 1 ~(I | I ) 2 3 2 3 4 9 Linha de onibus Expressão Booleana O ~(I | ~I | I ) 3 Oh O 1 3 2 3 ~(~I | ~I | I | ~I ) 0 1 2 3 ~(I | I | ~I | I | I ) 6 0 1 2 3 4 ~(I | I | ~I | I ) 7 Oh 2 ~(~I | ~I | ~I ) 4 5 ou O 1 0 2 3 ~(I | ~I | ~I | ~I ) 8 O9_ 1 0 1 2 3 ~(I | ~I | ~I | ~I ) _ 0 1 2 3 Conteúdo ROM extraído da seção analisada. Os sublinhados são para maior clareza. barramento de entrada Barramento de saída 0b0_0000 0b00_0000_0100 0b0_0001 0b00_0000_0100 0b0_0010 0b00_0000_0100 0b0_0011 0b00_0000_0100 0b0_0100 0b00_1100_1000 0b0_0101 0b00_0000_1000 0b0_0110 0b00_0000_0010 0b0_0111 0b00_0000_0000 0b0_1000 0b00_0000_0000 0b0_1001 0b00_0000_0000 0b0_1010 0b00_0000_0000 0b0_1011 0b00_0010_0000 0b0_1100 0b00_0000_0000 0b0_1101 0b00_0000_0000 0b0_1110 0b11_0001_0000 0b0_1111 0b00_0001_0000 0b1_0000 0b00_0000_0100 0b1_0001 0b00_0000_0100 barramento de entrada Barramento de saída 0b1_0010 0b00_0000_0100 0b1_0011 0b00_0000_0100 0b1_0100 0b00_1000_1000 0b1_0101 0b00_0000_1000 0b1_0110 0b00_0000_0010 0b1_0111 0b00_0000_0000 0b1_1000 0b00_0000_0000 0b1_1001 0b00_0000_0000 0b1_1010 0b00_0000_0000 0b1_1011 0b00_0010_0000 0b1_1100 0b00_0000_0000 0b1_1101 0b00_0000_0001 0b1_1110 0b11_0001_0000 0b1_1111 0b00_0001_0000 Como podemos ver, várias entradas resultam em saídas de estado zero, e o MSB altera apenas a saída de duas entradas de ROM, dependendo se está definida ou não. Talvez alguns desses estados sejam ilegais e recebam apenas uma saída padrão? Eu me pergunto para que essa ROM é usada? Quando eu descobrir, farei uma edição nesta página! Direção futura Como os leitores provavelmente já podem ver, digitalizar e refazer CIs antigos é completamente factível, embora tedioso. Pessoalmente, eu diria que é mais mecânico do que inverter um binário com IDA ou radare2, uma vez que você saiba o que procurar. No entanto, como REing um binário, leva muito tempo para REing totalmente um IC. Existem ferramentas para automatizar o processo de captura esquemática de um CI, além de auxiliar na análise. As ferramentas dietéticas de Olivier Galibert são um exemplo que espero discutir em postagens futuras. No momento em que escrevo este post (12 de outubro de 2016), meu trabalho de vetorização e captura esquemática do YM2151 pode ser encontrado aqui . Anedota Em 2011, descobri que o projeto MAME estava desencapsulando ICs para derrotar os circuitos de segurança/proteção em antigas placas de fliperama que os impediam de serem emulados corretamente. O eu em 2011 achava que isso era a coisa mais fascinante, o "último bastião" da emulação precisa e adequada. Nunca pensei que teria o conjunto de habilidades necessário para fazer análise de IC. Mesmo até o verão de 2016, eu disse que não faria engenharia reversa de IC, apesar da preservação da tecnologia antiga ser importante para mim. Achei que estava além da minha compreensão e que não seria capaz de aprender a identificar recursos em um período de tempo razoável. Com a ajuda de outras pessoas, eu estava errado e estou feliz por estar. Se você está em dúvida sobre aprender um novo assunto técnico, não hesite. Somos todos espertos e cheios de dúvidas. Outros estarão dispostos a ajudar! Obrigado Gostaria de agradecer aos membros do siliconpr0n por ler este post, especialmente Olivier Galibert por corrigir alguns erros. Além disso, gostaria de agradecer à Digi-Key por seu programa esquemático Scheme-it extremamente útil , que usei para criar os esquemas (incluindo a bela seta!). Última atualização: 2016-10-12