2011年2月27日日曜日

GnuPGの使い方

毎回絶対に忘れるので最低限のメモ。

1. 鍵を作る
% gpg --gen-key

2. 公開鍵(アスキー)を出力
% gpg --export -a <鍵の指定>

鍵の指定は鍵作成時に指定したメールアドレス。

3. 暗号化
% gpg -a -r <鍵の指定> -e clearsign.txt

4. 復号化
% gpg -d encrypt.asc

参考:http://www.nina.jp/server/windows/gpg/commands.html

2011年2月15日火曜日

Stuxnet source code reading

Laurelai / decompile-dump
https://github.com/Laurelai/decompile-dump
嘘か真か、Stuxnetのソースコードらしいです。

Partial stuxnet source decompiled with boomerang, if anyone has better decompile tools feel free to contribute better versions

2011年2月14日 15:30(PST)現在で中身はこんな感じです。

./016169EBEBF1CEC2AAD6C7F0D0EE9026/016169EBEBF1CEC2AAD6C7F0D0EE9026.c
./055A3421813CAF77E1387FF77B2E2E28/055A3421813CAF77E1387FF77B2E2E28.c
./1E17D81979271CFA44D471430FE123A5/1E17D81979271CFA44D471430FE123A5.c
./30DF51C9F0D9B010350DC09ABE1E4E97/30DF51C9F0D9B010350DC09ABE1E4E97.c
./335707EABBE7FF256E0650432ACCEC9B/335707EABBE7FF256E0650432ACCEC9B.c
./37FC7C5D89F1E5A96F54318DF1A2B905/37FC7C5D89F1E5A96F54318DF1A2B905.c
./4589EF6876E9C8C05DCF4DB00A54887B/4589EF6876E9C8C05DCF4DB00A54887B.c
./74DDC49A7C121A61B8D06C03F92D0C13/74DDC49A7C121A61B8D06C03F92D0C13.c
./789F6F8DE3F140CF5D73BEF0B8ABAF78/789F6F8DE3F140CF5D73BEF0B8ABAF78.c
./7A4E2D2638A454442EFB95F23DF391A1/7A4E2D2638A454442EFB95F23DF391A1.c
./98FBEBD8883021FBE6464C37ACF17938/98FBEBD8883021FBE6464C37ACF17938.c
./a/a.c
./A3844A1B6BEA3F6FAF9C276858F40960/A3844A1B6BEA3F6FAF9C276858F40960.c
./C1CB4117D9998C79AE10C1B890C23A4D/C1CB4117D9998C79AE10C1B890C23A4D.c
./CA9EABEAB482524E5797C684398335D5/CA9EABEAB482524E5797C684398335D5.c
./CC1DB5360109DE3B857654297D262CA1/CC1DB5360109DE3B857654297D262CA1.c
./F8153747BAE8B4AE48837EE17172151E/F8153747BAE8B4AE48837EE17172151E.c
./F979C6A3E668C5073C4C6506461B034E/F979C6A3E668C5073C4C6506461B034E.c
./F9BAE53E77B31841235F698955AECE30/F9BAE53E77B31841235F698955AECE30.c
./log

ざっと見た感じ、mainあるいはWinMain関数は見当たりませんでした。代わりに789F6F8DE3F140CF5D73BEF0B8ABAF78.c と 7A4E2D2638A454442EFB95F23DF391A1.c の2つのファイルにDllMain関数があります。

7A4E2D2638A454442EFB95F23DF391A1.c

BOOL __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
  int v3; // eax@2

  HMODULE v4; // eax@2


  sub_1000F9F2();
  if ( fdwReason == 1 )
  {
    loc_1000F9F7();
    v3 = sub_10010BBF((int)&unk_10042088);
    v4 = LoadLibraryA((LPCSTR)v3);
    sub_1000BDF5(v4);
    sub_1000F3E8();
  }
  return 1;
}

ここで呼び出している、sub_10010BBFが暗号化された構造体をほどく関数っぽい。v3に入った文字列らしきものをもとに、LoadLibraryAで外ぶらりブラリを読み込み。で、そのあと読み込んだライブラリの構造体のアドレスをdword_100420F4というグローバルな配列に突っ込んでる。

int __stdcall sub_1000BE50(int a1)
{
  return dword_100420F4[2 * a1];
}

こいつが、N番目に読み込んだライブラリの構造体を返す関数かな。



こっからはひねってあるデータの復号コード。

int __cdecl sub_10010BBF(int a1)
{
  int result; // eax@2

  if ( *(_BYTE *)(a1 + 8) )
  {
    sub_10010B9B(a1 + 11, *(_WORD *)(a1 + 9));
    *(_BYTE *)(a1 + 8) = 0;
    result = a1 + 11;
  }
  else
  {
    result = a1 + 11;
  }
  return result;
}

a1 + 8, a1 + 9, a1 + 11という3要素から、

struct {
  int a; // 0-3
  int b; // 4-7
  char c; // 8
  short d; // 9-10 : 文字数
  char e[N]; // 11- 暗号化された文字列
} 

