Criação de um módulo de processador para Ghidra usando o exemplo de bytecode v8

No ano passado, nossa equipe enfrentou a necessidade de analisar o bytecode V8. Naquela época, não havia ferramentas prontas que pudessem restaurar esse código e fornecer uma navegação conveniente por ele. Decidiu-se tentar escrever um módulo de processador para o framework Ghidra. Devido às peculiaridades da linguagem de descrição de instruções usada, obtivemos não apenas um conjunto legível de instruções, mas também um descompilador tipo C. Este artigo é uma continuação de uma série de materiais ( 1 , 2 ) sobre nosso plugin para Ghidra.





Vários meses se passaram entre a redação do módulo do processador e o artigo. Durante esse tempo, a especificação SLEIGH não mudou, e o módulo descrito funciona nas versões 9.1.2–9.2.2, que foram lançadas nos últimos seis meses.





Agora, em ghidra.re e na documentação anexada ao Ghidra, há uma descrição razoavelmente boa dos recursos da linguagem - vale a pena ler esses materiais antes de escrever seus próprios módulos. Os módulos de processador prontos dos desenvolvedores de framework podem ser excelentes exemplos, especialmente se você conhece a arquitetura descrita neles.





Na documentação, você pode ler que os módulos do processador para Ghidra são escritos na linguagem SLEIGH, que se originou da linguagem SLED (Specification Language for Encoding and Decoding) e foi desenvolvido propositadamente para Ghidra. Ele traduz código de máquina para código p (uma linguagem intermediária usada por Ghidra para construir código descompilado). Como uma linguagem destinada a descrever instruções do processador, ela possui várias limitações, que, no entanto, podem ser interrompidas devido ao mecanismo de injeção de p-code no código java.





github. , SLEIGH . , p-code, . The Ghidra Book: The Definitive Guide.





Eclipse, , Ghidra: GhidraDev GhidraSleighEditor. Ghidra Module Project v8_bytecode. , .





, , The Ghidra Book: The Definitive Guide. .





  • *.spec — .





  • *.ldefs — . . *.sla, .





  • *.pspec — .





  • *.opinion — ; , opinion : .





  • *.slaspec, *.sinc — , SLEIGH.





.sla, slaspec-.





, , , , . . .





V8

Jsc-, , c JavaScript Node.Js 8.16.0 bytenode ( Node.Js, npm). , bytenode Node.js . , jsc js:





Node.js , . , ( bytecode-register.cc, bytecode-register.h). v8 Node.js:





, aX , . .





 — <this>, aX — , , rN — , . 1- , 2- Wide- 4- ExtraWide-. Wide- :





Node.js v8 .





, SLEIGH , . , 124  rN 125  aX. , . :





, Node.js - . (X aX) . , , .





, , .





CSPEC                                                  

, cspec-, github. :





Ghidra .  — , , . Ghidra SLEIGH , Intel x86, . , , . , , .





, :





  • Compiler Specific P-code Interpretation;





  • Compiler Datatype Organization ( <data_organization>);





  • Compiler Scoping and Memory Access ( <global>);





  • Compiler Special Purpose Registers ( <stackpointer>);





  • Parameter Passing ( <default_proto>).





, , .





<data_organization> <stackpointer> ; <prototype> <default_proto>, . : <input>



, <output>



, <unaffected>



.





, aX. . , register. . , , , , . (space="register"



) <input>



, , 0x14000 (0x14000 , , *.slaspec aX).





(acc), <output>



. , , . <unaffected>



, , , .





, <global>



register 0x2000.





LDEFS

 — .ldefs. : ( le), (*.sla, *.pspec,*.cspec), id , Ghidra. - , Node.js, , <language>, *.ldefs , Ghidra.





, , .





PSPEC

( .pspec). processor_spec.rxg ( Ghidra ). - . , .





, ( <processor_spec> ).





SLASPEC

SLEIGH .slaspec.





. , , .





, ( register ram), define space,  — define register. offset , , . size. , *.cspec , .





