Aprenda o funcionamento do windows no ring3

Iniciado por blackwinner, 17 de Junho , 2009, 12:52:16 PM

tópico anterior - próximo tópico

0 Membros e 1 Visitante estão vendo este tópico.

blackwinner

Eu postei no meu blog a série que ensinará o funcionamento de todo o sistema operacional windows xp e de quebra, ensinará a programar drivers e rootkits.

O tutorial ainda não está completo e está no blog com o título de: "O Windows e Você!"

Se quiser fazer qualquer alteração no texto ou adicionar qualquer coisa.. é só mandar as atualizações para o email "deadlyconcience57@hotmail.com".

Vou postar a primeira parte aqui e tentar manter atualizado o post.
Nos próximos meses vou me dedicar à ensinar o funcionamento da parte user-mode do sistema operacional antes de voltar a me didacar aos outros tutoriais, por isso só vou atualizar esse post até o final da parte user-mode e por isso o título ficou dessa forma.

Flws.. ai vai a primeira parte:



Eu novamente com mais uma série de tutos, mas dessa vez explorando o windows completamente.
Você vai traçar APIs nativas, aventurar-se no ring 0 e eu prometo.. que se uma tela azul aparecer no seu computador por conta de qualquer erro, no final desse tuto você vai depura-la e saber o que causou esse erro.

Você pra ler esse tuto precisa de conhecimentos intermediário de C e se possível conhecimentos básicos de assembly.
Não tem?
Não leia.
Preguiça de ler?
Não leia pois eu acredito que o tuto todo possa formar mais de 2 ou 3 mil páginas de livro.

Avisos dados então..
Let's rock! =]


\---(BASEADO NO WINDOWS XP)---/



A primeira parte é sempre teórica.. vo mandar braza.. mora?
Então ta supimpa.

Um micro-processador possui básicamente quatro estágios.
O windows se aproveita de dois desses estágios.
O primeiro chamado de ring 0(zero) e o quarto chamado de ring 3.
Ao ring0 damos o nome de kernel-mode.
Ao ring3 damos o nome de user-mode.
O windows é um kernel-sided operational system, ou seja, o seu "código principal" está todo em kernel-mode(ring0).
O kernel do windows é o seu núcleo e ele é o dito "código principal" do sistema operacional.

O que está em user-mode não pode tocar nem ver o que está em kernel mode.
É um conceito bem antigo chamado de sand-box que impede que aplicações usuário danifiquem qualquer componente vital para o funcionamento do sistema. Por isso, se o seu programa der um erro, parar de responder ou qualquer outra coisa.. o sistema operacional será capaz de se recuperar e fechá-lo.

O micro-processador mantém-se alterando de tempo em tempo entre user-mode e kernel-mode.
Hora executa um trexinho de código daqui e hora executa um trecho de código dali.
O windows usa uma interrupção especial que força o processador a entrar no ciclo de kernel-mode.(ela é usada nas APIs por exemplo)

Mas o que são APIs?
Vamos voltar ao mundo real um pouquinho e deixar o ring0 e o ring3 de lado por um instante.

Você tem seu programa codado em C.
O compilador já passou pelos três estágios e gerou seu executável e vamos imaginar que ele só exiba a string "ola mundo!" na tela.
Mas me diga.. como seu programa sabe mostrar na tela as letras que você escreve?
Qual a resolução do seu monitor?
Quais pixels devem ser ascesos?(finjamos que pixels sejam mini-lampadas que ficam na tela do seu pc e que tudo seja tão simples assim)

É ai que entra o sistema operacional.
Ele faz todo o trabalho de se comunicar com o hardware por você.

VOCÊ --> HARDWARE --> WINDOWS -> SEU PROGRAMA


Você não precisa saber qual tipo de monitor está instalado e nem como "ligar" os pixels certos.
Você só diz o que quer escrever e manda o windows fazer o trabalho sujo por você.
Pros oriundos da programação orientada à objetos(POO), isso chama-se encapsulamento.
É a capacidade que um certo componente te dá de trabalhar com ele e com outros meios através dele, sem necessáriamente saber o funcionamento dele ou dos outros meios.

