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内部ファイル

Source: https://habr.com/ru/post/J144008/


All Articles