(https://ghidra.re/courses/languages/html/sleigh_constructors.html) , ,  — . SLEIGH , , , « ». 5 .





  1. Table Header ( )





  2. Display Section ( )





  3. Bit Pattern Sections ( )





  4. Disassembly Actions Section ( )





  5. Semantics Actions Section ( )





, .





  1. Table Header , , ( ).





  2. Display Section — , Ghidra.





  3. Bit Pattern Section — - , «» c ( ).





  4. Disassembly Actions Section - , .





  5. Semantics Actions Section , , .





( instruction), , .





, , . , , . . , ( ), .





, :





  • ^ — / , ;





  • “” — , , ;





  • , ;





  • ( - , ,  #, ).





. , . , . . , :





tokenMaxSize  8. , - . , , , . : start- endBitNumX 0 tokenMaxSize-1 startBitNumX <= endBitNumX.





v8 , . , , «&» «|».





: , , , «» , .





, . , . v8, ( Wide- ExtraWide- , , ). :





, op , Illegal Nop, :





«0xa7» Ghidra Illegal, . unimpl. , , . Nop , , . Nop Node.js , SwitchOnSmiNoFeedback,





: LdaSmi, (acc ), AddSmi, c .





bytecodes.h Node.js, operand, . , (. AddSmi).





- LdaSmi [-02]. , , disassembly action ( , ).





AddSmi , op, , «;» operand. . , . , , (, , ).





«;» , , , ( ), .





PCode « » Ghidra. - , p-code.





v8 , lda, . acc . , acc, , .





return, , , :





, , . Mul, , .





« » , , , «» . kReg 8 . attach variables 0b 11111111b ( kReg) . , , , 0xfb (11111011b), kReg r0.





, kReg , :





interpreter-generator.cc Node.js. kReg , Table Header src.  — export. p-code, export , «» src. Ghidra .





, :





goto

. SLEIGH goto. , kUImm, . disassembly action rel. inst_start SLEIGH .





SLEIGH . , ( ), , ( , p-code ), .





«» dest. *[ram]:4 rel , 4  rel. rel ram. «*» SLEIGH , ( Dynamic References).





[ram] ( ), . p-code, ram.





JumpIfFalse - . SLEIGH goto. js False , , pspec , , . , .





inst_start . TestGreaterThan, goto (<true> ) inst_next. : , , . .





goto inst_next . , «s>», . .





. .





, (. ), . v8, . , 4  CallProperty2 , . :CallProperty2 kReg, kReg, kReg, kReg, [kIdx] Sleigh . - :





, , . , callable, receiver, arg1 arg2 - attach :





kReg .  — .





CallProperty2 , call [callable];, . v8 aX ( cspec). , , (, , sinc-, x86). , . Ghidra, . , - , . :





( : sp , ) CallUndefinedReceiver1:





, , java-. , , , SLEIGH. p-code .





, , . , acc , , . , , ( CallVariadicCallOther « » ). define pcodeop OperationName , .





p-code- : callotherfixup



cspec- .





java- , :





. bytenode jsc- js:





jsc- Ghidra. - , Ghidra , eclipse , . : sleigh .





, . .





, . 010.  D  F, . :





( SLEIGH), . , ( SLEIGH cpool) LdaGlobal. ( ):





, , JavaScript, , .slaspec ( .sinc). , p-code, , p-code. p-code .





v8 , / . . , , .





, , : ForInPrepare r9, r10!3. , , , , , .





,

. . , ARM: ( , - ).





, . , . . , , , , .





, CallProperty , «» , , . , : rangeSrc rangeDst. rangeSrc — , , rangeDst «» . rangeDst , : aX rX .





. «=», , disassembly action. - . , , , aX, rX, . : , , , .





. . , (contextreg ).





, , ( ), . counter offStart , .





, .





, , , - disassembly action. rangeSrc, , disassembly action offStart,  — counter. «{».





, v8 range_size: , . rangeSrc .





  rangeDst 5  .





  • a0 counter 0 ( ).





  • r0 counter 0 ( ).





  • offStart a0, disassembly action counter , offStart , rangedst1.





  • offStart r0, disassembly action counter offStart , rangedst1.





  • , rangedst1( , , , ).





. rangeDstN, N — , , aN/rN.





. rangeSrc , , rangeDst - , . epsilon, .





rangeDst, rangeDst1, rangeDst2, . , github. , rangeDst rangeDstX, ,  — , .





, . «&» «|».





CallProperty :





:





, , CallVariadicCallOther. github java- p-code. p-code call ( Node.js, ,  — ). slaspec, , , :





, :





rangeDst ( r7 ) , console.log(1,2,3,4,5,6). bytenode . 0x167,  — 0x18b.





, , , , - ( , , , ).





, rangeDst , ( , 2 4 ):





, : , . , , . , , , . , , . , SLEIGH.





Node.js , , .





:





:





  1. https://ghidra.re/courses/languages/html/sleigh.html — SLEIGH.





  2. https://github.com/NationalSecurityAgency/ghidra/tree/master/Ghidra/Framework/SoftwareModeling/data/languages — *.cspec, *.pspec, *.opinion, *.ldefs.





  3. https://spinsel.dev/2020/06/17/ghidra-brainfuck-processor-1.html — brainfuck Ghidra.





  4. https://github.com/PositiveTechnologies/ghidra_nodejs — Ghidra .








All Articles