Fundamentos de Engenharia Reversa
Apoie este trabalho
  • 🙌Apresentação
  • 🥇Introdução
    • 👀Antes de começar
  • 🔢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
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 11 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