遠隔操作ウイルスのクラス・メソッド名はどうなのよ 87
ストーリー by reo
ところでこのクラス設計を見てくれ 部門より
ところでこのクラス設計を見てくれ 部門より
あるAnonymous Coward 曰く、
最近になって知ったのだが、最近話題の遠隔操作ウイルス「iesys.exe」のコマンド一覧やフォーム仕様、そしてクラス・メソッド名が公開されているそうだ(警視庁の「ウイルス情報」ページ)。
これを元に、「遠隔操作ウイルス開発者のプロファイリング」や「遠隔操作ウイルスから学ぶ命名法」なんて話題も出ている。
関数名を見ると、CamelCaseやlowerCamelCase、snake_caseが混在していて、一貫性の無さを感じるのだが、これをみて「スキルが高そう」「50代はありうる」といった感想が出ている模様。みなさまはこの関数名をみてどう思う?
真面目に分析してみた (スコア:4, おもしろおかしい)
A「まずクラス名・関数名の一覧を見て欲しい。」
A「他の人も言っているように命名規則がバラバラなのが解るだろう。複数の人のコードが混ざっていると推測できる。」
B「犯人は複数犯だと?」
A「いや、この規模のプログラムで複数犯というのは考えづらい。インターネットなどからコピペしたコードだと考えるのが妥当だろう。」
B「つまり、関数名だけ判断できないと?」
A「そうは言っていない。もう一度よく見て欲しい。」
A「命名規則はバラバラだが、小文字の動詞で始まり、区切りが大文字になっている関数が圧倒的に多いのがわかるだろう。」
A「これはJavaなどでよく使われる命名規則だ。」
B「つまり犯人はJavaのプログラマだと?」
A「これだけでそう判断するのは早計だろう。」
A「さっきも言ったが、これらの関数はインターネットからコピペしている可能性が高い。」
A「つまり、コピペ元のソースがJavaだったという事ではないだろうか?」
B「なるほど」
A「ここで犯人が生粋のC#プログラマーだったらと仮定しよう。」
A「サンプルコードを探すとき、検索文字列に「C# ~」とか「.netf ramework ~」を付けて検索する場合が多いと考えられる。」
A「C#はメジャーだし、大抵のことは出来るので、わざわざ他の言語のサンプルを参考にする必要がないからね。」
A「しかし犯人はJavaらしきサンプルを利用している。」
B「つまり犯人はC#プログラマーではないと?」
A「その可能性が高い。」
A「もし犯人がC言語のプログラマだったなら、ウイルス作るのに巨大なランタイムが必要なC#はまず使わない。」
A「スクリプト系言語のプログラマだったら、もっと短めの関数名を好むはずだ。」
A「そう考えると、犯人はJavaプログラマだと考えるのが妥当かもしれない。」
A「次はCommon.GetUnixTime()に注目してみよう。GetUnixTimeで検索すると結構な数のページが検索される。これもコピペだろう。」
B「でしょうね。」
A「これはUNIX時間を返す関数だと推測できる。」
A「ここで犯人がUNIXを全く知らないと仮定しよう。どうやったらこれらのページにたどり着くだろうか?」
A「実はUNIX時間という言葉を知らないとこれらのページにはなかなかたどり着けない。」
B「クラス毎コピペしたら、この関数も付いてきたのでは?」
A「クラス内のほかの関数と命名規則が違うので、その可能性は低いだろう。」
A「つまり犯人はある程度UNIXに馴染みがあるのではないだろうか?」
B「なるほど」
A「では次はCommon_Crpt.addKaigyo()、removeKaigyo()に注目してみよう。」
A「この二つだけ、明らかに他と異なるのがわかるだろうか?」
B「・・・日本語ですね。」
A「そうだ。英語、英語と来て、ここだけ日本語。これは恥ずかしい・・・。たとえコピペであっても私なら直すな。」
B「直しますね。」
A「次は_getElementById()に注目しよう。」
B「ちょっと待ってください。addKaigyo()はどうなったんですか?」
A「・・・いや、それだけだが・・・」
B「・・・」
A「では話を戻そう。_getElementById、_getElementsByTagNameはいわずと知れたDOMの関数だ。」
A「この関数名がさっと出てくるぐらいだから、XMLかHTML、Javascriptなどを使ったことがあるのではないだろうか?」
B「まあ今時その三つを使ったこと無いって言う人のほうが珍しいんじゃないですかぁ?」
A「まあそうだな。なんか言葉に棘がないか?」
A「まあそれはさておき、ここまでに出てきたキーワードを並べてみよう。」
B「Java、UNIX、XML、HTML、Javascriptですね。」
A「そうだ。これらのキーワードから導き出される犯人像は・・・」
A「本職はJavaServlet/JSPを使ったWebプログラマで、C#をちょっとかじったことのある人物と言うことになる。」
B「なるほど。・・・でもそれって全然絞り込めてませんよね。」
A「ウイルス作るのにC言語よりC#を選んでることから、ここ10年ぐらいの間にWindowsのプログラミングを覚えた人。」
B「それでも絞り込めていませんよ。」
A「後はaddKaigyo()を放置するぐらいプログラミングに思い入れがない人だな。」
Re:真面目に分析してみた (スコア:2)
まずは長文ご苦労さま。
結論は、あるプログラミング言語でコードを書けるか否か、どんなコーディングスタイルか、何て、所詮は状況証拠に過ぎないのだからマジメに議論する価値はないってことだな。
Re:真面目に分析してみた (スコア:1)
本職はjava servlet/jspのプログラマ
c#は半人前(犯人だけに)
30代から40代ぐらいの日本人。たぶん楽天社員ではない。
これでいいか?
実際によるあるパターンとして (スコア:2)
一貫性がないということは
複数人で作った
という可能性を私は提示したい。
Aという人が最初に作る、そしてBという人が別の部分をつくる。
しかしこのときクラス名なんかはとくに一貫性なし。
次にCという人間は別の部分をつくるが、一貫性をある程度保持するためにAとBの作ったクラス名を参考にして微妙な命名となる。
こんな感じで作られた可能性は・・・・ないか・・・・
Re:実際によるあるパターンとして (スコア:1)
> 一貫性がないということは
> 複数人で作った
> という可能性
その場合、考慮すべきは「一週間前の自分はもはや他人」ってことですかね。
Aという時期にが最初に作る、そしてBという時期に別の部分をつくる。
しかしこのときクラス名なんかはとくに一貫性なし。
Cという時期に別の部分をつくるが、一貫性をある程度保持するためにAとBの作ったクラス名を参考にして微妙な命名となる。←イマココ
なんてのはよくある話だと思います。
#数日前、初期化処理中を示すフラグ名を「in_init」と「inInit」で混在させてたことが発覚したばかりなのでAC。
Re: (スコア:0)
いや、コピペでつくったんでしょ。
実際、某サイトからコピペしてたみたいだし。
#_S/_Eはどこかで見たことあるな…
#なんだったかなぁ…
Re: (スコア:0)
_S → Second
_E → Extended
とか?
既存コードに手を入れるときは絶対元のコードに触らないで、
元のメソッドをコピって名前の末尾に2を加えたメソッドを追加(someMethod() → someMethod2())して、
その中だけで解決する人がいたなぁ…DRY?何それ、ビール?みたいな感じで。
Re: (スコア:0)
んーそこだけおもしろそうなので頭ひねってみたけど私には答えはでませんでした。。。
_uidToEndMark_S, uidToEndMark_E, uidToInterceptMark_S, uidToInterceptMark_E,
このMark系列との処理の対称性があるっぽいように思えたので、2とかExとかEx2とかではなさそうな気がします。
なんでしょね。。。Series/Paralleでもないし、、、Single/Enumerationとか?
これどっかで引数とかのsignatureみれないんですかね?
Re: (スコア:0)
Start/End とかどうだろう。
Re: (スコア:0)
俺は#2339266なんだけど、過去に見たことある_S/_EもStart/Endだった気がする。
Re: (スコア:0)
# // yyyy/MM/dd 退職済みの人の名前 S
# // 今は使ってないゴミ
# // yyyy/MM/dd 退職済みの人の名前 E
# が多重に入れ子になってるソースはもう見たくないです…
Re:実際によるあるパターンとして (スコア:2, 参考になる)
元請けの規約に
start <-> stop
begin <-> end
を対として使えってあった。
// _sはCRTのセキュア関数系を真っ先に思いつく。…あ、小文字か。
Re: (スコア:0)
今までの仕事で書いたコード・使ったコードがコピペ元ってこともあるよ
Re: (スコア:0)
関数名を見てみると
・privateメソッドはアンダーバーで始める
・暗号化など日曜プログラマには実装が難しい部分はC#サンプルからのコピペなので大文字から
・その他自分で書いたところははJavaの流儀
という印象。
Javaのスキルがある開発者が覚えたてのC#使ってみました、という感じがします。
英単語の略し方からしても英語文献を自分で読んでバリバリやるタイプではなさそうですが、開発経験はかなりありそうな。
Re: (スコア:0)
オフトピ質問ですけど、
・privateメソッドはアンダーバーで始める
個人的に昔から気になってたのですが、これはなに由来なのですかね?
私は初めてみた業務用VisualC++のソースがすでにこれでした。
当時「なんで?」と質問したら「しらん」と言われましたが。
その後、FlexでもJavascriptでもPHPでもお会いします。。。
# また別の話ですが"My"はperl由来でFA?(VBでもよくサンプルで出会ったけど。。。)
Re:実際によるあるパターンとして (スコア:1)
アンダーバーで始める名前って1980年代から存在していて, 当時はOSやターゲットに依存した互換性の無い物に使われていたことが多かったように思います. つまり, 使ってしまったら互換性/移植性に問題が出てくるため, 通常レベルのプログラマでは使ってはいけないというようなルールが設定されることがありました. それらの機能を使う場合には, 共通ライブラリ作成チームとかで互換性を維持できるような上モノをかぶせて提供することで, 問題の局所化を図っていたわけです.
それが転じて, 外部から参照されないもの/単一のソース内で完結しているものの目印として頭のアンダーバーが使われるようになったんだと思います. 今のようにIDEが発達していない時代の工夫ですが, いちいち別の名前を考えるのが面倒とか, 関数/メソッドなどではどの関数/メソッドの下請けなのかが分かりやすいなんて理由で使われているのではないかと.
Re: (スコア:0)
_で始まるメソッドやマクロは、予告なく消滅したり仕様が変わったりする可能性があることを意味していました。
非公式という意味です。実装依存の部分でもよく使われます。
起源はわかりませんが、C言語のライブラリで既に導入されているので、かなり古いことは間違いありませんね。
Re:実際によるあるパターンとして (スコア:3, 参考になる)
C言語のライブラリがどーとかいうレベルで言うなら、
は、システムに予約されています [microsoft.com]
(システムの内部的な名称で使われてるかもしれないから、バッティングしないようにユーザーは使うな、ということです。)
ローカルなスコープなら _小文字 で始まる名前は使えますけど、トラブルを避けるためにも、_で始まる名前は使わないのが無難。
#ライブラリのソースコードとか眺めて真似たりとかしてるとついつい_で始まる名前を使いたくなるんですよね。
#私は今は、識別子の最後に_を付ける、というルールでやってます。
Re:実際によるあるパターンとして (スコア:1)
システムに予約されています [microsoft.com]
まあ、より正確には(上記URL先のMSDNにも書いてありますが)C90/C99規約ないしC++規約でリザーブされてるということですね。
MSDNから引用
C++ 規格では、次の名前が実装系のために予約されています。
グローバル スコープを持ち、_ で始まる名前
_ で始まり、その次が大文字の名前
__ を含む名前
(C++ の規定の方が予約名の範囲が大きく、2 連のアンダースコア文字が名前の先頭だけでなくどこにあっても予約名になる。)
これが参考になるかな?C++2003規約?
http://stackoverflow.com/questions/228783/what-are-the-rules-about-usi... [stackoverflow.com]
Re:実際によるあるパターンとして (スコア:1)
割と有名なGoogle の python スタイルガイドでは 内部はアンダースコア一個ですね。
http://google-styleguide.googlecode.com/svn/trunk/pyguide.html?showone... [googlecode.com]
アンダースコア 2個始まりってCだかC++だかでは気軽に使っちゃいけないやつだから pythonでも使わないんじゃないですかね。
(というかアンダースコア 2個はじまりはまだ見たことない)
# yes, fly. no, fry.
Re:実際によるあるパターンとして (スコア:1)
なんでその風習が出回ってるのかよくわからないんですが(java由来だと思っているけど)、
昔からMicrosoftのガイドラインではprivateメンバは小文字始まりなだけなのでそれに従ってます。
(VB.NETは困るんですけどね。)
http://msdn.microsoft.com/ja-jp/library/vstudio/ms229060(v=vs.100).aspx/ [microsoft.com]
まぁあんまりprivateな部分まではごちゃごちゃ規定されていない気はします、
実際 .NET Frameworkのソースでも
m_始まりもあるし、 ( System.Globalization.TextInfo )
_始まりもあるし、 ( System.Web.UI.Design.MobileControls.TextViewDesigner )
小文字始まりもあります ( System.Windows.Forms.TextBox )
# yes, fly. no, fry.
Re:実際によるあるパターンとして (スコア:1)
privateでは頭にアンスコを着ける
Re:実際によるあるパターンとして (スコア:1)
# ちゃんと C#らしく書けるかどうかは別の話ですが、文法はかなり似ているので、
# java覚えたての若い子でも読めてはいましたね。
# 命名規約以外でもFinalizeとか実装してたら.NET知らない javaの人だなー、とかバレるポイントはいろいろあるんですけど(IDisposable使うんで)。
彼が普段使ってたのはJavaっていうのは知らなかったですが、普段の仕事がJavaの人なんてたくさんいますからねー。
# yes, fly. no, fry.
Re: (スコア:0)
犯人の身近なベテランの人が作っていたものをパクって作成したみたいな想像をした
コピペ? (スコア:2)
掲示板への書き込みメソッド(っぽい名前の奴)とか、「こうやったら出来た」と雑なサンプルを載せてるblogなんかがヒットしそうなイメージ。 ちらっと検索してみたらこの話題しか出てこないみたいだけど。
ありがち (スコア:0)
Win APIが絡むとwindowHandleとhWndが混在するようになる。
日曜プログラミングだったらこんなもんじゃない? (スコア:2)
と吹き出してしまいましたw
ガチガチの人はどうかわかりませんが、
いくつかの言語を渡り歩いてりゃ、
私的プログラムだったらこんなもんだと思いますけど。
ソースコピペとかもねえ。こんなもんじゃね?
そうか、今時の若い子はこんなスチャラカプログラミングはしないんだ。
Hu-BASICとかN88-BASICとかから使ってると「三つ子の魂百まで」だなあ、というケースもありますな。
個人的にはCamelCaseよりもアンダーバーが好きですね。
というか、C言語を覚えた20数年前はそれが多かった気がする。
Re:日曜プログラミングだったらこんなもんじゃない? (スコア:2)
カーゴ・カルト・プログラミングでしたっけ?
往々にして本人は(マズイことしていることに)気づかないんですよね。
Re: (スコア:0)
#include <stdio.h> /* ←動かすためのおまじない */
こうですかわかりません>_<
#全体的に古臭くお送りしました
Re:日曜プログラミングだったらこんなもんじゃない? (スコア:2)
#include
とか凶悪ですね。
もしかして、いま時のプリコンパイルヘッダーをサポートした処理系だと、推奨される方法なのか???
Re: (スコア:0)
凶悪すぎて凡人の目には映りません!
Re: (スコア:0)
凶悪犯&LT;による遠隔操作事件
Re:日曜プログラミングだったらこんなもんじゃない? (スコア:2)
アチャーやってしまった
#include <Xm/XmAll.h>
でした
Re:日曜プログラミングだったらこんなもんじゃない? (スコア:2)
Re:日曜プログラミングだったらこんなもんじゃない? (スコア:2)
もし自分が作るなら命名なんてネットからひろったままにしたり
かなりいい加減にやっちゃいますけどね。クセが出ないように注意しながら。
この犯人もかなり用心深いみたいだからそのくらいやるでしょ~?
Re:日曜プログラミングだったらこんなもんじゃない? (スコア:1)
好き嫌いと言うより, 昔はアセンブラやリンカが大文字/小文字の区別をつけていないなんて環境があったので, 移植性を考慮するとアンダーバーが無難だったりして.
さらに特殊な環境(例えばメインフレームとか)だと, アンダーバー自体が使えなくて, &lquo;-&rquo;とかに事前に変換しておかないと, ソースを持ってくることさえできないなんてことも.
GJ (スコア:2, すばらしい洞察)
この情報を公開すればIT技術者の関心を惹けると、犯人特定の情報を得られる可能性を閃いた警察は賢い。
ちょっと違う視点から見てみよう (スコア:0)
おそらく警察は手詰まり、若しくはこれ以上犯人を探すつもりはない。
つまり犯人はゆうちゃん
Re:ちょっと違う視点から見てみよう (スコア:1)
PC遠隔操作事件の教訓 [gendai.net]?
Re: (スコア:0)
犯人をゆうちゃん
Re: (スコア:0)
あなたを、犯人です。
Re: (スコア:0)
犯人だYOU CAN!(DO IT)
メソッド引数も (スコア:0)
メソッド引数も公開すべきじゃないですかね。
命名規約は結局のところ名前でしかなく、多少迷彩をかけてくる可能性もありそうですが、引数の型や順番は設計思想が現れそうに思うので。
# kuippa氏の指摘は全体的に微妙。"asy"が"asynchronous"だと指摘されるまで気づかないって……。
フランケンコード (スコア:0)
色々くっつけた結果がこれではと。
名前で検索すると同じのが出てきたりして。
地球丸ごとバックアップシステム (スコア:0)
これがあれば誰も悲しむことがなくなるのに。
Re: (スコア:0)
早速仕様のバグを見つけた。
宇宙関連をスコープ外にしてた。
やはり人間には無理なんだろうか。
悲しみのない世界は実現不可能なんだろうか。
レビューアの方が... (スコア:0)
タレコミのリンク先を読んで思うのは、レビューアの能力や
経験が(と若干性格も)暴露されているなっと。
Re:レビューアの方が... (スコア:2, すばらしい洞察)
まあ大抵、レビューとかでケチつけまくったりコーディングルールとか押し付けたがる奴は
故障で欠陥豊かで無能なプログラマだったりするわな。
Re:知らなかった、私は犯人だったのか? (スコア:2)
犯人になってください!
Re:知らなかった、私は犯人だったのか? (スコア:1)