Uploaded by Marlon Vinicius

NMOS IC Engenharia reversa

advertisement
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
Download