Pra quem já programou na IDE delphi sabe muito bem que você não precisa saber como a TForm aparece la ou aqueles componentes de envio de email.
Você só envia e ele encapsula toda a forma como as smtp requests são geradas e etc.

Mas apartir de agora, o que vai nos interessar, é justamente saber o que acontece por baixo dos panos do windows.

Então, como o printf do seu programa em C chega no hardware de vídeo?
Existem duas metades que se unem para isso acontecer.
O user-mode e o kernel-mode.
Vamos começar entendendo o user-mode.

O windows disponibiliza essas tais APIs.
Elas fazem várias operações e muitas vezes terminam levando as informações que você passa pra elas pra outras APIs que tratam as informações e por final, levam pra uma ultima API nativa da ntdll que chamará por fim a interrupção que fará o processador passar para ring0(kernel-mode).

Existem no entanto, algumas APIs que realizam todas as suas operações em user-mode mesmo.(que não acessam o hardware)
Nós conheceremos algumas delas no decorrer do tuto.

Então, levando em consideração o diagrama anterior, podemos muda-lo mais um pouco para:

VOCÊ <--> HARDWARE <--> WINDOWS <---> APIs <---> SEU PROGRAMA




Bem, eu vou ficar por aqui porque se não o pessoal fica com preguiça de ler..

O windows possui muitas coisas interessantes que poucas pessoas sabem, como um sub-sistema que por exemplo, é feito para permitir a compatibilidade com programas nix like.(interoperabilidade)

Vamos com o tempo conhecer isso tudo e entender porque no meu ponto de vista, o windows ainda é o sistema operacional mais completo existente.

Cya'round. =]
sergaralho.blogspot.com --> a informação como ela deve ser.. pura!

C00L3R

só uma coisa
você--->hardware(STDIN)--->MsDos---->Windows--->win API
este é o caminho todo que o rwindows faz,e se usar o API do windows
seu programa não vai ser portável sou seja só vai rolar no windows programas
assim são mediogres para empresas grandes ou seja você precisar fazer um sistema
com GUI para dois campos da empresa e os dois campos são de PCs com MacOS X,windows e Linux
iai ? ferro ? não não ai que ta portabilidade por isso melhor usar os api de GUI tipo "wxWidgets"
,"GTK","TK","SDL" entre outros pois rodam em qualquer OS como BSD,Linux,Solaris,win...
vide um exemplo de uso do TK

em um windows XP
você--->hardware(STDIN)--->MsDos---->Windows(win32 bla bla)--->TK

em um Linux
você--->hardware(STDIN)--->Linux--->TK

em um MacOs X
você--->hardware(STDIN)--->Darwin-->TK

programador tem obrigação de se preocupar com portabilidade se não é rotulado como
limitado e não prático... caso da maioria de programadores do brasil

blackwinner

Nops, esse não é o caminho todo não.
O windows ainda tem os subsistemas, driver layer.. é muito grande para colocar em um layout só. =/

Mas o intuito do tutorial é ensinar à programar drivers.. não tem como fazer drivers portáteis ainda.
Aprender APIs é só para o caso extremo de você precisar usar alguma função específica do sistema operacional windows.

Você pode fazer programas portaveis mas se um dia precisar usar um recurso único do sistema operacional em que está programando, então vai precisar  saber sobre syscalls, apis e etc.

É importante saber um pouco sobre todos os sistemas operacionais.. mas se especializar em um ou dois.


Se você se prender à só fazer aplicações portaveis, então você se torna limitado também.
Principalmente se sua empresa trabalhar com segurança da informação e suporte técnico à programadores.
Precisa conhecer como funciona a SEH e outras coisas para depurar e explicar pra eles porque aquele tal programa começou à gerar erros de forma aleatória em relatórios ou começou a ficar lento.
sergaralho.blogspot.com --> a informação como ela deve ser.. pura!