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
É 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
100101
nos 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 .