Re: [討論] tmi2_v3_改

作者: laechan (揮淚斬馬雲)   2014-06-10 07:22:37
※ 引述《happyhero (無用)》之銘言:
: 3.這個比較困難 不過我記得早期的Es2lib 或是國外的DSlib
: 裡面都有個intermud的系統
: 同一個mudlib架設的mud之間可以互相通訊
: 使用mudlist可查詢到所有mud的IP跟Port
: 可直接連線進入對方mud裡
: (Tmi2裡面好像也有類似的程式碼 但不知如何運作)
這我不是很熟呢,不過應該核心檔包括底下
/adm/daemons/channels.c
/adm/daemons/network/I3.c
/adm/daemons/network/某些被改成 .old 的檔
/adm/daemons/network/I3/ (Intermud 相關目錄)
/adm/etc/與上面有關的檔
sanc 以前曾用同一份 driver、同一份 mudlib,架過 port 不同的
兩個 mud (玩家區與巫師區),那個時候是透過像 gwiz 等指令,做
兩邊溝通的。
其中 /adm/daemons/network/I3.c 是最核心的東西,intermud 相
關的資料都是被 I3.c 所儲存,它以 private 宣告了非常多的函數
所以也不好 call 來做一些測試。
可是我們可以修改它。
static object router_socket, oob_socket, debugger;
static mapping services;
static int debug_level;
static int bootflag; // Used to recognize the first channel list we get.
int router_password, mudlist_id, chanlist_id;
mapping mudlist, chanlist;
void create(){
if(sizeof(get_dir(I3_SAVE_FILE))) restore_object(I3_SAVE_FILE);
bootflag=1;
setup_services();
.
.
}
update I3.c 時它會呼叫上面的函數。
void setup_services(){
mixed dir;
string name;
int i;
services = ([]);
#ifdef I3_SERVICE_DETECT
dir = get_dir(I3_MODULES);
for(i=0;i<sizeof(dir);i++){
sscanf(dir[i],"%s.c", name);
if(name) services += ([ name : 1 ]);
}
#endif
services += I3_SERVICES;
return;
}
到這裡大致就可猜測,services 儲存的東西就類似底下
> ls
Path: [/adm/daemons/network/I3]
2 ChangeLog 7 channel.060596 1 locate.c
2 auth.c 9 channel.c* 4 tell.c*
4 channel-0505.c 2 finger.c 3 who.c*
services = (["who":1, "tell":1, "finger":1 ,.....])
我的意思就是說,你想知道一份系統檔是幹嘛的,就先看它的
create 做些什麼,然後因為你有權限可以改系統檔,自然就可
修改它,比方內建一些方便你讀取資料的函數,這樣自然就不
會受到 private 的限制,可自由讀取其資料。
然後透過讀出來的資料再去看相對映的函數內容,你就會知道
它是幹嘛用的。
那因為這不是我早期想做的東西而且我也不熟,所以我會等我
有空時再研究。(總之就是現在沒啥空)
> ls
Path: [/adm/etc]
2 ChangeLog 3 groups
1 DEADJOE 3 groups.bak
79 I3.o
你可以輕易發現 I3.o 檔相當龐大,但是在 win 下用記事本等
相關軟體很輕易可以打開它,透過撰寫適當的物件,也能輕易地
載入並解析它。
應該要懷疑的是,它到底是透過人工建的,還是 tmi mud 之間
透過 I3 相互溝通後相互建立的?
Laechan

Links booklink

Contact Us: admin [ a t ] ucptt.com