FFFTPのパスワードを復元(ソース付き)

FFFTPはソースが公開されていて、暗号化されて保存されているパスワードを復元することができる。*1
私みたいにパスワードを保存してあるけど忘れてしまったという人向けに公開してみる。

自己責任において自身のアカウントのみで使用して下さい。

DecodeFFFTPPassword.c
#include <string.h>
#include <stdio.h>
//
static void DecodePassword(char *Str, char *Buf)
{
	unsigned char *Get;
	unsigned char *Put;
	int Rnd;
	int Ch;

	Get = (unsigned char *)Str;
	Put = (unsigned char *)Buf;
	while(*Get != '\0')
	{
		Rnd = ((unsigned int)*Get >> 4) & 0x3;
		Ch = (*Get & 0xF) | ((*(Get+1) & 0xF) << 4);
		Ch <<= 8;
		if((*Get & 0x1) != 0)
			Get++;
		Get += 2;
		Ch >>= Rnd;
		Ch = (Ch & 0xFF) | ((Ch >> 8) & 0xFF);
		*Put++ = Ch;
	}
	*Put = '\0';
	return;
}

int main(int argc ,char *argv[])
{
	if(argc == 2 && strlen(argv[1]) > 0)
	{
		char buf[1024];
		DecodePassword(argv[1],buf);
		fputs(buf,stdout);
	}
	else
	{
		fputs("Usage:\n",stderr);
		fputs("DecodeFFFTPPassword 暗号化された文字列\n",stderr);
		fputs("暗号化された文字列:HKEY_CURRENT_USER\\Software\\Sota\FFFTP\\Options*\\Host*\\Password\n",stderr);
	}
}

*1:ググればそれに関する情報はいくらでもある

unsafeでなにができるか?

ポインタを扱えるのはわかるが、細かくは何ができて何ができないかわかるかわからん。

  • voidポインタを扱える。
  • 値型のポインタを扱える。
  • 構造体同士はキャストしちゃえば何でもあり。
  • const(readonly)ポインタは扱えない。
  • ポインタのポインタ、ポインタの配列は扱えるが、配列のポインタは扱えない。
  • 値型の配列をスタックに確保できる。
  • オブジェクト型のポインタは扱えない。
  • オブジェクト型の値型メンバは扱える。(fixedステートメントでオブジェクトをPinしてくれる?)
  • ポインタを扱えるかどうかはMarshalAs属性(UnmanagedType.ByValTStr/SizeConst)の適用とは関わりがない。
  • MarshalAs属性を使用しているとMarshal.SizeOfメソッドとsizeofは違う値になる場合がある。
  • 配列からポインタへの変換はfixedステートメントを使用する。
  • String型からCharポインタへの変換はfixedステートメントを使用する。ただし文字列の不変性を破壊する。
  • 型パラメータ(ジェネリクス)は扱えない。(unsafeはコンパイル時で評価、ジェネリクスJIT時に評価だからか?)
  • 関数ポインタは扱えない。

調べはしたが使う予定はない。

unsafe (C# によるプログラミング入門)

C++の継承は難しい…

ダイアモンド継承をしないのは当たり前として、Java/C#のノリで「インターフェースとそれを部分実装する抽象クラスを継承する」ってのをやろうとしてはまってしまった。

やろうとしたコード

class Interface 
{
public:
	virtual void Foo() = 0;
	virtual void Bar() = 0;
	virtual ~Interface() {};
};

class Abstruct : public Interface
{
public:
	void Foo() 
	{
		//なにかやる
	};
	virtual ~Abstruct() {};
};

class Inherited : public Interface,private Abstruct
{
public:
	void Bar()
	{
		//なにかやる
	};
};

int main()
{
	Inherited i;
	return 0;
};

コンパイルすると、「'void Interface::Foo(void)' : は抽象型です」と言われてしまう(VC++)。
プライベート継承がいけないのかと思って、パブリック継承にしたけど同じ。
継承してるんだから定義あるだろ!と言いたくなる。(俺の理解不足なのはわかってるけど。)
結局Interfaceを継承するのをやめて

class Inherited : public Abstruct

とすれば大丈夫だった。

結論としては慣れないことするなってことで。

想像力と英語力が貧困でイヤになる

mkisofsに含まれている
set_721,set_722,set_723,set_731,set_732,set_733,get_711,get_721,get_723,get_731,get_732,get_733
が何でこんな関数名になっているんだろうと思ったら、ISO9660(ECMA-119)のセクション番号だったのか。
isonum.cで定義してるのにサッパリ気づかなかった。

Firefoxが不調

Firefox3.0.4のプロセスを起動しっぱなしだと、ある時からウィンドウ自体がまともに描画されなくなった。
ハンドルリークっぽいなーと思ってタスクマネージャを観察していると、ページを開く度にGDIオブジェクトが微増してる。*1(GDIViewではBitmapとDCが突出している)

とりあえずキャッシュを手作業すればガスッと減るけど、気持ち悪いな・・・

*1:動作環境・アドオンも影響していると思う

pixiv用のgreasemonkeyスクリプト2

新しいのを作った。ホントは機能拡張のつもりだったけどほぼ別物になってしまった。
相変わらずソースが綺麗にならない。

pixixx.user.js

機能

  • 低評価ブロッカー(5点以下の評価が出来なくなります)
  • ランキング/タグ検索ページのサムネイルを投稿したユーザが マイピク(またはお気に入り)済みかどうかをチェックします*1
  • メンバーページ(http://www.pixiv.net/member.php?id=????)のブックマークの「もっと見る」(未分類のブックマークイラスト)を「すべて見る」(すべてのブックマークイラスト)にします。
  • イラストページ(http://www.pixiv.net/member_illust.php?id=????)に「イラスト一覧」というリンクを作ります。(メンバーページへの遷移が不要になります)

(2009-04-06追記)
別のスクリプトを作成したのでよければどうぞ。

*1:チェックするには灰色のボックスをクリック。「M/F」と表示されればマイピク(またはお気に入り)済みです。Autopagerizeによって追加された部分は未対応

pixiv用のgreasemonkeyスクリプト

自分用にいろいろ出来るスクリプト作ったよ!

  • javascript+domリハビリ
  • ソース超汚い
  • 使用は自己責任で
  • 名前は適当

pixix.user.js

機能

  1. イラストページの画像をフルサイズの画像に自動的に置き換えます。
  2. タグクラウドの表示を切り替えられるようにします。*1
  3. 表示中のサムネイル画像の、フルサイズ画像へのURLの一覧を表示します。AutoPazerizeと併用できます *2

(2009-04-06追記)
いろいろ思うところがあり、公開停止します。
別のスクリプトを作成したのでよければどうぞ。

*1:「イラストタグ一覧」のクリックで切り替え

*2:一覧はダブルクリックで閉じる