败军之将,滚回了家

就这么带着浑身的伤回家了,很少伤的这么彻底,即便是那个跑回家的五一。这周的心情很差,连最后两门必修都没怎么看,不想看,也看不进去。人倒霉的时候那不是一般倒霉,打不到车,飞机晚点3小时,我不敢想象再倒霉点会怎样?洗澡时,躺在地上,任水浇在身上,精疲力尽。

那个悲剧的周一,终于发现自己其实败得很彻底,以前还可以安慰自己有机会,现在再安慰自己就是阿Q了。当然,那个时候有点冲动,自己无非是一个被利用的傻逼。当然,当傻逼不要紧,最恶心的是你以为别人不知道你傻逼,结果天下人都知道你傻逼,还不告诉你。冷静想想,其实也许不会这么糟糕,但是境况肯定不佳,至少远不如想象的。

不知道下一步该干啥,是继续当傻逼相信傻人有傻福?还是早点收拾背包滚蛋?

Posted in 随便写写 | Tagged | Leave a comment

SSD6-Exercise 3解答

这题主要是对malloc的封装,实现内存分配错误的debug,主要思想是搞一个双向链表来记录内存分配,题干请问Google,下面是个人解答:
[code=c]

#include <stdlib.h>

#include <string.h>

#include "debugmalloc.h"

#include "dmhelper.h"

#include <stdio.h>

/* My own data structures */

typedef struct mem{

int checksum;

size_t size;

char *filename;

int lineno;

int headerFence;

void *ptr;

int footerFence;

struct mem *next;

struct mem *prev;

} MEM_BLOCK;

/* My own variable */

static size_t allocated = 0;

static MEM_BLOCK *heapsHead = NULL;

static MEM_BLOCK *heapsFoot = NULL;

/* My own function */

static MEM_BLOCK *freeBlock(void *ptr, char *filename, int lineno)

{

MEM_BLOCK *memBlock, *test;

int hasBeenFreed;

if(heapsHead==NULL) {

error(4, filename, lineno);

return NULL;

}

memBlock = heapsHead->next;

while(memBlock) {

if(memBlock->ptr==ptr) {

break;

}

memBlock = memBlock->next;

}

if(memBlock->checksum!=(memBlock->size | memBlock->lineno)) {

error(3, filename, lineno);

}

if(memBlock->headerFence!=0xDEADBEEF) {

errorfl(1, memBlock->filename, memBlock->lineno, filename, lineno);

}

if(memBlock->footerFence!=0xBAD12345) {

errorfl(2, memBlock->filename, memBlock->lineno, filename, lineno);

}

test = heapsHead->next;

hasBeenFreed = 1;

while(test!=NULL) {

if(test==memBlock) {

hasBeenFreed = 0;

}

test = test->next;

}

if(hasBeenFreed) {

error(4, filename, lineno);

}

allocated -= memBlock->size;

test = memBlock;

memBlock->prev->next = memBlock->next;

return test;

}

/* Wrappers for malloc and free */

void *MyMalloc(size_t size, char *filename, int linenumber) {

MEM_BLOCK *memBlock = (MEM_BLOCK *)malloc(sizeof(MEM_BLOCK));

memBlock->checksum = size | linenumber;

memBlock->size = size;

memBlock->filename = filename;

memBlock->lineno = linenumber;

memBlock->headerFence = 0xDEADBEEF;

memBlock->footerFence = 0xBAD12345;

memBlock->ptr = malloc(size);

memBlock->next = NULL;

memBlock->prev = NULL;

allocated += size;

if(heapsHead==NULL) {

heapsHead = (MEM_BLOCK *)malloc(sizeof(MEM_BLOCK));

heapsFoot = heapsHead;

}

heapsFoot->next = memBlock;

memBlock->prev = heapsFoot;

heapsFoot = memBlock;

//printf("sss=%p,ssss=%p\n", &(memBlock->ptr), memBlock);

return memBlock->ptr;

}

void MyFree(void *ptr, char *filename, int linenumber) {

MEM_BLOCK *memBlock = freeBlock(ptr, filename, linenumber);

//free(memBlock->filename);

free(memBlock->ptr);

free(memBlock);

}

/* returns number of bytes allocated using MyMalloc/MyFree:

used as a debugging tool to test for memory leaks */

int AllocatedSize() {

return allocated;

}

/* Optional functions */

/* Prints a list of all allocated blocks with the

filename/line number when they were MALLOC'd */

void PrintAllocatedBlocks() {

if(heapsHead!=NULL) {

MEM_BLOCK *current = heapsHead->next;

while(current) {

PRINTBLOCK(current->size, current->filename, current->lineno);

current = current->next;

}

}

}

/* Goes through the currently allocated blocks and checks

to see if they are all valid.

Returns -1 if it receives an error, 0 if all blocks are

okay.

*/