という感じですかね。さらに追いかけると


void __cdecl sub_10010B9B(int a1, unsigned int a2)
{
  int v2; // edi@1

  v2 = 0;
  if ( a2 )
  {
    do
    {
      *(_BYTE *)(v2 + a1) -= sub_10010B6D(v2);
      ++v2;
    }
    while ( v2 < a2 );
  }
}
変換している。何文字目かによって変換規則が違う模様。
unsigned int __cdecl sub_10010B6D(int a1)
{
  int v2; // eax@1


  v2 = (a1 + 11) * (a1 + 17);
  return (a1 + 11) * (a1 + 17) ^ (((a1 + 11) * (a1 + 17) & 0xFFFFFF00 ^ ((((unsigned int)((a1 + 11) * (a1 + 17)) >> 8) ^ v2 & 0xFF0000) >> 8)) >> 8);
}

こいつが実質的なメインの関数ぽい。
char __cdecl sub_1000F3E8()
{
  char result; // al@1

  result = sub_1000F42C();
  if ( result )
  {
    result = sub_1000F405();
    if ( result )
    {
      sub_1000C37C();
      // ここでスレッドを作っている
      result = (unsigned int)sub_1000FB06(0, dwStackSize, (LPTHREAD_START_ROUTINE)StartAddress, 0, 0, 0);
    }
  }
  return result;
}

突っ込み始めるときりがない and リンクが切れているぽいところもあるので、とりあえずここまで。なんとなくの想像では、DLL読み込ませて常駐スレッドを生成するためのDLL?

2011年2月9日水曜日

Nexus S + Android2.3 Review

2週間ほど使ってみた感想を。

■外郭デザイン

あちこちで散々な言われようだったが、個人的には悪くないと思います。総重量で言えばiPhone4より軽いし、持ちやすさなどもとくに問題になるようではありません。背面の曲がっている部分は人によって好き嫌いありそうですが。

■カスタマイズ

Androidは中身も(元は)Linuxですが、立ち位置もまさにLinuxでした。オープンを売りにしているGoogleが作っただけあって、壁紙やアイコンなどはおろか、ホームアプリ、はてにはROM(≒Kernelと理解してる)まで変えられるというのにはおどろきです。まあ、ROMは変えるとサポート切れちゃうみたいですが。何はともあれこの「なんでもできます!」感がある反面、何かしないと何も出来ない感が、一昔前のLinux(あるいは他のUnix系OS)によく似ていました。X windowいれてファイルマネージャもウィンドウマネージャもランチャもマネージメントソフトも好きなもの選んでください!と言われても、多分普通の人だとどうやっていいのか良く解らん、みたいな感じになると思います。また、Android Marketもいろいろなソフトウェアが大量にある反面、クオリティの上下幅がAppleのApp Storeに比べると圧倒的に広い印象です。さらに言うならば、広範囲な機能が提供されるということは、バグなどに遭遇する機会も多くなるわけで、そういったことへの対処ができるかどうかも、ひとつの分かれ目になるかと思います。こういうカスタマイズをガリガリやるのが好きな人はいいと思いますが、ライトユーザが一定レベルまで使いこなすのはまだ難しそうです。

■性能

これはAndroidによるところなのか、Nexus Sのスペックによるものなのか分かりませんが、時々どころかそこそこの頻度で応答が激重になります。これは僕がiPhone4になれてしまったせいかもしれませんが、Android製品の中ではかなり性能が高いと言われるNexus Sでさえこのありさまだと、他の端末は一体どうなっているんだ…。部分的な最大瞬間風速はiPhone4よりレスポンスがいいと感じる時もありますが、一度詰まると固まったり数秒レスポンスがないこともままあります。以前、iPhone 3Gを使っていた印象から言うと、iPhon4 >>>> Nexus S >> iPhone 3G という感じでしょうか。タスクマネージャを使いこなしていないというのもあるかもしれないのですが、メモリが詰まってくるとちょっと重くなったかな?ぐらいのiPhone4に比べてあからさまに重くなる様は、やはり超えられない壁を感じてしまいます。

■安定性

iOSも安定性が悪いと言われてきましたが、おそらくそれよりもさらに不安定というのが印象です。これは使っているアプリに依存するかもしれませんが、ホームアプリのADWLauncherがクラッシュするランキングの上位で、他のネットワークを使うアプリもネットワークが不安定だと、なぜかそれに引きずられて落ちます。解せぬ。そこそこ使っている日は、1日に数回再起動することもあるので、これはちょっと今後に期待でしょうか。

■結論

いろいろと細部が造りこまれているのもわかるし、オモチャとしては非常に質が高いと思うのですが、やはりまだ技術者のオモチャという域を抜けていないのではないか、という印象を受けました。個人的にはとても面白いんですけど、まだライトユーザ層には敷居が高いかと。少なくとも親がNexus SとiPhone4のどちらかを使いたいといったら、間違いなくiPhone4一択で推します。