複雑な現代を、一撃で、うがーつ!
さあ!大きいことを言うことにしました。…うーんまだ早いかな…?
コンピューターウイルスを、プログラム内部に仕込まれて改変されていた場合、それを発見する方法を考えました。このやり方は、正規ファイルが有ることが前提です。そして、正規ファイルと非正規ファイルの比較から発見します。ここが前提です。
結論を先に書きますと、正規ファイルと、調べたい挿入の疑いがある、非正規ファイルとの比較をして、不一致を検出した直後、正規ファイル側の不一致直後を代入記憶ではなく、ずっと先の、10000文字先まで飛ばして、10000文字先の文字列を、10文字記憶して、非正規ファイルの、不一致直後箇所から検索をかけると、まず、一致する箇所が発生しますよね?このやり方ですと大雑把に、挿入の疑いがある箇所を特定できます。
それを、順序立てて、考え方を説明していきます。結論は最後に書いてあります。
まず、元の正規のファイルは、合ってるのですから、それと非正規ファイルとの比較で、不一致が起きると、非正規ファイルは書き換えられている可能性があります。シロートでも見つけられるかなぁ…?実行ファイルをテキストファイルに拡張子を変えて、テキストエディタで見れば、多分見つけられそうですね。同じファイルかを比較するだけですから。
さて、それなら、それをテキストファイルということにして、不一致があるかを見ましょう。それだけでも、わかります。このやり方だけでも、不一致だと書き換えられていること、そのものが発見できます。
でも、この方法だと、実は改変されている箇所のうち、最初の一つだけしかわからないです。後は、文字化けばかり。たくさんあった場合このやり方ではわからないです。
しかし、プログラムが書けるなら、もうひとつ先へ行けます。
テキストファイルの不一致を検出したら、不一致箇所を、まずは正常なファイル側を不一致ポイント直後から、10文字程度をstr、文字列変数に対して代入して記憶します。それを非正規ファイル側に戻り、不一致箇所から、再びstrと一致が見つかるまで検索します。一致したらその一致箇所と、先程の不一致箇所からの、間に、非正規の挿入されたプログラムコードが入っています。
…ああっ!まだ結論ではないですよ?最後まで読んでくださいね?
でも実行ファイルをテキストファイルに変換して利用とかをしても、JISコードでは、以降、文字化けばっかりですよね?00とか3Aとか、2桁ではなく、32bitですので、2B56 と、四桁利用しますから、JISコードでは、挿入されたコードが奇数個、入っていると、マシン語レベルで、ズレますもんね?ズレたマシン語を文字とすると、テキストファイルだと、以降ずっと文字化けする可能性はありますもんね?なら、ASCIIコードならいけますかねえ?ASCIIコードですと、2Dとか、A7と、2桁ですので、マシン語も、2桁ですから、文字化けしないはずです。いけるかな?それならまた、10文字記憶して、一致箇所まで検索をかければ、間に挿入された非正規コードが見つけられます。一致したら、またそこから不一致検索。この繰り返しで、非正規コードが、全て割り出せそうですよね?うーん、でもこのやり方でも、nullコード文字は空白ばっかりになりますよね…やはりマシン語データを、テキストファイルで起こせないと、難しいですね。・・結論は、まだですよ?
もちろん、マシン語のテキストファイルがおこせるなら、このやり方で、すべての非正規コードを割り出せますよね?…と推測しますが、いかがでしょうか?
…ああ!しまった!しかし、改変されていると、この方法では無理か!非正規コードは挿入だけとは限らない。削除とか、コードの書き換えがされていると、正規ファイルの直後10文字は、非正規ファイル側では、そもそも書き換えられていて、そのコード自体が存在しない可能性があります。だから一致が出ないかもしれないですね。もう少し考えます。…うーん…
100文字一致で、文字列の後ろから検索をかけて、10から20一致していたら、とかですかねえ…迷走してきました。
と、ここで、ああ!そーか!
不一致を検出した直後、正規ファイルの直後を代入記憶ではなく、ずっと先の、10000文字先まで飛ばして、10000文字先の文字列を、10文字記憶して、非正規ファイルの、不一致直後箇所から検索をかけると、まず、大抵の場合、一致する箇所が発生しますよね?いくら途中の文字を書き換えたり、削除したとしても、10000文字先なら一致する箇所はあるでしょう?書き換えにより、同一コードが存在しないとしても、まさか10000文字先を書き換えられているとは考えにくい。多分いけます。そして、先ほどと同じように検索をかけ、一致が出たら、当然、大雑把ですが、その間が改変箇所です。大雑把ですけど、大量に調べるよりは随分いい。
このやり方をすると、10000文字、先で一致するはずが、あいだの削除が多い場合でも、削除されて文字数が減ってるから、2752文字目で一致が起きたり、4万7589文字目で一致が起きたりするケースも対応できるはずです。そしたら、不一致箇所と、その箇所との間の、2752文字や、4万7589文字の中に非正規コードの挿入の疑いがあることになります。あるいは、挿入量が多く、6万2564文字とか、10万5871文字とか多いケースも対応できます。多い場合が多いかな?
10000文字先と書きましたが、2000文字先でも、13000文字先でもいいてす。まあ、10000もあれば、削除や書き換えがあっても、多分出ますよね?
現代のプログラムは、マシン語レベルで数千億、数兆というレベルでしょうから。もっとかな?それを、すべて見るより、大雑把ですが、この箇所とわかる方が遥かにいい。
追記。
正規ファイル。
abcde fghij
klmno pqrst
uvwxy zABCD
EFGHI JKLMN
非正規ファイル。
abcde fghij
klmno pq123
45678 90123
456rs tuvwx
yzABC DEFGH
IJKLM NOPQR
不一致直後ですから、pqrst の文字列の、pqとrstの間に挿入されていますよね?不一致直後ですので、str=”rstuv wxyzA”を代入します。そして、この文字列変数に格納された文字列を、今度は非正規ファイル上での、不一致ポイント直後から、検索をかけます。そーしますと、456rs というあたりの、rs、このあたりで、文字列変数と全く同じ文字列が一致します。
このやりかたですと、かなりいけますが・・挿入とは限らないんですよ。書き換えが起きている可能性があり、それだと、正規側を代入しても最後まで出ないか、似たような箇所までずっと拾わない可能性があるんです。ですので本文のようにします。
非正規ファイル。
abcde fghij
klmno pq123
45678 90123
456jj jjjjj
jjjjj jjFGH
IJKLM NOPQR
このようにですね。不一致ポイント直後のコードが違うものに書き換えられていた場合、不一致ポイント直後の文字列で検索をかけても、最後まで一致文字列は出てこないでしょうね。
0 件のコメント:
コメントを投稿