Sintaxe de endereço e intervalo de endereços - Windows drivers (2022)

  • Artigo
  • 8 minutos para o fim da leitura

Há várias maneiras de especificar endereços no depurador.

Os endereços são normalmente endereços virtuais, exceto quando a documentação indica especificamente outro tipo de endereço. No modo de usuário, o depurador interpreta os endereços virtuais de acordo com o diretório de página do processo atual. No modo kernel, o depurador interpreta os endereços virtuais de acordo com o diretório de página do processo especificado pelo contexto de processo . Você também pode definir diretamente o contexto de endereço do modo de usuário. Para obter mais informações sobre o contexto de endereço do modo de usuário, consulte . Context (definir contexto de endereço User-Mode).

Em expressões MASM, você pode usar o operador POI para desreferenciar qualquer ponteiro. Por exemplo, se o ponteiro no endereço 0x0000008e'ed57b108 apontar para o local de endereço 0x805287637256, os dois comandos a seguir serão equivalentes.

0:000> dd 8052876372560:000> dd poi(000000bb`7ee23108)

Exemplo de endereço de memória de exibição

Para ver um exemplo de como usar POI, determine o deslocamento para o CurrentLocale do bloco de ambiente de thread (TEB). Use o comando DX para exibir @ $teb, que é um exemplo de um pseudo-registrador, que contém endereços comuns, como o local do contador do programa atual.

0:000> dx @$teb@$teb : 0x1483181000 [Type: _TEB *]... [+0x108] CurrentLocale : 0x409 [Type: unsigned long]

CurrentLocale é + 0x108 do início do Teb. Em seguida, determine o endereço de memória desse local.

0:000> ? @$teb + 0x108Evaluate expression: 613867303176 = 0000008e`ed57b108

Use POI para desreferenciar esse endereço para ver que ele contém o valor de CurrentLocale de 0x409.

0:000> ? poi(0000008e`ed57b108)Evaluate expression: 1033 = 00000000`00000409

Nas expressões do depurador C++, os ponteiros se comportam como ponteiros em C++. No entanto, os números são interpretados como inteiros. Se você precisar desformular um número real, talvez seja necessário convertê-lo primeiro, como mostra o exemplo a seguir.

Para testar isso, use . expr para definir o avaliador de expressão como C++.

(Video) How to Install and Configure Cacti on Windows

0:000> .expr /s C++Current expression evaluator: C++ - C++ source expressions

Com o avaliador de expressão definido como C++, podemos fazer a conversão usando Long.

0:000> d *((long*)0x00000014`83181108 ) 00000000`00000409 ???????? ???????? ???????? ????????

Para obter mais informações sobre a conversão de valores numéricos, consulte C++ Numbers and Operators.

Se o avaliador de expressão for definido como c++, podemos encapsular o ponteiro POI com @ @masm (), para ter apenas essa parte da expressão avaliada pelo avaliador de expressão MASM.

0:000> .expr /s c++Current expression evaluator: C++ - C++ source expressions0:000> ? @@masm(poi(00000078`267d7108))Evaluate expression: 1033 = 00000000`00000409

Para obter mais informações sobre os dois avaliadores de expressão, consulte avaliando expressões.

Você também pode indicar um endereço em um aplicativo especificando o nome do arquivo de origem original e o número da linha. Para obter mais informações sobre como especificar essas informações, consulte sintaxe de linha de origem.

Intervalos de endereços

Você pode especificar um intervalo de endereços por um par de endereços ou por um endereço e uma contagem de objetos.

Para especificar um intervalo por um par de endereços, especifique o endereço inicial e o endereço final. Por exemplo, o exemplo a seguir é um intervalo de 8 bytes, começando no endereço 0x00001000.

0x00001000 0x00001007

Para especificar um intervalo de endereços por um endereço e uma contagem de objetos, especifique um argumento de endereço, a letra L (maiúsculas ou minúsculas) e um argumento de valor. O endereço especifica o endereço inicial. O valor especifica o número de objetos a serem examinados ou exibidos. O tamanho do objeto depende do comando. Por exemplo, se o tamanho do objeto for 1 byte, o exemplo a seguir será um intervalo de 8 bytes, começando no endereço 0x00001000.

0x00001000 L8

No entanto, se o tamanho do objeto for uma palavra dupla (32 bits ou 4 bytes), os dois intervalos a seguir fornecerão um intervalo de 8 bytes.

(Video) Psexec.exe: A Powerful tool for IT Admins

0x00001000 0x000010070x00001000 L2

Especificador de intervalo de tamanho L

Há duas outras maneiras de especificar o valor (o especificador de intervalo detamanhoL):

  • L?Tamanho (com um ponto de interrogação) significa o mesmo que otamanhode l, exceto que l?Tamanho remove o limite de intervalo automático do depurador. Normalmente, há um limite de intervalo de 256 MB, porque os intervalos maiores são erros tipográficos. Se você quiser especificar um intervalo maior que 256 MB, deverá usar o L? Sintaxe de tamanho .

  • L-size (com um hífen) especifica um intervalo de tamanho de comprimento que termina no endereço fornecido. Por exemplo, 80 milhões L20 especifica o intervalo de 0X80000000 a 0x8000001F e 80 milhões L-20 especifica o intervalo de 0x7FFFFFE0 até 0x7FFFFFFF.

Alguns comandos que solicitam intervalos de endereços aceitam um único endereço como o argumento. Nessa situação, o comando usa uma contagem de objetos padrão para calcular o tamanho do intervalo. Normalmente, os comandos para os quais o intervalo de endereços é o parâmetro final permitem essa sintaxe. Para obter a sintaxe exata e o tamanho de intervalo padrão para cada comando, consulte os tópicos de referência para cada comando.

Exemplo de intervalo de memória de pesquisa

Primeiro, determinaremos o endereço do ponteiro de instrução RIP registrado usando o avaliador de expressão MASM.

0:000> ? @rip Evaluate expression: 140720561719153 = 00007ffc`0f180771

Em seguida, Pesquisaremos a partir de 00007ffc'0f180771, por 100000 usando o comando s (memória de pesquisa) . Especificamos o intervalo a ser pesquisado usando L100000.

0:000> s -a 00007ffc`0f180771 L100000 "ntdll" 00007ffc`0f1d48fa 6e 74 64 6c 6c 5c 6c 64-72 69 6e 69 74 2e 63 00 ntdll\ldrinit.c.00007ffc`0f1d49c2 6e 74 64 6c 6c 5c 6c 64-72 6d 61 70 2e 63 00 00 ntdll\ldrmap.c..00007ffc`0f1d4ab2 6e 74 64 6c 6c 5c 6c 64-72 72 65 64 69 72 65 63 ntdll\ldrredirec00007ffc`0f1d4ad2 6e 74 64 6c 6c 5c 6c 64-72 73 6e 61 70 2e 63 00 ntdll\ldrsnap.c....

Também podemos especificar o mesmo intervalo como este usando dois endereços de memória.

0:000> s -a 0x00007ffc`0f180771 0x00007ffc`0f280771 "ntdll" 00007ffc`0f1d48fa 6e 74 64 6c 6c 5c 6c 64-72 69 6e 69 74 2e 63 00 ntdll\ldrinit.c.00007ffc`0f1d49c2 6e 74 64 6c 6c 5c 6c 64-72 6d 61 70 2e 63 00 00 ntdll\ldrmap.c..00007ffc`0f1d4ab2 6e 74 64 6c 6c 5c 6c 64-72 72 65 64 69 72 65 63 ntdll\ldrredirec00007ffc`0f1d4ad2 6e 74 64 6c 6c 5c 6c 64-72 73 6e 61 70 2e 63 00 ntdll\ldrsnap.c....

Por fim, podemos Pesquisar para trás no intervalo de memória usando o parâmetro L-Length.

0:000> s -a 00007ffc`0f1d4ad2 L-100000 "ntdll" 00007ffc`0f1d48fa 6e 74 64 6c 6c 5c 6c 64-72 69 6e 69 74 2e 63 00 ntdll\ldrinit.c.00007ffc`0f1d49c2 6e 74 64 6c 6c 5c 6c 64-72 6d 61 70 2e 63 00 00 ntdll\ldrmap.c..00007ffc`0f1d4ab2 6e 74 64 6c 6c 5c 6c 64-72 72 65 64 69 72 65 63 ntdll\ldrredirec

Exemplo de desmontagem de memória

Este exemplo usa o comando u (Unassemble) e o parâmetro L para desmontar três bytes de código.

(Video) Como verificar o endereço ip (endereço de rede) no windows 7 - Interface gráfica

0:000> u 00007ffc`0f1d48fa L3ntdll!`string'+0xa:00007ffc`0f1d48fa 6e outs dx,byte ptr [rsi]00007ffc`0f1d48fb 7464 je ntdll!`string'+0x21 (00007ffc`0f1d4961)00007ffc`0f1d48fd 6c ins byte ptr [rdi],dx

Ou especifique um intervalo de três bytes de memória para desmontar como este.

0:000> u 00007ffc`0f1d48fa 00007ffc`0f1d48fdntdll!`string'+0xa:00007ffc`0f1d48fa 6e outs dx,byte ptr [rsi]00007ffc`0f1d48fb 7464 je ntdll!`string'+0x21 (00007ffc`0f1d4961)00007ffc`0f1d48fd 6c ins byte ptr [rdi],dx

Modos de endereço e suporte de segmento

Em plataformas baseadas em x86, o CDB e o KD dão suporte aos seguintes modos de endereçamento. Esses modos são diferenciados por seus prefixos.

PrefixoNameTipos de endereço
%flatendereços de 32 bits (também seletores de 16 bits que apontam para segmentos de 32 bits) e endereços de 64 bits em sistemas de 64 bits.
&virtual 86Endereços de modo real. somente baseado em x86.
#sem formataçãoEndereços de modo real. somente baseado em x86.

A diferença entre os modos Plain e virtual 86 é que um endereço de 16 bits simples usa o valor de segmento como um seletor e pesquisa o descritor de segmento. Mas um endereço virtual 86 não usa seletores e, em vez disso, mapeia diretamente para os 1 MB inferiores.

Se você acessar a memória por meio de um modo de endereçamento que não seja o modo padrão atual, poderá usar os prefixos de modo de endereço para substituir o modo de endereço atual.

Argumentos de endereço

Os argumentos de endereço especificam o local das variáveis e funções. A tabela a seguir explica a sintaxe e o significado dos vários endereços que você pode usar em CDB e KD.

SyntaxSignificado

deslocamento

O endereço absoluto no espaço de memória virtual, com um tipo que corresponde ao modo de execução atual. Por exemplo, se o modo de execução atual for 16 bits, o deslocamento será de 16 bits. Se o modo de execução for de 32 bits segmentado, o deslocamento será de 32 bits segmentado.

&[[Segment:]] deslocamento

O endereço real. baseado em x86 e x64.

(Video) ✓ Connect Install Canon Printers ir3300 to Computer using WiFi Router on Network | Photocopy Machine

%segmento: [[deslocamento]]

Um endereço de 32 bits ou 64 bits segmentado. baseado em x86 e x64.

%[[deslocamento]]

Um endereço absoluto (32 bits ou 64 bits) no espaço de memória virtual. baseado em x86 e x64.

nome [[ +| )] deslocamento

Um endereço de 32 bits ou 64 bits simples. o nome pode ser qualquer símbolo. offset especifica o deslocamento. Esse deslocamento pode ser qualquer modo de endereço que seu prefixo indica. Nenhum prefixo especifica um endereço de modo padrão. Você pode especificar o deslocamento como um valor positivo (+) ou negativo (−).

Use o comando DG (seletor de exibição) para exibir informações de descritor de segmento.

Consulte Também

Para exibir informações sobre a memória, use o comando ! Address .

Para pesquisar a memória, use o comando s (memória de pesquisa) .

(Video) PDQ Live! : PDQ & A - May 2020

Para exibir o conteúdo da memória, use o comando d, da, DB, DC, DD, DD, DF, DP, DQ, du, DW (memória de vídeo) .

Para obter informações sobre como você pode exibir e editar a memória usando uma janela de memória, consulte usando uma janela de memória.

Videos

1. What happens when you type a URL in the web browser and press Enter? Computer Stuff #18
(Scott Hanselman)
2. Correio Eletrônico + Busca Internet + Redes Sociais
(Prof. Marcel Rios - Informática)
3. Wireshark Tutorial - Aula 0 - Conceitos #Wireshark
(Eduardo Maroñas Monks)
4. Você sabe criar escopos no DHCP do Windows Server?
(Carlos Lauff)
5. Process Hacker: Open-Source tool for Troubleshooting Windows
(TechsavvyProductions)
6. How to write a Windows emulator for Linux from scratch
(Google Developers)

Top Articles

You might also like

Latest Posts

Article information

Author: Ms. Lucile Johns

Last Updated: 01/25/2023

Views: 5564

Rating: 4 / 5 (41 voted)

Reviews: 80% of readers found this page helpful

Author information

Name: Ms. Lucile Johns

Birthday: 1999-11-16

Address: Suite 237 56046 Walsh Coves, West Enid, VT 46557

Phone: +59115435987187

Job: Education Supervisor

Hobby: Genealogy, Stone skipping, Skydiving, Nordic skating, Couponing, Coloring, Gardening

Introduction: My name is Ms. Lucile Johns, I am a successful, friendly, friendly, homely, adventurous, handsome, delightful person who loves writing and wants to share my knowledge and understanding with you.