遠隔操作ウイルス開発者のプロファイリング

世の中を騒がせてますね。素人が専門家にぼろ負けしてるという印象です。問題は素人が権力を持っていること?

ウイルス自体が手に入ると良いのですが、どこにもないので、警視庁のページを見てみました(PDFのコピー禁止設定とか、情報提供する気あるのかって思う……)。

資料まとめ

iesys.exeに対するコマンド

これによると、まずiesys.exeに対するコマンドは下記であるとされています。

  • ファイルのアップロード、ダウンロードなどに関する命令
    cd, del, dl, dltext, send
  • キーロガー、画面キャプチャなどに関する命令
    framecnt, kloff, klon, scrcap, scrcap_auto, scrcap_auto_stop
  • 掲示板の設定、アクセスに関する命令
    newuser, updatesv, bm, nm
  • iesys.exe自身の動作などに関する命令
    restart, exit, wait, fsuspend, force_, run, stat, suica, update, ver
  • ブラウザ機能に対する命令
    wbback, wbcap, wbclick, wbdef, wbget, wbpost, wbset, wbset_p, wbsubmit, wbtryselect

iesys.exeのクラス名・関数名

次に、クラス名・関数名です。

  • Form1
    fetchMyThreadId, makeNewUser, parseInstructions, waitTimer_Tick, runIns, startBurstMode, endBurstMode, selectDOM_point, selectDOM, _getElementById, _getAllElems, _getElementsByTagName, ins_end, ins_end_force, wb_DocumentCompleted, hbTimer_Tick, checkInsTimer_Tick, timerNewUsr_Tick, kakikoMyThread, kakikoMyThread_noEnc, fetchNewIns, kakikoMyThread_retrymode, kakikoRetryTimer_Tick, connection_emergence, decodeEscaped, uploadBitmap, snapTimer_Tick, startAutoSnapMode, endAutoSnapMode
  • Common
    GetUnixTime, getMyDir, setAutorun, rmAutorun, SaveSjisTextFile, exitAndDel, exitAndDel_p, exitAndUpdate, exitAndUpdate_web, getDefBrowser, targetSanitize
  • Common_Crpt
    EncryptString, DecryptString, GenerateKeyFromPassword, uidToPwd, uidToEndMark_S, uidToEndMark_E, uidToInterceptMark_S, uidToInterceptMark_E, encByUid, cutEncodedStr, decByUid, decByUid_partial, eraseIntercept, addKaigyo, removeKaigyo
  • Common_TCP
    asyGetRequest, getRequest, asyDoUrl, doUrl, sendFileMethodPost, asySendStreamMethodPost, sendStreamMethodPost, makeShitarabaThread, kakikoShitaraba, getShitarabaThreadListStr, getShitarabaThreadList, getShitarabaThreadDat, binDownload
  • Fileman
    runCmd, getCDName, getCDList, getFile
  • Operec
    isLogging, startLogging, stopLogging, getRawLog, getLog, clearLog, globalKeydown, globalMousedown, convLogToStr

感想

容疑者が誰かは置いておいて、これを日本人が作ったとすると、それなりにスキルは高そうという印象です。

  • 英単語の語彙が下位技術者のレベルではない。
    fetch, parse, instructions, burst, force, snap, generate, encrypt/decrypt, intercept, exit, partial
    hbTimer = hibernationTimer?
    sanitize (無毒化)などはそもそも高度な概念と思うけど、最近は違うのかな。
  • 英単語の微妙な使い方が正しい。
    instruction*s*, start*Logging*, get*Log*, Auto*r*un
  • 短縮語は大文字にするという几帳面な命名
    DOM, TCP, CD
  • 英単語の対応関係が明確
    start/end, set/rm, add/remove, start/stop
  • 固有名詞の扱いが妥当
    kakiko, shitaraba

ひとつふたつならともかく、この程度のきめの細かさでコーディングできるプログラマは少数だと思います。「俺は出来る」という自称プログラマなども、パターンなどうわべの知識だけで実際のコーディングは微妙ということが多いのに、なかなかのセンスに見えます。

技術的にもみるものがあります。

  • thread と asy がある。
    スレッドは有名な並列処理の方法ですが、最近は非同期呼び出し (asynchronous call) が主流です。上記を見ると、命名からスレッド処理なのか非同期処理なのか判別できますし、それらを使い分けていることも分かります。非同期については識別子の先頭にasyを付けるという開発者の固有ルールがあるのでしょう。優秀なプログラマには当たり前の特徴です。
    (追記)はっと気がつきましたが、thread は掲示板スレッドの意ですね。”My”が気になっていましたが、そりゃそうだ。よくよく考えられた名前だと思います。
  • Java言語も使える可能性が高い。
    C#もそうですが、Microsoft 系の言語の一般的な命名規則ではメソッドは大文字で始まります。一方、Javaは小文字です。上記はほとんどが小文字開始ですから、元々Java出身の技術者である可能性があります。もしくは私のように、privateな要素については小文字(もしくは大文字/小文字を気にしない)というルールかもしれません。その場合はより繊細なコーディングをしていることになります。
    略語がすべて大文字なのもJavaの流儀です。C#では、略語であっても二文字目以降を小文字にします(例外は名前空間)。
  • 記事やネットでは「いまどき通信でどうこうするプログラムは難しくない」という論調ですが、C#のような汎用記述言語で一からコーディングするにはかなりのスキルが必要です。また、実際に動くのは未知の環境下ですから「手元で動けばOK」という認識は通用しません。また、10分間隔できちんと動作することの確認など、実際問題としての課題はそれなりにあります。
  • 暗号化などもコピペのようで、巷では「そんなに難しくない」という評価のようですが、普通のプログラマであればまず「暗号化しよう」という発想に至りません。たとえコピペだろうとも、スクラッチプログラムでそれが実装され、期待通りに動作するというのはそれなりにすごいことです。

これらを総合すると、下記のような推論ができます。

  • まず除外できるのが、素人がほとんどのコードをコピペで作成したケース。新種ウイルスとして登録されていますし、全体コピーはないでしょう。開発者はスクリプトキディのような素人ではありません。
  • また、断片を寄せ集めて統合したケースも可能性は低いです。経験的に、コードスニペットを寄せ集めるタイプのエンジニアは「動けばよし」です。未知の環境で動作するネットワーク越しのアプリとして完成度を高める能力はありません。また、内部を理解しないのでリファクタリングすることができないため、コードに統一感がありません。今回のは、完璧に整ったとは言えないものの、寄せ集めという感じはあまりしません。
  • したがって、特別な記述が必要な暗号部分などを除いて、基礎部分は独自に開発されたとみて良いのではないかと思います。(暗号部分などは難しい割に使い回しが難しいので、私もよくコピペします。)
  • すでに述べたような特徴を持ったプログラムを一から開発できるのであれば、几帳面で、行動力と知識があり、5〜10年程度の実践的な実装経験があると思います。その技術者のスキルは上位20%に入っていると思います。
  • しかしながら、報道記事などによるとエラー処理が甘く落ちたりするらしいので、通信系の職業プログラマではないとは思います。通信系の職業プログラマであれば、基本処理と同じくらいエラー処理が重要であることを知っていて当然だからです。したがって、前述の実装経験は、エラー処理など異常系を考慮しなくてよい立場・環境で培われたものだと思います。

これまでの推論をまとめると、職業プログラマよりも、むしろたとえば学生や研究者、日曜プログラマのような技術者が開発者ではないかと思います。Web技術については、その分野の専門家というより、近代プログラミングの教養として身につけていた程度ではないですかね。エラー処理の甘さと対照的な、高度概念の導入などがそう思わせます。