int HeapCheck() {

if(heapsHead!=NULL) {

MEM_BLOCK *current = heapsHead->next;

while(current) {

if(current->checksum!=(current->size | current->lineno)) {

PRINTERROR(3, current->filename, current->lineno);

return -1;

}

if(current->headerFence!=0xDEADBEEF) {

PRINTERROR(1, current->filename, current->lineno);

return -1;

}

if(current->footerFence!=0xBAD12345) {

PRINTERROR(2, current->filename, current->lineno);

return -1;

}

current = current->next;

}

}

return 0;

}

[/code]

Posted in C | Tagged , , , , , | Leave a comment

SSD6-Exercise 2解答

这题比较有趣,是用位操作等基本运算符实现逻辑操作,基本上算是数学题,下面贴解答,具体题目请问Google

[code=c]

/*

* bitAnd - x&y using only ~ and |

*   Example: bitAnd(6, 5) = 4

*   Legal ops: ~ |

*   Max ops: 8

*   Rating: 1

*/

int bitAnd(int x, int y) {

return ~(~x|~y);

}

/*

* bitOr - x|y using only ~ and &

*   Example: bitOr(6, 5) = 7

*   Legal ops: ~ &

*   Max ops: 8

*   Rating: 1

*/

int bitOr(int x, int y) {

return ~(~x&~y);

}

/*

* isZero - returns 1 if x == 0, and 0 otherwise

*   Examples: isZero(5) = 0, isZero(0) = 1

*   Legal ops: ! ~ & ^ | + << >>

*   Max ops: 2

*   Rating: 1

*/

int isZero(int x) {

return !(x|0);

}

/*

* minusOne - return a value of -1

*   Legal ops: ! ~ & ^ | + << >>

*   Max ops: 2

*   Rating: 1

*/

int minusOne(void) {

return ~0;

}

/*

* TMax - return maximum two's complement integer

*   Legal ops: ! ~ & ^ | + << >>

*   Max ops: 4

*   Rating: 1

*/

int tmax(void) {

return ~(~0<<31);

}

/*

* bitXor - x^y using only ~ and &

*   Example: bitXor(4, 5) = 1

*   Legal ops: ~ &

*   Max ops: 14

*   Rating: 2

*/

int bitXor(int x, int y) {

return ~(~(~x&y)&~(x&~y));

}

/*

* getByte - Extract byte n from word x

*   Bytes numbered from 0 (LSB) to 3 (MSB)

*   Examples: getByte(0x12345678,1) = 0x56

*   Legal ops: ! ~ & ^ | + << >>

*   Max ops: 6

*   Rating: 2

*/

int getByte(int x, int n) {

return (x>>(n<<3))&0xff;

}

/*

* isEqual - return 1 if x == y, and 0 otherwise

*   Examples: isEqual(5,5) = 1, isEqual(4,5) = 0

*   Legal ops: ! ~ & ^ | + << >>

*   Max ops: 5

*   Rating: 2

*/

int isEqual(int x, int y) {

return !(x^y);

}

/*

* negate - return -x

*   Example: negate(1) = -1.

*   Legal ops: ! ~ & ^ | + << >>

*   Max ops: 5

*   Rating: 2

*/

int negate(int x) {

return ~x+1;

}

/*

* isPositive - return 1 if x > 0, return 0 otherwise

*   Example: isPositive(-1) = 0.

*   Legal ops: ! ~ & ^ | + << >>

*   Max ops: 8

*   Rating: 3

*/

int isPositive(int x) {

return !((x>>31)&1)&!!x;

}

[/code]

Posted in C | Tagged , , | Leave a comment

霍炬:百度、Google和谷歌的那些事

孙云丰的言帘卷西风论是无法自圆其说的。一方面,他认为Google不是人薄雾浓云愁永昼权斗士,只是个为了利润的市侩分子。另一方面,他又高举社会公平的大旗,宣称百度的道德感。这两者之间有明确的冲突。如果Google只为了利润,那么百度同样不应该有道德可言。

很久不在这个blog上写和技术无关的东西了,尤其不想写跟业界有关的东西,觉得太空,太忽悠,对别人没价值。但这次,我想写写这5,6年对google和百度的一些观察心得。这里面,这里面存在大量的个人推论,我并不能担保完全正确,请只当作是一次思想的碰撞。

这篇blog主要由我完成,Tinyfool提出了大量修改意见,亦有重要贡献。

1 google,不作恶,信息流动

众所周知,google的目标是"整合全球信息"。从另外一个角度看来,这可以看作加快信息流动。信息流动变快是有巨大的经济价值的。加速,始终是人类经济活动的主线,快即是价值。从蒸汽时代到现在,每一次让移动速度加快的方式都造成了人类巨大的变化,只不过,在蒸汽和机械的时代,加快的是人和货物的移动,信息时代加快的是信息的流动。

仔细观察,可以发现,很多事情不再需要实体物质的流动。比如,我们不再需要人去送一封信,而只需传递一封电子邮件。我们也不那么需要去订阅一份报纸送上家门,而只需要浏览门户网站。这是信息时代带来的改变。而Google所做的,是继续加快这种信息流动的速度,让人们需要的东西更快的呈现在眼前。

Google始终坚持Pagerank排名,除了惩罚作弊者,并未干预过任何排名。这是因为,信息的正常流动才会加速,加速信息是Google的价值,也带来巨大的经济价值。Google绝对不允许把广告插入到搜索结果中。否则搜索结果质量会下降->用户不满意->搜索量降低->广告点击降低,最终仍然造成收入下降。(后面我们会讲到百度完全不同的做法)

投放过Adwords的同学会发现,并非价格越高越好,就算单价非常高,如果匹配度很低,广告点击率就会很低。这样Google仍然会降低这种匹配的出现频率。这样就避免了在A在B的搜索结果中投放"我是B"的广告来误导用户。

在这个体系下,有用的东西就是有用的,信息流动会变快,Google会推动这种信息变的更快,没用的东西就是垃圾,会阻碍信息流动,Google就让他变的更慢,直到被放弃。

Don´t be evil 这句口号,可以理解为东欧出生的布林对人生的追求,也可以理解为Google商业利益的准则。因为,越是不作恶,越是让信息有序,正常的流动,给Google带来的实际利益也就越大。很多人认为这只是一句作秀的口号,事实上这是商业和个人追求的双重准则。

2 baidu,竞价排名,Google

百度显然看到了搜索的巨大价值,于是挤进了这个市场。我们且不论搜索质量,先看百度的利润来源。

百度同样有右侧广告(类似Adsense)和左侧排名。左侧排名就是所谓的竞价排名,这是百度的"创新"。竞价排名是百度收入的主要来源(注1)。

前面说过,竞价排名会干扰用户搜索体验,这大家都深有体验,某些热门关键词,百度前几页的结果都是竞价结果。那么为什么Google不敢这样做,而百度这样做就赚翻了呢?

昨天我在twitter上说过一句话:"adsense是促使信息有序流动并盈利,竞价排名是破坏信息流动并盈利。也难怪两个公司的人看问题截然不同。"

很多人有体验,如果你的搜索结果比较靠前,百度会有销售来找你做竞价排名,如果不做的话,很快你的搜索结果就骤减。这种"巧合"正好说明了阻碍信息流动也是可以盈利的。换言之,帮助别人照看孩子可以赚钱,威胁别人家孩子来收保护费也可以赚钱。

那么,按照前面的说法,阻碍信息流动的应该会被用户抛弃,在百度这边为什么情况相反呢?

搜索引擎的结果好坏实际很难评价,通常来说,"好10%"是完全没有意义的。这在这个市场上反复被证实,仅仅让搜索结果比对方好10%,或差10%,不会对用户体验影响太大。第二梯队中的搜狗,有道,搜索结果未必真的比百度差多少,但无论如何也无法翻身。同样的竞争也发生在了Google,Bing,Yahoo之间。换言之,搜索引擎产品是一种先入为主的产品。

在百度起家的年代,Google遭遇了最严重的屏蔽。大家应该都有体验,在大公司内基本无法正常访问Google。我们且不去讨论这种屏蔽的始作俑者是否是百度(无论百度是否加快了这种行为,最终的结果也必然发生)。那几年,又正好是中国互联网用户增长最快的年代(注2)。大量的新互联网用户直接成为了百度的用户。

搜索引擎市场上,"获得第一批用户"是至关重要的。

比较百度和Google的产品和收购策略,百度通常收购能带来巨大流量的产品,包括hao123,天空软件站等等。而Google收购的通常是具有独特的技术,可产生独特数据的产品,比如Analytics,blogger。

百度的主要企业运营行为是围绕"获得第一批用户"的。这些方法包括:工具条,hao123,和软件下载站合作等等。Google被屏蔽看作这种行为的反向手法,无论是否百度造就的,至少这个结果导致了百度获得了更多的第一批用户。

在一个基本没有竞争对手的市场上,百度可以"挟流量以令诸侯",这时候,他破坏一部分信息正常流动也不会造成太严重的后果。因为用户毫无比较。

Google的铁杆用户分为两类。一类是早期用户,这部分用户用过Google,也用过百度。有明确的比较和鉴别能力。他们最终选择了Google。另外一类是专业用户,他们真的发现百度找不到他们需要的东西。这时候Google对比百度的优势大大增加,到达了用户满意程度的临界点,于是这部分用户也选择了Google。

在中国互联网上,大部分用户偏重娱乐。这些用户很难分辨Google和百度的区别。甚至他们会觉得百度更好一些,因为百度提供了方便无比的MP3搜索。他们一旦先尝试了百度,那么就会留下,继续成为百度的用户。这就是我们今天看到的样子。

3 谷歌做了什么

2006年,Google决定开设中国办公室,并命名为谷歌。这是Google创始以来,最大胆,也是最小心的尝试。他们从来没有过试图进入一个需要过滤某些内容的国家(如前所述,这是阻碍信息流动,同时也背叛了Google的价值观)。

我们可以从一些细节看到Google的小心翼翼。比如,Google.cn是没有Google Account的。用户不能注册,也就没有密码,因此也就没有泄密之忧。后来有人嘲笑谷歌音乐可以用各种帐号登录,但就是不能用Google Account登录。所有需要登录的Google服务都没有进入中国。包括Gmail,Gtalk,Blogger等等等。

Google从进入中国那一天,就给自己设置好了底限。这种底限,就是李开复所说的"总部压力"。

李开复的谷歌,是谷歌,绝不是Google。是一个像百度的外企。

3个字可以来概括谷歌几年的工作:"倒流量"。倒流量的工作由一系列的合作(迅雷,sina,天涯,265)完成。这和Google的传统做法完全不同,Google几乎不去主动谋求流量,产品质量会解决所有问题。但谷歌必须谋求流量,一个急进,喜欢去大学讲座和写书的职业经理人,不会有创始人那样的耐心慢慢的守着一个市场。这让谷歌越来越像百度。

众所周知,用和对手一样的手段不可能打人比黄花瘦倒对手。

谷歌推出的最重量级产品,是谷歌音乐。这显然是看到了百度在MP3搜索上获得的好处,意图获得以娱乐为主的用户。当然,鉴于Google全球的品牌,这些音乐需要有版权。我不评价这个产品的好坏,但这显然和Google总部习惯格格不入。难道Google不知道去做一个音乐下载产品吗?难道Google不能去做一个下载站吗?总部不去做,只不过是因为这和价值观不符。

同样的价值观不符,还包括和天涯合作的来吧。之前说过,除了独特的数据,Google不会主动创造内容。以Google的胸怀,可以去索引百度贴吧和知道,并放在结果的显著位置,但没必要自己去模仿一个贴吧出来。这种竞争的水平太低了。

甚至,谷歌把中国访问Google.com的流量"劫持"到了Google.cn,以便提高自己的"占有率"。这件事让很多Google老用户恼火,Zola曾经在某个李开复参与的活动中举手提问,如何才能在中国正常的访问Google.com。

"倒流量"之后,谷歌的市场占有率有所上升。这是应该的。不过,新上升的占有率中,有多少是真正的搜索流量就不得而知了。正如百度搜索和贴吧等产品的比值是个秘密一样。

百度跟在Google后面,而谷歌跟在百度后面。

除了倒流量,谷歌也在"抓收入"。

投放过Adsense的朋友,大概会记得,Adsense的匹配质量越来越差,医疗方面的内容也越来越多。之前经常有人因为作弊被封掉帐号,后来再也没人说过自己的帐号被封。

我07年的两篇blog提到了这件事:

对不起,这是谷歌,不是google

去掉了blog上的google adsense

这两个特点都不是Google Adsense应有的特性。Google Adsense应该是匹配准,不干扰用户,且提供有用信息。时常读英文内容的人会时常看到Adsense广告的匹配相当精确,时而有点击的必要。

离开了这两个特点,可以把谷歌的广告看作一个大的广告联盟。这和拿了很多小网站的Banner的流量去找广告主谈价本质是一样的。在这种广告销售策略下,不需要匹配,不需要杜绝点击欺诈。最舍得花钱投这种广告的,无非是医疗,美容几类。

这几类是最赚钱的部分。不仅对于谷歌,对于百度,甚至对电视台都是一样的。

关于Adsense的故事,可以看看Tiny这篇文章 :我和Google Adsense那点故事

在这5年中,最常被记者们提起的"谷歌困境"就是"总部压力"。在我列出的这些部分,都已经触及到了Google价值观,所以Google必然不满。

有兴趣的同学可以对比一下2005~2010这5年,Google做了什么,谷歌做了什么。你会看到截然不同的项目。虽然结果看起来似乎都是:"市场份额增加,收入增加",Google在这几年,砸实了搜索的基础,扩大了搜索的内容来源和范围,把索引伸向了非数字内容,完成了地图/卫星图/Earth/街景等一系列重要产品,完成了在移动和3G方面的布局。谷歌做了什么呢?音乐,热榜,还有一个抄袭的输入法。

从谷歌存在的那天,我就写过一篇文章,核心意思是:要么把中国当作研发基地,投资,研发,但不运营,要么就干脆去印度开分公司。不幸言中。

4 孙云丰的观点

从商业价值和经济利益方面考量,都可以看出Google的不作恶,并不是作秀的口号。对于一个靠信息有序化赚钱的公司,必须要不作恶才行。百度正好相反,必须要作恶才行。

Google是幸福的,可以把商业价值建立在一个正确的价值观之上。这确实是可遇不可求的机会。很不幸,百度不行。

孙云丰的言帘卷西风论是无法自圆其说的。一方面,他认为Google不是人薄雾浓云愁永昼权斗士,只是个为了利润的市侩分子。另一方面,他又高举社会公平的大旗,宣称百度的道德感。这两者之间有明确的冲突。如果Google只为了利润,那么百度同样不应该有道德可言。

一方面,他宣称自己观点毫无错误,另一方面,他又删掉了自己的文章。有人说删贴未必是他自己的意愿。那么,作为宣称"有道德感"的百度员工,他不应该屈从别人的意见删掉自己认为正确的东西。作为百度高管,不应该允许百度公关去打电话要求别人删贴。

今天有一些百度员工为孙云丰辩护,这些说法同样无法自圆其说。试图证明百度是一家很好的公司,并不能证明孙云丰说的正确。正如纳粹德国有一支很有战斗力的军队,并不能证明希特勒是正义的。他们甚至自相矛盾,认为孙云丰对竞争对手恶言相对是正确的,其他人骂孙云丰是错。如果孙云丰代表自己骂了一家公司,该公司的用户有权回击。如果孙云丰代表百度,那他严重的缺乏职业道德。从任何角度,我也得不出百度员工和前员工的那些结论。

当然,我从来也没认为过百度是一家很糟糕的公司,甚至很多次认为百度正在逐渐变成一家有责任感的公司。遗憾的是,从高管到员工,似乎都没和这家公司一样完成这种转变。

不要以为这次事件打击了Google在中国的份额就幸灾乐祸,事实上,中国的互联网市场消失了。这和市场份额无关,和宏观形势有关。这个国家温情脉脉的互联网时代就此结束,就好比IT精英们看不起的那些传统生意人一样,慢慢被兼并,重组,消亡,剩下的那一点,会被扫倒利润微薄的边边角角。就好比,你家楼下菜市场那个可怜的菜农,守着那一点点收入,还要担心城半夜凉初透管。这是这个行业中每个人的悲剧。

Tinyfool说:百度的矛盾在于,Google的成功是他在全世界资本市场受宠的原因,但他们可能无时无刻不想google死掉会更好。在全世界范围内,这是不可能出现的,现在在中国出现了,他们真的会高兴吗?

Google给我们的最大价值,除了信息流动加速,就是信息永存。当我写完这篇blog,发布在我的blog上,按下"发布"之后的几分钟,各种蜘蛛就会蜂拥而至,把这篇文章复制若干次,存在这世界的各个角落。这文章即永存。无法被某个组织控制或删除,也无法阻止其流动。公关公司不行,某个国家政府也不行。孙云丰的言帘卷西风论,和百度其他员工的言帘卷西风论,也将和这篇文章一样,被永存,成为历史的一部分。这是我们热爱Google的原因。

现在,我要按下发布按钮了。

Posted in 转载 | Tagged , , , | 1 Comment

SSD6 Exercise1解答

题就不重复了,不知道自己去搜吧。

首先明确的是

1. start为dummy的低地址起第一字节,stride为第二字节

2. stride为大于等于2的正整数(因为是1字节的,故小于等于127),否则是个死循环

3. 如果dummy=1,那么start=1, stride=0,因此在process_keys12(&key1, &key2);这一行代码必然改变了dummy的值

好,有了以上三点认识,我们来看看process_keys12()的代码:

[code=c]

void process_keys12 (int * key1, int * key2) {

*((int *) (key1 + *key1)) = *key2;

}

[/code]

显然这语句的意思是key1的地址向后位移key1的值个单位,等于key2的值。因为我们必须改变dummy的值,按照所谓的activation record,dummy的地址在key1后3个单位(都在一个堆栈里),因此确定key1=3。key2的值无法确定,但是关系到两个重要参数start和stride的值。我们必须分析char * extract_message1(int start, int stride)函数,该函数如下:

[code=c]
char * extract_message1(int start, int stride) {
int i, j, k;
int done = 0;

for (i = 0, j = start + 1; ! done; j++) {
for (k = 1; k < stride; k++, j++, i++) {

if (*(((char *) data) + j) == '\0') {

done = 1;

break;

}

message[i] = *(((char *) data) + j);

}

}
message[i] = '\0';
return message;
}
[/code]

我们分析如下:

1. 内层循环结束后外层循环将j+1,而不改变i值。也就是说,必然每个1个单位取stride-1个字母

2. 对于每个整数而言,没字节顺序是相反的

3. 已知的5个字母的ascii码为0x46726f6d3a,显然,不是连续取5个,同样,也没有46726f6d这样4个连在一起的,而46726f的情况在data中有1组,在prologue中有两组(会取到prologue的前提是这三个数组在内存分配上是连续的,我们假设这样),如果是三个一组,那么在46726f后隔一字节必能找到6d3a的连续,但是没有说明也不是3个一组

4. 若两个一组,则必有4672xx6f6dxx3a这样的序列,因6d较少,只有4个,因此按6d分析。不论是两个一组还是一个一组,必有6dxx3a的序列,仅有data[3]=0x6F6D6F72中的6d符合条件,进而可以分析出是两个一组,因此可以计算出start=9, stride=3

5. 因此可以算出summy=key2=0x????0309,这里网上很多人用穷举算出key2=777这是不完全的,只要满足key2=0x????0309的整数都可以满足条件。

下面开搞key3和key4分析main剩下的代码:

[code=c]
if (key3 != 0 && key4 != 0) {
process_keys34(&key3, &key4);
}

msg1 = extract_message1(start, stride);

if (*msg1 == '\0') {
process_keys34(&key3, &key4);
msg2 = extract_message2(start, stride);
printf("%s\n", msg2);
}
else {
printf("%s\n", msg1);
}

[/code]

1. 经过process_keys34(&key3, &key4);一折腾,原来好好的msg1就变成NULL了

2. 首先想是不是process_keys34(&key3, &key4);把start和stride换了,导致上来msg1就是NULL,因为后面代码已经不能再修改start和stride了,也就是说必有0x0046这样的组合连在一起,因为start+1==0x00,start==0x46

3. 遗憾的是找不到这样的组合,那么我们换个思路:process_keys34(&key3, &key4);修改返回地址,直接到我们想去的地方,返回地址和key3地址的位置为-1因此不能得出key3=-1,下面算key4:

[code=shell]

#假设目标文件为decode

$ objdump -d decode > as.txt

[/code]

得到的as.txt就是我们程序的反汇编文件找到main我们需要的部分

[code=asm]

804871a: e8 cb fd ff ff       call   80484ea <process_keys34>

804871f: 8b 44 24 34           mov    0x34(%esp),%eax

8048723: 89 44 24 04           mov    %eax,0x4(%esp)

8048727: 8b 44 24 38           mov    0x38(%esp),%eax

804872b: 89 04 24             mov    %eax,(%esp)

804872e: e8 e3 fd ff ff       call   8048516 <extract_message1>

8048733: 89 44 24 20           mov    %eax,0x20(%esp)

8048737: 8b 44 24 20           mov    0x20(%esp),%eax

804873b: 0f b6 00             movzbl (%eax),%eax

804873e: 84 c0                 test   %al,%al

8048740: 75 3a                 jne    804877c <main+0x184>

8048742: 8d 44 24 24           lea    0x24(%esp),%eax

8048746: 89 44 24 04           mov    %eax,0x4(%esp)

804874a: 8d 44 24 28           lea    0x28(%esp),%eax

804874e: 89 04 24             mov    %eax,(%esp)

8048751: e8 94 fd ff ff       call   80484ea <process_keys34>

8048756: 8b 44 24 34           mov    0x34(%esp),%eax

804875a: 89 44 24 04           mov    %eax,0x4(%esp)

804875e: 8b 44 24 38           mov    0x38(%esp),%eax

8048762: 89 04 24             mov    %eax,(%esp)

8048765: e8 35 fe ff ff       call   804859f <extract_message2>

[/code]

也就是第一次调用process_key34和调用extract_message2之间的代码,第一次调用返回代码应为extract_message1,其地址为2e(忽略前面相同的部分),我们要转到的地址为65,因此key4=0x65-0x2e=0x37=55

这个值是根据你操作系统编译结果得来的,因此不同机器上不同,最后程序结果为:

From: CTE

To: You

Excellent!You got everything!

Posted in C | Tagged , , , | Leave a comment

这是怎样的一种感情

2010-01-15-1605012010-01-15-1605232010-01-15-1606322010-01-15-160701
2010-01-15-1605592010-01-15-1606102010-01-15-1607212010-01-15-1607312010-01-15-1607382010-01-15-160746

Posted in 随便写写 | Leave a comment

第一个写漂流本的男人

12:01 被电话铃声从睡梦中吵醒,漂流本到了。最快的速度穿好衣服,下楼签收。感谢若小素组织这次活动,感谢之前传递的Aki,好久没用笔写过字了……

很遗憾我去年5月才开始饭否生涯的,才甜蜜了不到两个月就悲剧了。记得那时作为互联网准从业者的我还没有用过微博,在twitter被挡在墙外面的情况下,google了一下国产微博,在饭否、嘀咕等众多微博中,我毅然选择了饭否。为啥?一见钟情吧。自此,开始了一段和饭否剪不断,理还乱的感情。

09年6月,注定是我十几年来最低谷的一个月。武汉闷热的天气,若干挂不得的必修课考试,身边已无可以倾诉的对象(尤其是半夜)。我开始养成在饭否上自言自语的好习惯,有人看到与否,有人回复与否都不重要。于是,饭否成了一位可以在任何时候听我说话的好朋友。

每当半夜被热醒的时候,我都会拿出手机上饭否抱怨一下;每当看不进去枯燥的课本时,我也会去饭否上逛一下;每当心情低落,无人倾诉时,我也会找到饭否促膝长谈。渐渐地,饭否成了我生活中重要的一部分,每天都习惯于闲下来的时候说两句或者随便看看。

悲剧的是好景不长,7月中旬饭否就被迫关闭了。开始时不愿相信这是政治问题,仍旧每天上网第一件事和最后一件事刷新饭否。可无奈的是,191天了,饭否依然没有回归的迹象。也曾试着去用其他微博,但是再也找不到当初那种感觉。我下定决心,我要等饭否。不论别人怎么说,我都决定等下去,也不论不久的将来有多远,我都会支持饭否,支持饭否团队,我们一起走下去!

在饭否时间不长,除了自己同学,就只认识了fighterxi一个人。饭否关闭前没和她要联系方式,以至于失去联络一段时间。后来靠着伟大的Google,找到了她N年前的博客和她们单位的论坛,给fighterxi发了封email,还很担心她还会不会看到。结果她还真看到了,后来才知道她也是碰巧才看到那封email的。很神奇,饭否保佑饭友们!

饭否,

不论不久的将来有多远,

我都等着你,

我坚信你会回来,因为有这么多深爱你的饭友!

Posted in 随便写写 | Tagged , , , , | 1 Comment

因为那一小撮人,我们究竟要付出多大代价?

越来越多的网站被挡在墙的另一边,而墙内关着的却总是无辜的网民。记得去年夏天实训时,和刘总讨论过墙到底应不应该存在。为什么要有墙?因为在互联网上有很多不利于社会安定的因素,单就这点来说,我赞同将这些信息隔离。

但遗憾的是,这些政治信息只是那么一点点而已,而为了隔离这一点点信息,无数优秀的网站被挡在了另一边,尤其对于IT工作者来说。像Blogger, WordPress等博客上都有大量的优秀技术文章,但是却因为一小撮不安好心分子,这些优秀的博客也被一同挡在墙外。

我不否认,很多中国人很冲动,很容易被利用。从百度“被黑”的还击来看,很多人就极其不理智。但是我相信,大多数人还是会很冷静的对待那些不良言帘卷西风论的。

很遗憾,这堵墙根本挡不住那一小撮人——现在跳墙术是尽人皆知的。相反,这堵墙挡住了一个正常的网民获取信息的来源。信息,已经逐渐成为了21世纪宝贵的财富之一。但是因为那一小撮人,我们获取信息的渠道要比世界其他国家的人窄得多。

我们为此付出的代价是不是大了点?当然,今天肯定是看不出我们究竟付出了多大代价。但是等到十年后,二十年后,等到墙内长大的一代真正接管了社会,我们会看到怎样的结果?

Posted in 随便写写 | Tagged , | Leave a comment

Google的葫芦里到底卖的什么药?

今天最震撼的新闻莫过于Google高层正在评估放弃大中华地区市场的可能性,这对于本来就风雨飘摇的大中华局域网来说,无疑是一个震撼的消息。官方称原因是1. 中国人薄雾浓云愁永昼权运动的Gmail被入侵2. 不愿意继续对搜索结果进行审核。

从原因上来看,都显得有些牵强。Google不是第一天来中国做生意了,中国是怎样一种情况Google怎么可能不知道。况且西方又不是第一次拿人薄雾浓云愁永昼权说事了,这应该只是借口。虽然Google一向奉行Do no evil原则,但是既然3年都已经走过来,现在才意识到自己违反原则未免太牵强。

我不相信有那家国际公司胆敢放弃大中华地区市场,这是一个潜力巨大的市场。虽然中国市场收入仅占Google全球收入的1%,但是在这拥有14亿人的土地上拥有影响力并不是坏事。即使是赔本赚吆喝,Google也绝对值得。在Google宣布了考虑退出中国市场的当天,Google的股价立刻下跌。这表明资本选择也排斥Google这么不明智的做法,相信Google不会拿自己的股价开玩笑。

也有人推测Google高层此举是对Google中国不满,这确实,谷歌中国确实是一家烂公司。无论在localization上还是研发上都没有什么建树。代表性产品谷歌拼音,在中国市场受到搜狗和QQ等输入法的排挤,并不受市场青睐。另外在Android的中文支持上,也远远落后于日本,到现在中文排序还没有什么解决方案。

李开复去年也辞去了大中华地区总裁的职务,由此可见谷歌中国境况确实不佳。在Google高度多元化扩张的今天,谷歌中国的无能确实应该令高层头疼。

很难想明白Google突然抽风的真正目的何在,还是要继续关注下文如何啊。

Posted in 业界 | Tagged , , | 2 Comments

国内注册顶级域名转移到国外

08年在榜域科技注册了这个顶级域名,结果后来榜域悲剧的倒闭了。业务全部转移到中狐网,当时因为已经记不清注册的数字ID,而且到期时间又长,也不确定是否要续费,所以就没有转到中狐。

明年这个域名就过期了,而且最近发现,个人用户在国内购买顶级域名比较麻烦,所以想把域名转移到国外去,我在godaddy.com上的帐户。在网上搜了一下,发现域名转移是件麻烦事,加上这又是伟大的负责人的中国,想把域名转出去,还是要费上一番力气。

因为榜域是万网的一个下级代理商,到ICANN注册是由万网包办的,所以whois的域名信息也显示注册商是万网。看一个人的博客说其实域名转移认证码就是域名密码,我是知道这个密码的,whois了一下,发现自己域名的状态是status:OK,这意味着并没有被域名注册商锁起来,因此理论上讲可以直接转。

于是登录万网的域名自助管理,将所有联系人的资料都改成自己的(这个很重要),尤其是域名管理员,因为转移域名时要给这个管理员的信箱发信。然后在GoDaddy上办理域名转移业务,花了我7.15美金,不过可以自动续费一年。过了一段时间,域名的管理员邮箱里就会收到GoDaddy发来的认证码,拿着这两个号码,到GoDaddy后台进行认证,然后会要求你输入Authorizen Code,就是原代理商给的认证码,一般是域名密码,填进去之后就等待转移完成。

第二天上午醒来,发现域名转移被原代理商驳回,没办法,看来万网不开口,这域名是没法转了。只好去骚扰万网客服,告诉他们我是在榜域注册的,而且榜域又倒闭了,现在没办法,想转移,怎么办?万网客服中午回复,告诉我榜域现在的业务已经转移给中狐了(还用你说),还给了我一个没有区号的电话,让我联系中狐做转移……没办法,只好重新提问,告诉他们我已经记不得在榜域的ID了,又没有找回功能,没办法转移到中狐了,这种情况你们万网就不能帮帮忙?10分钟之后万网客服又回复说榜域的域名所有权都在中狐,我必须找中狐才行,并对没有给我区号表示抱歉。

没办法,只好去翻以前注册榜域的邮箱,遗憾的是没翻到之前的数字ID。只好硬着头皮去骚扰中狐的客服,还好是个QQ的,邮件比较麻烦。告诉中狐客服我的情况,中狐客服告诉我只有两个办法,第一,将域名转移到中狐,以后在中狐续费和管理;第二,将域名转到万网,并且做域名转移。既然已经付给GoDaddy.com了7美刀,况且国内个人持有域名比较麻烦,于是决定转到万网。告诉中狐的客服QQ后,告诉他我已经记不得榜域的ID了。中狐的客服人员问了我的域名之后,帮我查到了之前的数字ID(TNND为什么中国的注册商全是数字ID,这怎么记住……)。告诉我用当初注册域名的邮箱给他们发一封邮件,写清楚原ID和在万网的ID,并且附上一张身份证的图片(必须是域名持有人的),就可以帮我转过去。迅速发邮件,不到2分钟,中狐的客服工作人员就告诉我已经转过去。中狐的效率以及客服的服务态度真是让我感动的痛哭流涕啊……不得不强烈的发自内心的由衷的感谢下中狐的工作人员!!!

那么好,现在至少已经有办法给域名续费了,转出就是和万网的拉锯战了。继续向万网的客服提问,询问转出手续。得知要下载一个申请表,填好后连同个人的身份证正反面复印件一起邮寄到万网的业务部去。他们在审核通过后会给我转移码的……

很好,下载打印填表,明天去快递,欲知后事如何,请关注更新

===========2010.01.26更新=======================

14号通过EMS将申请表以及身份证复印件寄到了万网的业务部,之后开始漫长的等待。18号接到万网武汉业务部的电话,核实信息,然后问为什么转,编了好多理由,最后说我实在用不起你们的服务,续费135一年,人家只要7美元,万网的工作人员也就同意了。第二天收到authorizen code,和域名密码一样,然后到GoDaddy.com重新提交申请,等待了一个星期之后,终于转移成功……

由此可见,只要耐得住性子,不断的骚扰客服,一定会成功。GoDaddy.com没有记录数限制,这点要比万网10条免费的好得多。

Posted in 随便写写 | Tagged , , , | 1 Comment