jParser:バイナリ分析は簡単に動作します

jParserを使用すると、javascriptを使用してバイナリファイルからデータ構造を簡単に読み取ることができます。





API

基本構造:





JParserのメソッド:





JParserコンストラクター:









通常のC構造



Cのようなデータ構造を記述できます。 これは、フィールドがデータ名であり、値がタイプであるjavascriptオブジェクトです。



var parser = new jParser(file, { header: { fileId: 'int32', recordIndex: 'int32', hash: ['array', 'uint32', 4], fileName: ['string', 256], } }); parser.parse('header'); // { // fileId: 42, // recordIndex: 6002, // hash: [4237894687, 3491173757, 3626834111, 2631772842], // fileName: ".\\Resources\\Excel\\Items_Weapons.xls" // }
      
      







参照資料



構造には他の構造が含まれる場合があります。 構造の名前を文字列として使用して、その説明を参照します。 次の例は、World of Warcraftのモデルを含むファイル構造の一部です。



 nofs: { count: 'uint32', offset: 'uint32' }, animationBlock: { interpolationType: 'uint16', globalSequenceID: 'int16', timestamps: 'nofs', keyFrame: 'nofs' }, uvAnimation: { translation: 'animationBlock', rotation: 'animationBlock', scaling: 'animationBlock' }
      
      







ヘルパー関数



新しい基本型を定義することは難しくありません。 オブジェクト(次の例ではfloat3 )や配列(例ではfloat4 )など、既存のタイプの構成体を使用できます。 より複雑なタイプを定義したい場合、一次分析のためにthis.parseメソッドに依存する新しい関数を定義する機会が常にあります(次の例のhex32 およびstring0 ):



 float3: { x: 'float32', y: 'float32', z: 'float32' }, float4: ['array', 'float32', 4], hex32: function () { return '0x' + this.parse('uint32').toString(16); }, string0: function (length) { return this.parse(['string', length]).replace(/\0+$/g, ''); }
      
      







フィードバック



配列のサイズが事前にわからない場合は、整数を返す関数を構造体内のその場所に配置できます。 この関数では、 this.currentを使用して、現在分析中のオブジェクトにアクセスし、すでに受信したフィールドを読み取ることができます。



 image: { width: 'uint8', height: 'uint8', pixels: [ 'array', ['array', 'rgba', function () { return this.current.width; }], function () { return this.current.height; } ] }
      
      







高度なデータ分析



jParserの優れた機能は、複雑な処理アルゴリズムをデータ構造記述内の関数で表現できることです。 これにより、構造記述をそのハンドラーのコードから分離することなく、複雑なファイルを分析できます。



 entryHeader: { start: 'int32', count: 'int32' }, entry: function (type) { var that = this; var header = this.parse('entryHeader'); var res = []; this.seek(header.start, function () { for (var i = 0; i < header.count; ++i) { res.push(that.parse(type)); } }); return res; }, name: { language: 'int32', text: ['string', 256] }, file: { names: ['entry', 'name'] }
      
      







はじめに



NodeJSエンジン上



npmを使用してjParserをインストールするだけで準備完了です:-)



 npm install jParser
      
      





 var fs = require('fs'); var jParser = require('jParser'); fs.readFile('file.bin', function (err, data) { var parser = new jParser(data, { magic: ['array', 'uint8', 4] }); console.log(parser.parse('magic')); });
      
      







ブラウザで



jQueryパッチ適用し 、バイナリファイルが最適なバイナリ形式でダウンロードされるようにしました。 このパッチを適用したjQueryコードとjDataViewおよびjParserを接続します-これで準備完了です:-)



 <script src="https://raw.github.com/vjeux/jDataView/master/jquery/jquery-1.7.1-binary-ajax.js"></script> <script src="https://raw.github.com/vjeux/jDataView/master/src/jdataview.js"></script> <script src="https://raw.github.com/vjeux/jParser/master/src/jparser.js"></script> <script> $.get('file.bin', function (data) { var parser = new jParser(data, { magic: ['array', 'uint8', 4] }); console.log(parser.parse('magic')); }, 'dataview'); </script>
      
      







注意事項



このツールは、ドキュメント化されていないJavaScript機能に依存しています。オブジェクトのフィールドの走査は、指定された順序で機能します。 ChromeとOperaでは、この暗黙のルールはデジタル名を持つフィールドでは機能しないことに注意してください。



既存のすべてのJavaScript実装で動作するには、このライブラリの次の2つのルールに従います。







デモ



ICO分析 。 これは、NodeJSエンジンを使用したバイナリ分析の簡単な例です。 バイナリデータの解析時に発生する典型的なタスクの数を示します。





アンパックタール これは、ブラウザ内でバイナリファイルを解析する簡単な例です。





ワールドオブウォークラフトモデルシャワー jParserを使用して3次元モデルのバイナリコードを読み取り、次にWebGLで表示します。





[スクリーンショット]



Diablo 3内部ファイル






All Articles