週刊「遠隔操作ウィルスを作る」は、iesys.exeの名前しかしらない筆者が、想像と妄想を元に「遠隔操作ウィルス」っぽいものを作り上げていく過程を記録するマガジンです。専用リングバインダー(キングジム製)を使って仕様書をファイリング可能で、全号集めると納品ドキュメントが完成します。君も、オリジナルの遠隔操作ウィルス作成にチャレンジしてみよう!
■ はじめに
猫カフェ男が真犯人かどうかわかりませんが、遠隔操作ウィルス・システムを0から作るためには、かなりの技術力が必要になると考えられます。たぶん、技術者の中でも上位5%とかそんな感じです。私は、そうとうゆうしゅうなぎじゅつしゃwなので一般の方には参考にならないかもしれませんが、私が作るとしたらどんな感じになるか試してみたいと思います。
■インセプションデッキを作る
たぶん真犯人は「アジャイラー」じゃないと思いますが、アジャイルサムライにしたがい、真犯人になったつもりで、インセプションデッキを作ってプロジェクトを定義していきたいと思います。
質問1: 我々はなぜここにいるのか
・犯行予告を書き込むことで、ネットを騒がせたい
質問2: エレベータピッチを作る
エレベーターピッチのテンプレート
・自分が捕まらずに反抗予告を書き込みたい、
・自分向けの
・遠隔操作ウィルスというプロダクトは、
・匿名プロキシーです。
・これは、IPアドレスを残さずに掲示板に書き込みができ、
・torとは違って
・2ちゃんねるに書き込むことが出来る能力が備わっている。
と、ここまで書いて思ったのですが、この目的だと別にtorで良さそうですね(対策されてない掲示板に書けばよいので)。目的を間違っていたようです。
質問1a: 我々はなぜここにいるのか
・他人のPCを操作したい
質問2a: エレベータピッチを作る
・他人のPCから掲示板に書き込みを出来る、
・自分向けの
・遠隔操作ウィルスというプロダクトは、
・仮想端末ソフトウェアです。
・これは、他人のIPアドレスで掲示板に書き込みができ、
・既存のルートキットとは違って、
・ウィルス対策ソフトにばれずにインストール出来る能力が備わっている。
これだと、なんとなく「銀行振り込みウィルス」の存在を知って似たようなのを作りたい(でも、口座から辿られたくない)という自己満足型のプロジェクトっぽいですね。もしくはWinnyの情報流出ウィルスの亜流です。報道にあるように「警察への嫌がらせ」とかそんな目的かもしれませんが、とりあえず、このまま進んでいきます。
質問3: パッケージデザインを作る
省略
質問4: やらないことリストを作る
やらないこと
・自動アップデート(面倒なので)
・ネットが繋がってないとかのエラー処理(面倒なので)
・プロキシ対応(面倒なので)
・相手のPCに直接つなぐ(何かの拍子にバレると嫌なので)
やること
・Windows対応(シェアが大きいので)
・PC起動時にソフトも起動
・PC同士を疎結合にする(バレないように)
・設定を外部から読み込む(いろんな掲示板に書き込めるように)
質問5: ご近所さんを探せ
省略
質問6: 解決案を描く
○ 構成図
・自分のPC <-- tor --> 何かのqueueシステム <--> 相手のPC
○ 配布方法
1. Winny/Shareの偽装ファイルとして → 高木なんとかさんに配布元が見つかる可能性
2. エロサイトを作って、画像ダウンロードソフトを偽装する
3. エロサイトを作って、ブラウザのセキュリティーホールを利用する → ハッカーじゃないので無理
4. SPAMをばらまいて、ダウンロードリンクを踏ませる → いかにも怪しいので効率悪そう。メールサーバをどうやって用意するかが問題
5. ネットカフェのPCにインストールしておいて、USBを挿した人に感染させる。 → PCが毎回初期化されたり、バレる可能性がある
6. DRM解除ソフトを偽装して配布
7. USBメモリを忘れた振りをして、その辺に転がしておく
質問7: 夜も眠れなくなるような問題は何だろう?
・インストールさせる方法が難しい
・Windowsソフトが開発できない
・おとりサイトに誰も来てくれない
・おとりソフトを誰もダウンロードしてくれない
・他人の環境でソフトが動かない
・警察に捕まる
質問8: 期間を見極める
省略
質問9: 何を諦めるのかをはっきりさせる
省略
質問10: 何がどれだけ必要なのか
・Windows用の開発環境一式(普通に考えるとC#)
■ ここまでのまとめ
待ち伏せ方式での配布だと、すごく効率が悪そうですし、見つかってサイト削除されそうな気がします。私は既に報道で「ソフト質問板の回答として」ソフトを配布したことを知っているのですが、普通、思い付きませんよね。それに、全員その方法でインストールさせたんでしょうか?
2013 04 01 [プログラム] | 固定リンク | コメント (0) | トラックバック
1.テスト書かなくていいので、工数減らしてください。
ソフトを作る以上、なんらかのテストは必要です。実行して結果を見るとか、ブラウザで表示するとか。その確認を楽にするためにテストを書くのに、テストを書かないからといって工数が大幅に減るわけではありません。そして、いざバグが発生したりすると、切り分けのために工数が必要になり、「テストが無い部分のチェックの必要」や「不安」がエンジニアのモチベーションを削って行きます。
結局のところ、「バグが発生しないことを前提に」スケジュールが組まれるだけです。
2.とりあえず動けばいいです。
とりあえず動いたとして、特定の条件で発生する致命的なバグを許してくれるのか許してくれないのか、要求側の胸三寸です。実験レベルと商用レベルでは考慮すべき障害のレベルや影響範囲が異なるのですから、何を求めるのか明確にしないと、ソフトウェアは動きません。なぜなら、コンピュータは「とりあえず」なんて曖昧な命令を理解できないからです。動いて当たり前、要求側の想像と違うと責任を取らされる(残業や休出という形で)のに戦々恐々です。
# エンジニア同士の会話では、問題ない場合も多々あります。
3.スケジュールが厳しくなってきたので、明日から進捗確認のための朝会・夕会やります。
スケジュール管理できないマネージャーに限って、土壇場でスケジュール管理した「振り」をしたがります。進捗報告しても、結局は聞き流しているだけなので、単なる時間の無駄です。無駄な時間は、少しでも仕事を進めたいエンジニアのモチベーションを、浪費した時間の絶対値以上に激減させます。無駄なだけならまだしも、遅れを「糾弾」するようになったら有害ですらあります。
4.バグはExcelで管理します。
「チケットだと管理しにくい」とか良くわからない理由で、グループ編集機能の無いExcelでバグを管理するプロジェクトは良くあります。「今から編集しまーす」って声掛けしてから編集するなんて、効率が悪すぎます。バグ一覧(1).xls、バグ一覧(2).xls、バグ一覧20130227.xls、バグ一覧(最新).xlsなんて、見るだけでもおぞましいです。
5.(MS Project見ながら)1.5人日遅れてるようですが、原因は何ですか?
「マネージャーが適当に引いたスケジュールだからです」
ソフトウェアの作成は単純なデータ打ち込みとは違うので、正確な必要時間を見積もるのは大変難しいです。それでも経験により、ある程度の見積もりは可能となりますが、たいていの場合MS Projectで引かれるスケジュールは、メンバーの体調やプロジェクト上の問題発生を考慮しない、ギリギリのスケジュールです。すなわち、予定調和的にスケジュールは遅れていきます。「頑張って」としか言えないマネージャーなら、初音ミクに「頑張って」と言わせたほうが、まだマシです。
遅れを取り戻す方法として、「1のテスト書かない」が取り入れられることで、際限なくプロジェクトは遅延していきます。
6.○○管理台帳
ソフトウェアと台帳で情報が分散すると、その整合性を取るのに労力が使われます。しかも、台帳はえてしてExcelなので、情報の正確さが担保されないことが多々あります。SQL管理台帳のスペルミスや、attribute管理台帳の数値範囲ミスなんか、可愛いほうです。台帳を使うなら必要最小限で、ソフトウェアとの連携を自動化するなどの工夫が必要です。ファイル名管理台帳とか、変数名管理台帳とか良く見るのですが、何に使うのか良く分かりませんし保守しろと言われたら発狂します。
7.手触りを大事にしたいので、仕様をきっちり決めるのでは無くアジャイルで開発しましょう→○○が動かないので、確認できません。
結局、全部出来上がった後でしか確認(受け入れテスト)出来ない(確認する能力が無い)のであれば、ぐだぐだなだけの「ウォーターフォール」です。プロジェクト後半になって急激に上昇するバグ曲線を見て、うんざりしないエンジニアはいないでしょう。
一般に、日本で言う「アジャイル」は、「機能を追加しても、お金を追加で払いたくない」の言い換えに過ぎません。
参考:
デザイナーのモチベーションを根こそぎ奪う!たった7つの魔法の言葉
2013 02 26 [プログラム] | 固定リンク | コメント (0) | トラックバック
env = { "action_controller.request.request_parameters"=>{:action=>"show", :id=>1}, "REQUEST_URI"=>"?aa=3", "REQUEST_METHOD"=>"get" } puts EntriesController.call( env ).body
2009 03 18 [プログラム] | 固定リンク | コメント (0) | トラックバック
日本語、英語さらに携帯ごとにテンプレートファイルを切り替える方法。
普通に、gettextとjpmobileを入れると、携帯でのアクセスがあった後に英語に切り替わらなくなる(バグ?)。また、日本語テンプレートをデフォルトにすると、イタリア語とかでアクセスがあった時に困る。
■パターン1
これだと、イタリア語(en以外)のときにも日本語が表示される。
index.html (日本語)
index_en.html (英語)
index_mobile.html (携帯)
■パターン2
これだと、携帯でアクセスしたときに、index_ja.html が表示される。
index.html (英語)
index_ja.html (日本語)
index_mobile.html (携帯)
■解決策
パターン1を採用した上で、以下のようなコードを追加する。日本語以外は、全て英語という設定にする。
def locale
::GetText.locale = nil
if request.mobile?
::GetText.locale = "ja"
elsif ::Locale.system.language != "ja"
::GetText.locale = "en"
end
end
end
2008 07 04 [プログラム] | 固定リンク | コメント (0) | トラックバック
フォームが、ぴったり揃うと気持ちいい!ということで、スナップ機能(画面端や別のウィンドウ端に吸着する機能。snap to grid)を作ってみた。
参考にしたサイトだと、フラグ(?)を使う実装になってたけど、ドラッグ処理を自前でやれば、もっと簡単に書ける。
[StructLayout( LayoutKind.Sequential )]
private struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
#endregion
private Point mouseStart;
private Point rectStart;
private Size Gap = new Size( 12, 12 );
protected override void WndProc( ref Message m )
{
if ( m.Msg == WM_MOVING )
{
Rectangle rect1 = new Rectangle( rectStart.X + Cursor.Position.X - mouseStart.X,
rectStart.Y + Cursor.Position.Y - mouseStart.Y,
Gap.Width, Gap.Height );
Rectangle rect_x = new Rectangle( 0, 0, Gap.Width, Screen.PrimaryScreen.Bounds.Height );
Rectangle rect_y = new Rectangle( 0, 0, Screen.PrimaryScreen.Bounds.Width, Gap.Height );
RECT r = (RECT)Marshal.PtrToStructure( m.LParam, typeof( RECT ) );
// 横方向
rect1.Width = Gap.Width;
rect1.Height = this.Height;
if ( rect1.IntersectsWith( rect_x ) )
{
r.Left = rect_x.Left;
Cursor.Position = new Point( Cursor.Position.X - (this.Left - r.Left), Cursor.Position.Y );
Gap.Width = 48;
}
else
{
r.Left = rect1.Left;
Gap.Width = 12;
}
// 縦方向
rect1.Width = this.Width;
rect1.Height = Gap.Height;
if ( rect1.IntersectsWith( rect_y ) )
{
r.Top = rect_y.Top;
Cursor.Position = new Point( Cursor.Position.X, Cursor.Position.Y - (this.Top - r.Top) );
Gap.Height = 48;
}
else
{
r.Top = rect1.Top;
Gap.Height = 12;
}
r.Right = r.Left + this.Width;
r.Bottom = r.Top + this.Height;
Marshal.StructureToPtr( r, m.LParam, false );
}
else if ( m.Msg == WM_ENTERSIZEMOVE )
{
mouseStart = Cursor.Position;
rectStart = this.Location;
}
base.WndProc( ref m );
}
2007 11 07 [プログラム] | 固定リンク | コメント (0) | トラックバック
リンク: RSA Public, Private, and PKCS #8 key parser.
C#で、PEM形式の公開鍵暗号ファイルを読み込んで、RSACryptoServiceProvider を作る方法。
ただし、そのままだと、BinaryReader.PeekChar でArgumentExceptionが出るため、
2007 10 28 [プログラム] | 固定リンク | コメント (0) | トラックバック
C#から、Rubyを呼び出すことは出来るんだけど、普通に呼び出すとメインスレッドで実行されるので、UIがブロックされてしまう。そこで、Ruby専用のスレッドを作ってみた。
でも、DoWorkを待つ(Rubyと同期させる)のは、どうしよう?
何か良いアイデアがあったら、教えてください。
[DllImport( RubyDll )]
public static extern void ruby_init();
[DllImport( RubyDll )]
public static extern System.Int32 rb_eval_string( [MarshalAs( UnmanagedType.LPStr )] string s );
private static EventWaitHandle NewItemEvent = new AutoResetEvent( false );
private static EventWaitHandle ExitThreadEvent = new ManualResetEvent( false );
private static WaitHandle[] EventArray = new WaitHandle[2] { NewItemEvent, ExitThreadEvent };
private static Queue
private static Thread thread;
public delegate void func();
public static void Init()
{
thread = new Thread( ThreadRun );
thread.Start();
}
public static void Terminate()
{
ExitThreadEvent.Set();
thread.Join();
}
public static void ThreadRun()
{
ruby_init();
while ( WaitHandle.WaitAny( EventArray ) != 1 )
{
func dlg;
lock ( ((ICollection)_queue).SyncRoot )
{
dlg = _queue.Dequeue();
}
dlg();
}
}
public static void DoWork( func f )
{
lock ( ((ICollection)_queue).SyncRoot )
{
_queue.Enqueue( f );
NewItemEvent.Set();
}
}
}
使い方:
参考: producer スレッドと consumer スレッドを同期する
2007 10 22 [プログラム] | 固定リンク | コメント (2) | トラックバック
ListViewが、いちいちチラついてむかつくので、ちらつかないListView(Flicker-free ListView)を作る方法(XP以降)。単純に、ダブルバッファリングをONにするだけです。
前も、調べたような気がする。
private const int LVM_FIRST = 0x1000;
private const int LVM_SETEXTENDEDLISTVIEWSTYLE = (LVM_FIRST + 54);
private const int LVM_GETEXTENDEDLISTVIEWSTYLE = (LVM_FIRST + 55);
private const int LVS_EX_DOUBLEBUFFER = 0x00010000;
private void Form_Load( object sender, EventArgs e )
{
int styles = (int)NativeMethods.SendMessage( listView1.Handle, (int)LVM_GETEXTENDEDLISTVIEWSTYLE, 0, (IntPtr)0 );
styles |= LVS_EX_DOUBLEBUFFER;
NativeMethods.SendMessage( listView1.Handle, (int)LVM_SETEXTENDEDLISTVIEWSTYLE, 0, (IntPtr)styles );
}
参考リンク: Flicker-free ListView in .NET and XP
2007 10 18 [プログラム] | 固定リンク | コメント (0) | トラックバック
表示がおかしいので、壊れたのかと思ったら、モードが変わっただけでした。
2006 09 27 [プログラム] | 固定リンク | コメント (0) | トラックバック
C#のIDEやコンポーネントは使いやすいので、Rubyが呼べると便利かも、と思ってやってみたら、あっさり出来た。
標準出力の場所が分からないので、実行に成功したらファイルが作られるようにした。
namespace rubycall
{
public partial class Form1 : Form
{
[DllImport( "msvcrt-ruby18.dll" )]
public static extern void ruby_init();
[DllImport( "msvcrt-ruby18.dll" )]
public static extern uint
rb_eval_string( [MarshalAs( UnmanagedType.LPStr )] string s );
public Form1()
{
InitializeComponent();
}
private void Form1_Load( object sender, EventArgs e )
{
ruby_init();
rb_eval_string( @"File.open('a.txt', 'w' ) { |f| f.puts 'success' }" );
}
}
}
2006 06 08 [プログラム] | 固定リンク | コメント (0) | トラックバック
リンク: Amazon.co.jp:入門 Ajax: 本.
買った
2006 04 05 [プログラム] | 固定リンク | コメント (0) | トラックバック
リンク: Amazon.co.jp:RailsによるアジャイルWebアプリケーション開発: 本.
買った
2006 04 05 [プログラム] | 固定リンク | コメント (0) | トラックバック
リンク: Amazon.co.jp:Access VBAプログラミング開発工房 入門・基礎編: 本.
リンク: Amazon.co.jp:Access VBAプログラミング開発工房 データベース構築実践編: 本.
リンク: Amazon.co.jp:プロ中のプロが教えるAccessスーパーテクニック―ACCESS2000/2002/2003対応: 本.
リンク: Amazon.co.jp:プログラミングMicrosoft ADO.NETマイクロソフト公式解説書: 本.
買った
2006 02 20 [プログラム] | 固定リンク | コメント (0) | トラックバック
2005 12 24 [プログラム] | 固定リンク | コメント (0) | トラックバック
VC.net(VC7)で作られたライブラリを、VC6でリンクしようとしたら、以下のようなエラーが出て駄目だった。
error LNK2001: 外部シンボル "___security_cookie" は未解決です
しょうがないから、VC.netを買いに行かなければならない(仕事なので)。
2005 06 04 [プログラム] | 固定リンク | コメント (0) | トラックバック
参考: Visual C# .NET からオートメーションを使用して、Word で新しい文書を作成する方法
#! /usr/local/bin/ruby -Ks
require 'win32ole'
word = WIN32OLE.new( 'Word.Application' )
word.Visible = true
doc = word.Documents.Add()
para1 = doc.Content.Paragraphs.Add
para1.Range.Text = "新規文章です。"