Fundamentos de Engenharia Reversa
Apoie este trabalho
  • 🙌Apresentação
  • 👀Antes de Começar
  • 🥇Introdução
  • 🔢Números
    • Sistemas de Numeração
    • O Byte
    • Números Negativos
    • Cálculos com Binários
  • 🧵Cadeias de Texto
    • ASCII
    • Unicode
    • C Strings
  • 🗂️Arquivos
    • Formatos
  • 💼O formato PE
    • Cabeçalhos
      • MS-DOS
      • COFF
      • Opcional
      • Diretórios de Dados
      • Cabeçalhos das Seções
    • Seções
    • Import Table
    • Endereçamento
  • 🚗Execução de Programas
    • Executáveis
    • Bibliotecas
    • Processos
  • 🖼️Windows API
    • Caixas de Mensagens
    • Manipulação de Arquivos
    • Acesso ao Registro
  • ⚙️Assembly
    • Registradores
    • Instruções Básicas
    • Funções e Pilha
  • 🐞Depuração
    • O Debugger
    • Disassembly
    • Breakpoints
    • Manipulação do Fluxo
    • Patches
  • Apêndices
    • Tabela ASCII
    • Tabela ISO-8859-1/Latin-1
    • Exemplos de Código em Assembly
    • Funções da API do Windows
    • Ferramentas
    • Referências
  • Sobre o livro
    • 📝Registro de alterações
Powered by GitBook
On this page
  • Um "Hello, World" Conceituado
  • Lendo o Retorno da Função

Was this helpful?

Edit on GitHub
Export as PDF
  1. Windows API

Caixas de Mensagens

PreviousWindows APINextManipulação de Arquivos

Last updated 4 days ago

Was this helpful?

Um "Hello, World" Conceituado

Vamos programar um pouco. Neste momento é importante, se ainda não o fez, que você instale o Visual Studio Community.

Abra o Visual Studio e crie um novo projeto do tipo Console App, conforme a imagem abaixo mostra:

Nomeie o projeto como "Mensagem" (sem aspas) e após criá-lo, substitua o conteúdo do arquivo Mensagens.cpp que o Visual Studio criará automaticamente por este:

#include <Windows.h>

int main() {
	MessageBox(nullptr,
		L"Estou estudando a Windows API\n\nGostei disso! :)",
		L"Mente Binária",
		MB_OK | MB_ICONINFORMATION);
}

Tecle F5 para rodar o programa e você deve ver uma janela como esta:

Há vários conceitos neste código. Vamos dedicar um tempo a eles. Acompanhe:

  • Na linha 1, como o Windows utiliza sistemas de arquivos que não são sensíveis ao caso, ou seja, não diferenciam letras maiúsculas de minúsculas, tanto faz escrever Windows.h, windows.h, WINDOWS.H ou mesmo WiNdOwS.H. Vai funcionar.

  • Na linha 4 chamei a função MessageBox, mas ela na verdade não existe: é uma macro que será substituída pelo pré-processador pelas funções MessageBoxW (mais comum) ou MessageBoxA (caso a macro UNICODE não esteja definida).

  • Ainda na linha 4 introduzi um conceito novo, de nullptr ao invés de NULL, aproveitando que o compilador utilizado é de C++. Acho melhor de digitar.

  • Nas linhas 5 e 6 (sim, não há o menor problema em colocar os outros parâmetros da função em outras linhas para facilitar a leitura) eu passo para a função o texto e o título, respectivamente. Impossível não notar o L colado com as aspas duplas que abrem uma string em C não é mesmo? Ele serve para transformar a string subsequente em uma wide string (Unicode), que já estudamos. Este L é necessário porque a função MessageBox vai expandir, por padrão, para a MessageBoxW (perceba o W no final) que é a versão da MessageBox que trabalha com strings Unicode. Também usamos o caractere de nova linha duas vezes para dividir a mensagem em três linhas, sendo a segunda uma linha vazia.

  • Na linha 7 eu utilizo uma combinação de duas flags: MB_OK e MB_ICONINFORMATION. Esta última configura este ícone de um "i" numa bolinha azul.

Lendo o Retorno da Função

Agora vamos criar um programa um pouco maior afim de estudar mais conceitos da API do Windows. Compila aí:

#include <Windows.h>

int main() {
	LPCWSTR titulo = L"Mente Binária";
	
	int ret = MessageBox(nullptr,
		L"Você já se registrou em https://menteb.in?",
		titulo,
		MB_YESNO | MB_ICONQUESTION);

	if (ret == IDYES) {
		MessageBox(nullptr, L"Aê! Isso é ser inteligente!", titulo, MB_OK);
	} else if (ret == IDNO) {
		MessageBox(nullptr, L"Tá esperando o que então? Vai lá!", titulo, MB_OK); 
	}
}

Vamos analisar os conceitos novos aqui, como fizemos com o programa anterior:

  • Na linha 5 declaro uma variável do tipo LPCWSTR. A diferença de LPCSTR, que já estudamos, é este "W", de wide, para definir uma string Unicode.

  • A linha 7 declara uma variável ret do tipo int e já a inicializa com o retorno da chamada à MessageBox.

  • Nas linhas 12 e 15 comparo o conteúdo da variável res, que detém o retorno da chamada à MessageBox. Se for igual a IDYES, novamente uma macro, mostra uma determinada mensagem. Se for igual a IDNO, mostra outra.

Em relação às strings, há três maneiras de se programar com a Windows API: ASCII (CHAR), UNICODE (WCHAR) ou em compatibilidade (TCHAR), que expandirá para CHAR ou WCHAR, caso a macro UNICODE esteja definida. Atualmente, é recomendado utilizar WCHAR e textos L"assim".

A tabela abaixo ajuda na compreensão:

Tipo
Expansão

LPSTR

char*

LPCSTR

const char*

LPWSTR

wchar_t*

LPCWSTR

const wchar_t*

LPTSTR

char or wchar_t dependendo da UNICODE

LPCTSTR

const char or const wchar_t dependendo da UNICODE

Vamos fazer algo um pouco mais significativo agora. Vamos pedir ao kernel do Windows que crie um arquivo para nós.

🖼️
Tela de criação de projeto do Visual Studio Community 2019