AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 78426027
Accepted
IRP_HANDLER
IRP_HANDLER
Asked: 2024-05-04 01:00:53 +0800 CST2024-05-04 01:00:53 +0800 CST 2024-05-04 01:00:53 +0800 CST

Extraindo opcodes das instruções arm64 (ARMv8.5-A)

  • 772

Preciso criar alguns curingas para corresponder a certas instruções.

Por exemplo, em x86, para corresponder à maioria das instruções CALL, o seguinte padrão será suficiente:

E8 ?? ?? ?? ??

onde E8 é o opcode e os 4 bytes seguintes são o endereço relativo para o qual saltar.

Mas os opcodes para arm64, especificamente o conjunto de instruções A64, parecem ser muito mais confusos, tipo, eu tenho estas duas instruções:

0A696938               ldrb       w10, [x8, x9] ; 
EB834039               ldrb       w11, [sp, #0xc0 + var_A0]

Não há nenhuma relação óbvia se você apenas olhar as codificações 0A696938 e EB834039 . Como obtenho o opcode desta instrução ldrb para criar um padrão como o do x86?

Parece que os opcodes não ocupam um byte inteiro como no x86

x86
  • 1 1 respostas
  • 43 Views

1 respostas

  • Voted
  1. Best Answer
    Nate Eldredge
    2024-05-04T01:30:33+08:002024-05-04T01:30:33+08:00

    É isso mesmo, o esquema de codificação de instruções ARM64 é muito mais complicado do que no x86. Na verdade, o opcode nem sempre é encontrado no mesmo byte, nem mesmo no mesmo conjunto de bits, nem mesmo em um conjunto contíguo de bits dentro da palavra de instrução de 32 bits.

    As regras de codificação de instruções são definidas no Capítulo C4 do Manual de referência da arquitetura Armv8-A, e isso lhe dará uma ideia do que você enfrenta quando observa que este capítulo tem 328 páginas. Entretanto, se você está apenas tentando identificar alguma instrução ou classe de instruções específica, pode não ser tão ruim. Existe um agrupamento hierárquico aproximado. Por exemplo, todas as instruções de desvio possuem 101 nos bits 26-28. Se adicionalmente os bits 29-30 forem 00, é um desvio incondicional para um endereço imediato. Se adicionalmente o bit 31 for 1, é um BL. Portanto, o equivalente a procurar o opcode E8 no x86 seria procurar 100101nos bits 26-31 da palavra de instrução.

    Alguns outros grupos são mais difíceis. Por exemplo, todas as cargas e armazenamentos têm 1 no bit 27 e 0 no bit 25, mas o restante do opcode está espalhado pelos bits 10-11, 16-21, 23-24, 26 e 28-31.

    Se você precisar reconhecer instruções de forma mais ampla do que apenas identificar algumas específicas, você pode querer usar uma biblioteca de desmontagem existente, como Capstone .

    • 2

relate perguntas

  • Compreendendo o rendimento da implementação do simd sum x86

  • Não obtendo a saída esperada ao executar um código shell em um buffer overflow

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve