本文是在 上海淘米(Taomee)2007–2013 年网页 Flash 页游服务端真源码 里挖到的"工程师遗留物"合集——脏话命名、TODO/HACK、署名足迹、明文凭据、搞笑命名、业务吐槽、GM 后门、ASCII 艺术与传说注释。 所有引用均为逐字原文(GBK 乱码已用
iconv -f gbk还原),路径相对仓库根,行号经grep/Read实证。回总入口见 ../README.md;协议全景见 ./protocol.md;各模块「实际干啥」见 ./deep/ 与 ./modules/。
从八大主题里私心精选,每条:逐字原文 + 可点击源码链接 + 一句点评。
1. 把"版本号校验"命令字正经命名成 fuck
#define gf_fuck_version_check_cmd (0x0604 )gf/db/ser/src/proto.h:38 · 不是注释,是真·标识符,声明(Croute_func.h:773)、注册、实现三连贯穿,整条调用链都带着这个名字跑在生产环境。工程师对客户端版本校验的怨气直接焊进了协议号。
2. 紧挨着的"卖道具"命令叫 bitch
#define gf_bitch_sell_items_cmd (0x0605 )gf/db/ser/src/proto.h:40 · fuck 完 version check 接着 bitch 卖东西,连号 0x0604/0x0605 的"骂街二连",堪称协议表里的名场面。
3. team_id 字段后面连发三个"靠"
uint32_t team_id;//靠靠靠gf/gongfu_online/player.hpp:758 · 功夫派组队系统,一个普通字段后挂"靠靠靠"。多半是被组队逻辑折磨惨了,边写边骂。
4. 全公司万能 DB 口令:ta0mee
EXEC_MYSQL="mysql -uroot -pta0mee --skip-column-names -A"common-tools/linux/anticheat/trunk/query_ill/ref2/show_records_range:17 · taomee 的 leet 写法,root 账号 + 这把口令在仓库里出现 460+ 次,是淘米所有游戏 DB 的"万能钥匙"。(凭据已死,见下方免责声明)
5. 客户端↔在线服 DES 主密钥 >ta:mee<
#define DES_KEY ">ta:mee<"mole/online/proto.h:15 · 摩尔庄园 Flash 客户端与在线服报文加密的核心,8 字节,"" 的变形。功夫派 cache 服 GS_KEY 完全同款,印证全公司共用一套 session DES 体系。
6. 唯一一条外网真实邮箱口令(键盘对角线乱打)
mail.SetPassword("[口令已隐去]"); // 原文是一串键盘对角线乱打的明文common-tools/win/netstat-checker/code/SendMailDlg.cpp:87 · 网络诊断小工具把某真实外网邮箱的登录口令明文写进 MFC 源码(L86 SetLogin / L87 SetPassword)用于自动发诊断邮件,是全部泄漏里"外网真实账号+口令"的孤例。出于责任本文隐去邮箱与口令——它仍是"别把外网凭据写死在源码里"的最佳反面教材。
7. 工程师诚实自曝:"其实我也不知道这文件格式"
//skip file header (actually, I don't know the file format of index.dat)common-tools/win/netstat-checker/code/Dustman.cpp:167 · 清 IE 缓存的工具硬编码"跳过前 64 字节",并坦白"其实我也不知道 index.dat 的格式"。逆向靠猜 + 自曝家丑的诚实瞬间。
8. 服务器一崩,群发短信给 4 个真实手机号
`/home/kal/send_short_message/sendsms 150****1951,159****4486,137****1357,136****6625 "$core_file_cnt mole online core! @msg_arr"`;common-tools/linux/tools/core_detect/findcore_mole.pl:125 · 运维 kal 的脚本:摩尔在线服一崩,core 文件检测脚本就群发短信报警。脚本里有 4 个真实手机号,其中两个在多游戏脚本里反复出现(八成是当班 leader)。出于隐私本文把手机号打码——源码里是完整号码,这正说明当年报警直连个人手机的"人肉 on-call"。
9. 身份谜团:署名 jim,括号里却是 (xcwen)
* Author: jim (xcwen), jim@taomee.commole2/mole2_db/src/Citem_handbook.h:13 · 出现 300 次。配合同一功能 .h 署 xcwen、.cpp 署 jim 的证据,强烈暗示 jim 与 xcwen 是同一人——xcwen 是全仓最高频作者(322 次),还用私人 Gmail xcwenn@gmail.com,公司栏直接写 NULL。
10. fortune 语录:Torvalds 把它搞砸了 :-)
* Wirzenius wrote this portably, Torvalds fucked it up :-)
c/library/newbench/trunk/src/test/demo/res/linux.txt:7931 · 网络库 demo 资源里塞了个 fortune 语录文件,收录了 Linux 内核那句著名自嘲,被当 demo 数据顺手打包进源码树,多个 tag 版本都有同一份。
这套服务端代码整体相当"职业",硬核脏话稀少;真正有人味的命中高度集中。
| 原文 | 出处 | 点评 |
|---|---|---|
int gf_fuck_version_check(DEAL_FUN_ARG); |
Croute_func.h:773 | 脏话名做成正式成员函数声明,白纸黑字进头文件 |
FILL_CMD_WITHOUT_PRI_IN (gf_fuck_version_check), |
Croute_func.cpp:55 | 注册进命令分发表,生产环境真在跑这个名字 |
struct gf_bitch_sell_items_in_header{ |
proto.h:1440 | 连配套请求结构体都叫 gf_bitch_...,脏话渗透到数据结构层 |
// //莫名其妙的设定 |
angel_fight/matcher.cpp:147 | 把"等级超 25 压到 25"整段注释掉并标"莫名其妙的设定",对策划需求的无声抗议 |
//del empty box whatever |
other_active.cpp:190 | 删空盒子甩一个"whatever",一副"管它呢删了完事"的摆烂 |
* @brief 由于历史原因 ... 一些动物是不能养殖的 |
Cuser_farm_animal.cpp:284 | 经典甩锅句式"由于历史原因",这锅是祖传的 |
/*! god guard */ |
battle_svr/player.hpp:1599 | 一串 "god" 字段/关卡,GM 无敌测试模式的痕迹,自嘲式命名成"上帝" |
* 后面更改协议时要慎重 |
dbsvr/include/proto.h:3141 | 给后人的告诫:别乱动协议。能写下"慎重",通常意味着前面有人乱动过 |
随源码一起 shipped 的程序员情绪资源文件,还有《大话设计模式》戏说文——用"曹操反复改诗"比喻"客户反复改需求"——被当测试数据存进了 design_pattern.txt:32,是 2007 年中国程序员对甲方改需求的血泪共鸣。
| 原文 | 出处 | 点评 |
|---|---|---|
if (p_in ->attireid == 1351056) {//因为配表错误...商城积分放到了装扮表中 |
Croute_func.cpp:2366 | 配错懒得改表,代码里写死魔数 ID 绕过去 |
/*QA(singku) 这个地方可能导致BUG 先注释掉 |
pea/online/dbproxy.cpp:200 | 署名+"可能导致BUG"+"先注释掉",三连典型遗留 |
/* TODO(zog): 为方便用 1,2 这些小号测试, 暂时注释掉 */ |
seat.cpp:103 | zog 为拿小号测试把 NPC 校验 #if 0 掉,署名+动机俱全,最有人味 |
//15%概率掉落3色琥珀,活动结束后该代码注释掉 |
battle_svr/player.cpp:3649 | 活动期写死的爆率,留了句"活动后注释掉"——但代码还在 |
// 千万要记得加x权限 |
itl-node/src/node.cpp:472 | 部署陷阱:生成脚本忘了 chmod +x 就跑不起来,"千万"提醒后人 |
//今天不能删除 |
mole2_db/src/db_error.h:212 | 只写了"今天不能删除",没说明天能不能,半句话留无限遐想 |
/* 注意: == 对于浮点数不可使用, 这里无论如何也不能用 >= */ |
anticheat.c:534 | 反作弊里浮点比较的血泪经验,"无论如何也不能用 >=",显然踩过坑 |
/* BUG! TODO: send warning */ |
comm/channel.c:209 | 标了"BUG!"却只留 TODO 没发告警,连续三处同款 |
// 你可能注意到...不过我们只要1个,这没有问题 |
bt_beastai.cpp:1107 | 难得的对话体注释,预判读者疑惑并安抚"这没有问题",像在跟未来的你聊天 |
全仓署名头注极密集(
Author:去重 50+ 种)。下面挑最能拼出团队画像的精华。
| 原文 | 出处 | 点评 |
|---|---|---|
Author: xcwen (xcwen), xcwenn@gmail.com / Company: NULL |
boke/db/src/proto.h:13 | 全仓最高频作者(322 次),用私人 Gmail,公司栏写 NULL,草台味十足 |
Author: henry (韩林), henry@taomee.com |
mmtree-1.0.0/mmtree.cpp:13 | henry=韩林,基础库红黑树作者,基础设施层主力 |
Author: Jerryshao (邵赛赛), jerryshao@taomee.com |
mempool/mempool.cpp:13 | 小怪兽内存池作者,此人后来是知名大数据/Spark 工程师,含金量高 |
Author: spark (spark), zhezhide@163.com |
mole/register/inc/global.h:13 | 163 邮箱 zhezhide(疑似"这是谁的"谐音梗)写了摩尔注册服 |
CMAKE_HOME_DIRECTORY:INTERNAL=/home/ian/advert_fliter/src |
CMakeCache.txt:321 | 整个 CMake 构建缓存被打包泄漏,工程师 ian 的主目录暴露无遗 |
* Modify $Author: smyang $ |
pea/dbserver/proto.hpp:8 | SVN $Author$ 关键字把没写头注的文件真实提交者也供了出来 |
** Copyright 2004 Coon Xu. |
mole/dbsvr/logser/sql/a.c:20 | 摩尔(2008 立项)日志服里塞了份 2004 年的 MySQL demo,比公司还老的考古地层 |
⚠️ 重要免责声明⚠️ 以下全部是上海淘米 2007–2013 年的历史内网凭据 / 写死密钥,对应的服务器、数据库、邮箱系统 早已于 2013 年前后停服、不复存在;且这些内容 本就存在于公开泄漏的源码中。此处收录 仅作技术考古与安全教育,请勿用于任何实际系统的登录、解密或任何用途。它们对今天的任何在用系统都不是有效凭据。
| 原文 | 出处 | 点评 |
|---|---|---|
EXEC_MYSQL="mysql -uroot -pta0mee ..." |
show_records_range:17 | 万能口令 ta0mee,仓库出现 460+ 次,跨游戏复用 |
db_pass monster@24 |
monster/.../db_server.conf:34 | 小怪兽自成一派:口令=游戏名+机器尾号,暴露命名套路 |
$pwd ="xcwen142857\n"; |
findcore_db_user_jim.pl:35 | "姓名+走马灯数 142857"的个人 SSH 口令,人味十足 |
#define DES_KEY ">ta:mee<" |
mole/online/proto.h:15 | 摩尔在线服 DES 主密钥,复活项目硬依赖 |
LOGIN_DES_KEY "!tA:mEv," |
Libtaomee-0.7.5.tar.gz → libtaomee/project/constants.h:38 |
框架级登录票据主 key,影响所有游戏登录(在打包的 tar.gz 内,行号实证) |
const char VigWorker::sc_key[] = "<!Tv?3^/"; |
id_counter.cpp:39 | 图形验证码 ID 的 DES 密钥,一把 key 守整套验证码 |
mail.SetPassword("[已隐去]"); |
SendMailDlg.cpp:87 | 唯一一条外网真实邮箱口令(键盘对角线乱打)——出于责任已隐去口令与完整邮箱 |
sshpass -p "[已隐去]" ... gongfupai@27.131.221.xxx |
cptokaixin.sh:4 | 明文密码+关掉 host key 校验+公网 IP,一行集齐运维红线(口令/IP 已部分打码) |
#password=...md5(md5("11111"))... |
pea/tools/client/test.py:59 | 不止凭据,还泄漏登录口令加密契约:双重 MD5 |
无意泄漏的"案发现场快照":一个误提交的 coredump mole/dbsvr/ser/sql/core 里,strings 可读出当时运维者整份 SSH 会话环境变量(跳板机 IP、DB 主机、家目录、正在敲的 mysql 命令行)。
| 原文 | 出处 | 点评 |
|---|---|---|
buff_id="520" ... name="增加暴击99%" |
buff.xml:386 | 520(我爱你)给"暴击+99%";另有 1314(一生一世)给"眩晕",策划的浪漫私货 |
//囧蘑菇种子 |
Cuser_jy.cpp:147 | 道具直接叫"囧蘑菇",2010 年前后"囧"字梗的活化石 |
assert(!"impossible error! player not in map"); |
gongfu_online/cli_proto.cpp:424 · pea/online/cli_proto.cpp:109 | 用 assert(!"字符串") 当文案,"不可能的错误"——直到它真的发生,两游戏抄了同一句 |
//母猪仔怀孕 |
dbsvr/include/proto.h:1867 | "猪倌系统"协议号一本正经写"公母配对/怀孕/逗乐乐",养猪模拟的严肃感本身就好笑 |
void boot_log(int ok, int dummy, ...) |
4moledoudou/log.cpp:286 | 重点在 SVN 分支名 4moledoudou(for 摩尔豆豆),底层库按业务线开分支 |
#define TEST_NAME_51MOLE "test_51mole" |
netstat-checker/config.h:35 | 测试账号 test_ 前缀拼游戏代号,对应官网 51mole.com / 51seer.com |
sprintf(p_msg,"亲爱的主人,我已从你的餐厅中打工回来..."); |
street.c:886 | 宠物拉姆打工归来的撒娇文案,硬编码进 C 源码,简繁两版成对出现 |
敏感词库 tm_dirty.dat(作者 Ian)连"蛋疼[噗]"这种带颜文字尾巴的网络梗都收录,还专门屏蔽"客服""官方认证""GM""私服",暴露运营最怕的是"冒充官方行骗"而非单纯骂人。
| 原文 | 出处 | 点评 |
|---|---|---|
//策划安给的分数计算方式过于简单...都是一样的算法:w |
tetris.cpp:508 | 吐槽策划公式太弱智,几个分支全写成同一算法糊弄,末尾还带 vim 手滑误存的 :w |
/* TODO(zog): 匹配值到处都是, 但策划说不存在匹配值 ??? */ |
room_proto.cpp:472 | 代码到处是匹配值,策划口头说"不存在",程序员一脸问号写进 TODO |
/// ------- (乐翻翻) vip充值活动下架需要注释 ------- |
vip_impl.cpp:218 | 运营活动下架要靠程序员手动注释代码,运营节奏直接焊死在源码里 |
<Task id="1007" name="寻找偷懒的徒弟" ...> |
tasks.xml:909 | 任务名直接叫"寻找偷懒的徒弟",策划的自嘲式幽默(也可能是工位写照) |
/* 分为三个等级:【绝世美味】、【休闲食品】、【危险品!】*/ |
chris_cake.c:110 | 做蛋糕活动三档评价,最低档直接叫"危险品!",策划文案的黑色幽默 |
垃圾游戏 8 1 |
dirtyFilter/dat/c.t:426 | 把"垃圾游戏"这句玩家差评列入过滤词,自家产品被骂要被系统屏蔽,意外自黑 |
本仓的"GM 后门"主要不是单点彩蛋,而是一整套独立的 SU(Super User / 超级管理员 / 客服平台)协议族——客服后台可凭这套协议给任意玩家加装扮、改昵称、改任务、发邮件、加管理员。这是合法的运营/客服系统,但从今天看就是教科书级的"上帝接口"。
| 原文 | 出处 | 点评 |
|---|---|---|
//超级管理员 + SU_LOGIN_CMD (0xA001) |
dbsvr/include/proto.h:2303 | SU=Super User,摩尔有一整套 0xA00x 段"超级管理员"协议 |
#define SU_USER_ADD_ATTIRE_CMD (0x3294 ...) |
dbsvr/include/proto.h:3166 | 客服可给任意玩家发任意时装,等于一个刷物品接口 |
下面是2011年08月15日独立出来的客服协议...一个函数绑定到了两个协议号 |
dbsvr/include/proto.h:3138 | 罕见的"时间戳级"开发日志:把客服平台从游戏业务拆出来 |
if ((p->session->remote_ip & 0x0000FFFF) != 0xA8C0 ... |
main_login/proto.cpp:120 | 外网客户端被强制改 user_ip,内网(公司内部)放行可自带任意 IP——内网调试机可伪造来源 IP |
/*0-正常...4-使用外挂*/ |
gf_db.h:685 | 封号原因枚举,暴露当年客服处理的几大投诉类型(含"索要个人隐私") |
if (ip =="10.1.1.46") then ... elseif (ip =="10.1.1.134") |
batrserv/conf/config.lua:9 | 战斗服按机器内网 IP 写死分支选不同配置,开发机 IP 硬编码在 lua 里 |
| 原文 | 出处 | 点评 |
|---|---|---|
static const char version[] __initdata = "3g.1.1.0"; |
serverbench/.../main.c:15 | 版本前缀写死 "3g"(第三代框架),__initdata 段标记从 Linux 内核抄来,装得很像内核模块 |
const char *version_str="\033[1m\033[41mVERSION:2010-03-03\033[0m"; |
deluser_svr/version.h:25 | 用 ANSI 转义码让版本号在终端"加粗红底"高亮,纯粹的终端审美彩蛋 |
pagesize_init (); // ??? / tsc_init (); // ??? |
serverbench/.../main.c:62 | 连框架作者自己都不确定这两步在干嘛,诚实到可爱 |
// 此处乃声明,实际实现在data.cpp中 |
reload/reload.cpp:8 | 给一个 extern 配上文言味的"此处乃声明",工程师的小恶趣味 |
... // because php 5.2.2 to 5.2.5 is totally fucked up again |
sphinxapi.php:240 | 随 Sphinx 带进来的原作者怨念,带脏话带"again"双重暴击,全仓最直白 |
"http://www.51seer.com/dll/TaomeeLibraryDLL.swf" |
51Seer.cpp:37 | "51seer"=赛尔号早期域名(今 seer.61.com),网页 Flash 时代的活化石 URL |
早期口口相传的 baseline 有两处错 |
../README.md:23 | 仓库自己的考古札记:承认早期"口口相传"的目录对照表有错,本身就是一段民间考据传说 |
从这些彩蛋拼出的,是一支 2007–2013 年高速狂奔的页游团队:技术上颇有追求(自研网络框架学 Linux 内核写法、自建反作弊/红黑树/内存池基础库),却被无休止的运营活动和反复横跳的策划需求拖着边写边骂——脏话焊进协议号、活动爆率写死等"以后删"、客服"上帝接口"越长越大。安全意识则停留在那个年代:ta0mee 一把口令打天下、SSH 密码用"姓名+幸运数字"、coredump 误提交泄漏内网拓扑。但字里行间也满是人味:对后人"千万要记得"的血泪叮嘱、对自己代码"看起来很奇怪"的诚实自嘲、给宠物撒娇文案和"危险品!"蛋糕评价里的童趣。技术债与赤诚并存,正是那一代中国互联网工程师的真实底片。