v8バイトコードの例を使用してGhidra用のプロセッサモジュールを作成する

昨年、私たちのチームはV8バイトコードを分析する必要に直面しました。当時、そのようなコードを復元して便利なナビゲーションを提供できる既製のツールはありませんでした。Ghidraフレームワーク用のプロセッサモジュールを作成することが決定されました。使用される命令記述言語の特性により、読み取り可能な一連の命令だけでなく、Cのような逆コンパイラーも入手しました。この記事では、材料(のシリーズの続きです12 Ghidraのための私達のプラグインについて)。





プロセッサモジュールの作成から記事の作成までに数か月が経過しました。この間、SLEIGH仕様は変更されておらず、説明されているモジュールは、過去6か月間にリリースされたバージョン9.1.2〜9.2.2で動作します。





現在、ghidra.reGhidraに添付されているドキュメントには、言語の機能についてかなり適切な説明があります。これらの資料は、独自のモジュールを作成する前に読む価値があります。フレームワーク開発者の既製のプロセッサモジュールは、特にそれらに記述されているアーキテクチャを知っている場合、優れた例になる可能性があります。





ドキュメントでは、GhidraのプロセッサモジュールがSLEIGH言語で記述されていることを確認できます。これは、SLED(エンコーディングおよびデコーディングの仕様言語)言語に由来し、Ghidra用に意図的に開発されたものです。マシンコードをpコード(Ghidraが逆コンパイルされたコードを構築するために使用する中間言語)に変換します。プロセッサ命令を記述することを目的とした言語として、多くの制限がありますが、Javaコードのpコードインジェクションメカニズムのために停止することができます。





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