2016-09-20 13 views
1

以下のファイルで各ルールを分割する必要があります。 Javaでこれを行うにはどうすればよいですか?ファイル入力をJavaの部分に分割する方法

これは、ファイルの内容をファイルに見られる1として

rule apt_regin_2011_32bit_stage1 { 
meta: 
copyright = "Kaspersky Lab" 
description = "Rule to detect Regin 32 bit stage 1 loaders" 
version = "1.0" 
last_modified = "2014-11-18" 
strings: 
$key1={331015EA261D38A7} 
$key2={9145A98BA37617DE} 
$key3={EF745F23AA67243D} 
$mz="MZ" 
condition: 
($mz at 0) and any of ($key*) and filesize < 300000 
} 


rule apt_regin_rc5key { 
meta: 
copyright = "Kaspersky Lab" 
description = "Rule to detect Regin RC5 decryption keys" 
version = "1.0" 
last_modified = "2014-11-18" 
strings: 
$key1={73 23 1F 43 93 E1 9F 2F 99 0C 17 81 5C FF B4 01} 
$key2={10 19 53 2A 11 ED A3 74 3F C3 72 3F 9D 94 3D 78} 
condition: 
any of ($key*) 
} 



rule apt_regin_vfs { 
meta: 
copyright = "Kaspersky Lab" 
description = "Rule to detect Regin VFSes" 
version = "1.0" 
last_modified = "2014-11-18" 
strings: 
$a1={00 02 00 08 00 08 03 F6 D7 F3 52} 
$a2={00 10 F0 FF F0 FF 11 C7 7F E8 52} 
$a3={00 04 00 10 00 10 03 C2 D3 1C 93} 
$a4={00 04 00 10 C8 00 04 C8 93 06 D8} 
condition: 
($a1 at 0) or ($a2 at 0) or ($a3 at 0) or ($a4 at 0) 
} 


rule apt_regin_dispatcher_disp_dll { 
meta: 
copyright = "Kaspersky Lab" 
description = "Rule to detect Regin disp.dll dispatcher" 
version = "1.0" 
last_modified = "2014-11-18" 
strings: 
$mz="MZ" 
$string1="shit" 
$string2="disp.dll" 
$string3="255.255.255.255" 
$string4="StackWalk64" 
$string5="imagehlp.dll" 
condition: 
($mz at 0) and (all of ($string*)) 
} 

ですが、私は、私はこれを行うことができますどのように任意のアイデアをファイル入力で見つかった4つのルールのそれぞれを分離する必要がありますか? 私と一緒にお待ちください。私は初心者です 事前に感謝!

4つのルールすべてを分離した後、私は各ルールをarraylistに入れる必要があります。例えば

: のArrayList [0]

rule apt_regin_2011_32bit_stage1 { 
meta: 
copyright = "Kaspersky Lab" 
description = "Rule to detect Regin 32 bit stage 1 loaders" 
version = "1.0" 
last_modified = "2014-11-18" 
strings: 
$key1={331015EA261D38A7} 
$key2={9145A98BA37617DE} 
$key3={EF745F23AA67243D} 
$mz="MZ" 
condition: 
($mz at 0) and any of ($key*) and filesize < 300000 
} 

ArrayListの[1]

rule apt_regin_rc5key { 
meta: 
copyright = "Kaspersky Lab" 
description = "Rule to detect Regin RC5 decryption keys" 
version = "1.0" 
last_modified = "2014-11-18" 
strings: 
$key1={73 23 1F 43 93 E1 9F 2F 99 0C 17 81 5C FF B4 01} 
$key2={10 19 53 2A 11 ED A3 74 3F C3 72 3F 9D 94 3D 78} 
condition: 
any of ($key*) 
} 

ArrayListの[2]

rule apt_regin_vfs { 
meta: 
copyright = "Kaspersky Lab" 
description = "Rule to detect Regin VFSes" 
version = "1.0" 
last_modified = "2014-11-18" 
strings: 
$a1={00 02 00 08 00 08 03 F6 D7 F3 52} 
$a2={00 10 F0 FF F0 FF 11 C7 7F E8 52} 
$a3={00 04 00 10 00 10 03 C2 D3 1C 93} 
$a4={00 04 00 10 C8 00 04 C8 93 06 D8} 
condition: 
($a1 at 0) or ($a2 at 0) or ($a3 at 0) or ($a4 at 0) 
} 

など。

どうすればいいですか?念のため

+0

['String.split(" regex ")'](http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java。 lang.String))を検索し、正規表現に関する基本的なチュートリアルを検索します。彼らは非常に強力で便利です。 – qxz

答えて

1

:あなたの問題はあなたの入力でのみ「セグメント」と「ルール」であるならば、そしてちょうど行います

List<List<String>> sections = new ArrayList<>(); 
List<String> currentSection = null; 

try (BufferedReader br = new BufferedReader(new FileReader(file))) { 
    String line; 
    while ((line = br.readLine()) != null) { 
    if(line.startsWith("rule ")) { 
     if (currentSection != null) { 
     // we are finished with the previous section! 
     sections.add(currentSection); 
     } 
     currentSection = new ArrayList<>(); 
     currentSection.add(line); 
    } else { 
     if(! line.trim().isEmpty()) { 
     // any non-empty line goes into the current section 
     currentSection.add(line);   
     } 
    } 
} 
} // end of try/while ... I am too lazy to count my braces ;-) 
if (currentSelection != null) { 
    // make sure to add the final section, too! 
    sections.add(currentSelection); 
} 

しかし、その後:あなたはあなたの本当の程度は非常に正確ではありません要件。あなたの本当の問題は、入力ファイルを「分割する」ことではないと確信しています。

ほとんどの場合、あなたの実際の作業はそのファイルを読み込むことです。そのファイル内のセクションごとに、後で処理するために内容の一部または全部をフェッチする必要があります。

つまり、実際には、この入力をどのように解析/処理するのかを尋ねています。そして、私たちはその質問に答えることはできません。あなたがそのデータを使って何をしたいのかを教えてくれなかったからです。本質的には

、これはあなたのオプションのスペースです:

  1. 、このような固定レイアウトが本当に存在する場合、「解析すると、」その後、メタが来る、最初ルールが来る」を理解することつまるところ、どの〜のように見える... "。意味:データの構造をコードに「ハードコード」します。例:3行目にcopyright = "some value"が含まれていることを正確に「知っている」。次に、正規表現(またはindexOf()、substring()などの単純なStringメソッドを使用して、興味のある情報を抽出します。
  2. ファイル形式が実際に何らかの種類の「標準」(XMl、JSON 、YAML、...)、そのようなファイルを解析するためにサードパーティのライブラリを手に入れてください。あなたの例では...私は言うことができません。これは間違いなく私がよく知っている形式ではありません。
  3. 最悪の場合は、パーサーを書いてください。パーサーの作成は複雑ですが、よく研究されているトピック(hereなど)を参照してください。
+0

こんにちは。あなたの応答を感謝します。私は最終的に必要なケースを編集しました。どのように分割された各ルールをarraylistに追加することができますか? – Shawn

+0

最新の回答をご覧ください。私はあなたにいくつかのアイデアを与えるためにいくつかのコードを書いています。注:このコードはコンパイル/テストされていません。盲目的にそれをコピー/ペーストしないでください。あなたがそれが**想定していることを理解するまで、行ごとにそれを読んでください。それに応じて独自のコードを修正してください! – GhostCat

+0

ファンタスティック!あなたは本当にJavaで良いです。あなたのソリューションをUpvoted – Shawn

関連する問題