/Winny-p2p

Copy of the Winny (not really sure, probably a rewrite) p2p source code for historical purpose

Primary LanguageC++

Winny2β6.6/7.0/7.1のソースみたいなもの
revision 0.1

・問題や錯誤が含まれている可能性あり
・自己の良心に従って使用のこと
・無保証自己責任

Winny2β6.6/7.0/7.1と概ね一致するバイナリを吐き出すC++コードです。BCB6用です。
バイナリ完全一致を目指しましたが困難なので、機能には影響のない不一致部分が残っています。
機能的には一致していると思いますが、いろいろな点で問題が残っている可能性があります。

Winnyがどのように実装されどのように動作するのか、技術的な見地から興味を持ち解析を行いました。
その過程で同一の動作をするソースコードを作ってみようと思い、作業を行ったものです。完全一致までは
至りませんでしたが、ほぼ一致させることができました。

Winnyの開発者とは関係ありません。独自に書いたものです。オリジナルのソースを参照できる立場には
ありませんので、当然、本来のソースと比べ関数名や変数名などは異なりますし、名前の意味や型も
本来あるべきものではない部分が多々あります。比較的初期の解析結果をもとにその時の気分で変数名
などを付けていますので、注意してください。さらに修正すべきところが多数残っています。他の表現や
他の型がふさわしいと分かっていても改善していない部分があり、必ずしもコメントなどで明示していません。

技術的検証を目的として作成したものです。何らかの行為を推奨するものではありません。使用にあたっては、
自己の良心に従って下さい。



技術的なメモ

コンパイラ
  Borland C++ Builder 6.0 に対応しています。
  オリジナルは Borland C++ Builder 6.0 Professional サービスパックなし(Build 10.157)でコンパイルされているようです。
  サービスパックが入った状態でもコンパイルできますが、バイナリ一致の程度は若干低くなるかもしれません。

バイナリ一致
  各ユニットのコンパイル順序により生成されるバイナリが異なる場合があるようです。具体的な条件等はよく分かりません。
  サービスパックが入っているとライブラリが変更されますので、バイナリ一致の検証には古いライブラリ(6.00)を使用して下さい。
  一致しない部分はできるだけ機能一致するようにしていますが、見落としがある可能性があります。
  リソースについてはバイナリ一致していません。概ね機能的には問題ないと思いますが、詳細は確認していません。

ソース
  作業中のものなため、非常に汚く読みにくいです。
  バイナリ一致を目指したため、通常は書かないような表記法を採用している部分があり、可読性が低下しています。
  オリジナルに含まれるバグ・問題点は、そのまま放置されています。

関連ソース
  長整数演算は http://www5.airnet.ne.jp/tomy/ を使っているものと思われますが、このソースでは独自に書き起こしています。
  BBS表示(RichTextView)は http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/jane/jane/Components/HogeTextView.pas (1.6)を一部変更して使っています。

問題点
  不一致部分は主にレジスタアサインやレジスタ使用順序が再現できないもの、ブロック構造が微妙に異なるものです。修正をするのが面倒なので放置している部分もあります。
  インライン展開された関数やテンプレート等で把握できていないものが、ライブラリのものとWinnyのもの共にあると思われます。
  一部warningを潰していません。
  変数の型が本来あるべきものではないものが多数あります。特にsigned/unsignedが再現されていないものが多いと思われます。
  バイナリ一致のために、変な表記をしたりキャストを多用したりしています。変数の宣言順序・サイズやクラスのサイズに依存している部分があります。
  表記が冗長な部分が非常に多いです。単純化しても機能・一致に問題がないところが多いでしょう。
  変数の宣言順序に依存している部分がある可能性があります。

命名法
  クラス名等で名前が推測できるものについては、オリジナルと同じと思われるものを使用しました。関数名や変数名は一般にかなり適当な命名をしています。
  現時点ではより詳細に把握されている部分もありますが、このソースではそのあたりの成果が反映されていません。

型・スコープ
  型・スコープについては、バイナリ一致のために必要な部分は再現の努力をしていますが、一般にはあまり考慮していません。

他の解析者
  他にもWinnyを解析されている方がいらっしゃいます。関連サイト等を参照して下さい。公開された解析情報については、参考にさせて頂いています。
  個別のお名前を挙げることは避けますが、ありがとうございました。



コンパイル方法

コマンドラインの場合は make -fwinny.mak でできます。IDEの場合には、RichTextViewをコンポーネントとして登録したほうが良いでしょう。
BCB IDEのコンポーネント周りがbuggyなので、関連操作時には十分注意して下さい。

ライブラリとしてlib600ディレクトリに入ったライブラリを参照しています。BCBのlibディレクトリの中から以下のファイルをコピーして入れて下さい。
makeファイルやプロジェクトファイルを変更すれば、このコピー操作をしなくても普通にビルドできます。
わざわざ持ってくるのは、リンク順を明示的に指定することでバイナリ一致をさせるためです。

c0w32.obj sysinit.obj bcbsmp.lib cp32mt.lib rtl.lib stlpmt.lib vcl.lib vcle.lib vclx.lib

BCBのバグのため、BCBのヘッダファイル shlobj.hpp を変更しないとコンパイルが通りません。以下の行をコメントアウトして下さい。
ヘッダをいじるのが嫌いな方は他の方法もあるようですので、探してみて下さい。

struct FVSHOWINFO;
struct FOLDERSETTINGS;
struct DESKBANDINFO;
struct SHELLFLAGSTATE;
typedef FVSHOWINFO *PFVShowInfo;
typedef FVSHOWINFO  TFVShowInfo;
typedef FOLDERSETTINGS *PFolderSettings;
typedef FOLDERSETTINGS  TFolderSettings;
typedef DESKBANDINFO *PDeskBandInfo;
typedef DESKBANDINFO  TDeskBandInfo;
typedef SHELLFLAGSTATE *PShellFlagState;
typedef SHELLFLAGSTATE  TShellFlagState;

RichTextViewはコンポーネントとして使われているようです。HogeTextViewから若干変更されているようで、6.6/7.0/7.1で同じ物を使っているようです。
本体コンパイル時に使われるRichTextView.hppは自動生成のままだと通らないので、変更したものが各ディレクトリに入っています。

改変チェック等のため、出てきたexeはそのままではまともに動きません。チェックデジットの生成プログラムは入っていません。

オリジナルの配付版はパックされていますので、単純に比較しても一致を確かめることはできません。
比較確認方法は各自考えて下さい。



製作:算譜職人