曾梦想仗剑走天涯,看一看世界的繁华


[转贴]程序员的酸甜苦辣——告别Coding - []

偶平时很少转贴文章的,但是这篇来自CSDN BOLG上面的文章却是例外。好文章,值得一读,值得收藏。

======================================================================

毕业找工作时,我曾对朋友说:“程序员这个称谓,是一个荣誉。”过去的一切仿佛还在眼前,然而三天后,我就要告别程序员这个职业了。
将来,我或许还会偶尔写写代码自娱自乐,我还会保持着单词第一个字母大写的“职业病”。程序员,这普普通通三个字,凝聚着我一年多的激情和汗水,一年多的喜怒哀乐,一年多的酸甜苦辣,还有许多许多说不出的感情。


曾几何时,“搞技术”成了“木讷”的代名词。程序员,似乎更擅长和机器沟通,与人沟通的能力往往欠佳,于是,程序员的感情成为沙漠,辛酸也只能埋在心底。
在撒哈拉沙漠的一个部落,流传着许多关于水的传说,原因很简单,这里长期缺水。水源里,随处可见的感情贴、处女贴还有YY贴,恰恰反衬了程序员感情世界的空虚。我的一些同事,到了26岁还没有过感情经历,不能不说是一个遗憾。
其实,程序员并不是木讷,而是单纯,并不是无情,而是痴情。真正深厚的情感,是只可意会而不可言传的。如果说感情是水,那么程序员的感情,就如一潭深水,平静而深沉。


网上流传一篇很有意思的文章,调侃程序员和妓女“最大的共性是——得到快乐的同时,又得到了金钱”。时至今日,靠一个WPS打遍天下的神话已经一去不复返了,但是无可否认,程序员们最大的乐趣,往往还就是编程序。
金山招聘的广告词:“你想让自己写的程序运行在每一台电脑上吗?”我大学的专业是土木工程,放弃本专业的工作机会,进入了程序员的行列,正是因为对编程的喜爱,还有“让自己写的程序运行在每一台电脑上”的那种成就感。
程序员其实很容易满足,我们要的,就是那种被认可的成就感,还有那一点小小的虚荣。曾经外出测试,看着自己写的程序在用户的机器上运行,那一刻的心情,真可谓甘之如饴。


做软件开发苦,这早已经是IT行业公开的秘密。选择了程序员这个职业,就意味着要和无穷无尽的加班熬夜做伴,对身体和感情,都是一个考验。
遍观身边的同事,工作三年以上的,谁没有个颈椎病什么的?听华为的兄弟讲过一个真实的故事:在开发一个嵌入式项目的时候,一个同事白天7点上班,晚上11点回家,有时候甚至连续通宵,项目结束了,他的老婆也正式向他提出离婚了。
至于自己,短短一年多频繁加班,胃和颈椎先后向我亮出了黄牌,所幸头顶上尚未出现一根白发,看看四周环绕的地中海和白头翁,竟颇为自得。


巨大的压力和频繁的加班,让程序员成为了一个吃青春饭的职业。对于每一个程序员,35岁以后怎么办,甚至30岁以后做什么,都是一个辛辣的问题。
几个月以前我曾经在博客上发过一篇文章,题目是《叫我如何“踏实”——写给李可文》。社会是一个大环境,企业是一个小环境,当整个社会盛行虚浮之风,当整个行业失去方向,当程序员们对自己的未来没有一点方向感的时候,你又如何期待他们能够“踏踏实实”呢?
在水源,和YY贴并列的,是同样数量级的愤青贴。真正的愤青把“愤”藏在心里,努力踏实的做事情,因为他们相信自己的努力能够改善甚至改变现状;那些到处抱怨、宣扬“抵制日货”的,往往是对自己未来根本没有什么方向感的假愤青,他们用一些似是而非得的语言引起别人的注意,宣泄心中的不满,获取短暂的虚荣。
很遗憾,程序员中绝不乏大量假愤青的存在。
发泄是不能解决问题的,假愤青这种现象,是民族的悲哀,是社会的悲哀,更是软件行业的悲哀。
想要改变现状,只能靠自己的努力。不是不知道自己除了写程序还能做什么吗?那就背水一战去试试啊!不亲自尝试一下谁知道你还能做什么?

我深深爱着程序员这个群体,这是一群年轻、激越、善良而又单纯的人,能够成为这个群体中的一员,是我的荣耀。对,永远的荣耀!

三天后,我就不是程序员了。
告别Coding,是为了自己的梦想和追求,因为我发现依靠Coding,也许它们永远无法实现。就像上面说的,我要尝试一下就自己还能做什么。放弃程序员这个职业,是相信有舍才有得,我选择,我无悔。
感谢CSDN开发者论坛,在这里我认识了许多朋友,我为拥有你们的友谊感到骄傲。三颗星星,代表了大家对我的认可。我喜欢这里,我还会经常回来看看的!


Posted by monkeycz at 16:25 | Read more | Comments (0) | Trackback (0) | Edit |

新年的前夜 - []

新年的前夜

这一个年份
就像明知离别的情人
看见她逐渐逝去的身影
却使我倍感忧愁

新的那个年份
好像少女柔润的唇
好像严寒冰封的大街上
相拥的情侣
好像外面放着鞭炮
兴奋叫嚷的孩子们

她,就要来了!

鞭炮与雪花飞舞的屑
依稀记忆的路灯下
映着明媚的灯光和誓言
我回首的刹那
钟表的指针正指向
十二点

这是个
新年的前夜

 

草于2004年12月31日夜


Posted by monkeycz at 16:13 | Read more | Comments (0) | Trackback (0) | Edit |

新年快乐! - []
2004年马上就要过去了,迎来的是新的一年——2005年。我不会写这种的文章,也就只说一句:希望在新的一年里,大家都能够幸福,能够活得更好一些。
Posted by monkeycz at 22:37 | Read more | Comments (0) | Trackback (0) | Edit |

“电脑消磁圣手”的消磁“秘术” - []

“电脑消磁圣手”的消磁“秘术”

前言:
平安夜的晚上,在网上随处溜达,偶尔看到一款名叫《电脑消磁圣手》的软件,是某公司开发的(具体是什么公司大家自己去看吧,我就不说出来了,免得麻烦)。据软件中的说明“本系统一直在国外市场上销售,效果很好,最近把系统翻译成中文版,免费提供给国内的朋友使用。”,至于软件的作用,又有如下的说明:“本系统非常适合在电脑前长时间工作的人,能够高效的清除电脑产生的电磁波,对工作者的身体起到了保健的工作。本系统根据电脑产生的电磁波,自动产生融磁波,中和电脑产生的磁波。由于电脑在不停的释放电磁波,建议您每隔一个小时进行一次消磁工作。”听起来十分诱人,于是就down了下来把玩一番。最新版本好像是6。3版(升级了好多次了吧)。

试用:
下载下来的是一个压缩包,解开后只有一个可执行文件。运行一下,首先弹出了浏览器窗口,连向了一个网站(可能是软件公司的网站吧),随手关掉。软件的主界面倒是很简捷,最主要的就是“开始消磁”按钮。点击一下,出现了一个进度条在不断的前进,同时还有提示文本出现,就是这些“系统正在做消磁前的准备...”、“系统正在收集电脑的电磁波...”、“系统正在释放融磁电波...”、“系统正在释放融磁电波...”、“系统正在做最后的消磁工作...”。经过这样一番神秘的仪式之后,弹出一个对话框提示“融磁成功,已经成功中和电脑周围磁场?”刹那之间,我对作者的佩服如同滔滔江水连绵不绝,这可是项巨牛x的技术,只靠软件就可以进行消磁了,而且还是电脑周围的电磁波,不知道作者是否申请了专利。怀着最作者的无比崇敬和那份极度的神秘感,我飞快的的把软件给肢解了:)

分析:
检测一下,是用Delphi写的,没有加壳。用DeDe载入后,反编译“开始消磁”按钮点击事件对应的代码,复制如下:

0047FF28   53                     push    ebx
0047FF29   8BD8                   mov     ebx, eax
0047FF2B   33D2                   xor     edx, edx

* Reference to control TFrmRamMain.Panel2 : TPanel
|
0047FF2D   8B83FC020000           mov     eax, [ebx+$02FC]

* Reference to: controls.TControl.SetVisible(TControl;Boolean);
|
0047FF33   E80CA6FAFF             call    0042A544
0047FF38   B201                   mov     dl, $01

* Reference to control TFrmRamMain.Panel1 : TPanel
|
0047FF3A   8B83F0020000           mov     eax, [ebx+$02F0]

* Reference to: controls.TControl.SetVisible(TControl;Boolean);
|
0047FF40   E8FFA5FAFF             call    0042A544

* Possible String Reference to: '系统正在做消磁前的准备...'     ;提示文本,准备好了
|
0047FF45   BA7C014800             mov     edx, $0048017C

* Reference to control TFrmRamMain.Label3 : TLabel
|
0047FF4A   8B83F4020000           mov     eax, [ebx+$02F4]

* Reference to: controls.TControl.SetText(TControl;TCaption);
|
0047FF50   E807A7FAFF             call    0042A65C

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar  ;进度条开始动了
|
0047FF55   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
0047FF5B   E80489FDFF             call    00458864
0047FF60   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()                            ;核心代码?~~~~~!!!!!!牛x,这样就可以“中和电脑周围磁场”,佩服佩服~~~~~~
|
0047FF62   E8D1020000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar  ;进度条继续在动
|
0047FF67   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
0047FF6D   E8F288FDFF             call    00458864
0047FF72   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()                            ;休息一下,不知道从何方招来的神圣正在提我们消磁:)
|
0047FF74   E8BF020000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar  ;继续动
|
0047FF79   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
0047FF7F   E8E088FDFF             call    00458864
0047FF84   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()
|
0047FF86   E8AD020000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
0047FF8B   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
0047FF91   E8CE88FDFF             call    00458864
0047FF96   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()
|
0047FF98   E89B020000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
0047FF9D   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
0047FFA3   E8BC88FDFF             call    00458864

* Possible String Reference to: '系统正在收集电脑的电磁波...'
|
0047FFA8   BAA0014800             mov     edx, $004801A0

* Reference to control TFrmRamMain.Label3 : TLabel
|
0047FFAD   8B83F4020000           mov     eax, [ebx+$02F4]

* Reference to: controls.TControl.SetText(TControl;TCaption);
|
0047FFB3   E8A4A6FAFF             call    0042A65C

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
0047FFB8   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
0047FFBE   E8A188FDFF             call    00458864
0047FFC3   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()                             ;根据提示,这句应该是收集电磁波的代码。
|
0047FFC5   E86E020000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
0047FFCA   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
0047FFD0   E88F88FDFF             call    00458864
0047FFD5   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()
|
0047FFD7   E85C020000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
0047FFDC   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
0047FFE2   E87D88FDFF             call    00458864
0047FFE7   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()
|
0047FFE9   E84A020000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
0047FFEE   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
0047FFF4   E86B88FDFF             call    00458864
0047FFF9   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()
|
0047FFFB   E838020000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
00480000   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
00480006   E85988FDFF             call    00458864

* Possible String Reference to: '系统正在释放融磁电波...'
|
0048000B   BAC4014800             mov     edx, $004801C4

* Reference to control TFrmRamMain.Label3 : TLabel
|
00480010   8B83F4020000           mov     eax, [ebx+$02F4]

* Reference to: controls.TControl.SetText(TControl;TCaption);
|
00480016   E841A6FAFF             call    0042A65C

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
0048001B   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
00480021   E83E88FDFF             call    00458864
00480026   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()                             ;消磁的核心代码,这项技术大家可要记牢了,不可乱用,说不定作者申请专利了呢:)
|
00480028   E80B020000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
0048002D   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
00480033   E82C88FDFF             call    00458864
00480038   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()
|
0048003A   E8F9010000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
0048003F   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
00480045   E81A88FDFF             call    00458864
0048004A   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()
|
0048004C   E8E7010000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
00480051   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
00480057   E80888FDFF             call    00458864
0048005C   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()
|
0048005E   E8D5010000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
00480063   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
00480069   E8F687FDFF             call    00458864

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
0048006E   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
00480074   E8EB87FDFF             call    00458864
00480079   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()
|
0048007B   E8B8010000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
00480080   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
00480086   E8D987FDFF             call    00458864
0048008B   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()
|
0048008D   E8A6010000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
00480092   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
00480098   E8C787FDFF             call    00458864
0048009D   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()
|
0048009F   E894010000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
004800A4   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
004800AA   E8B587FDFF             call    00458864
004800AF   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()
|
004800B1   E882010000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
004800B6   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
004800BC   E8A387FDFF             call    00458864

* Possible String Reference to: '系统正在做最后的消磁工作...'
|
004800C1   BAE4014800             mov     edx, $004801E4

* Reference to control TFrmRamMain.Label3 : TLabel
|
004800C6   8B83F4020000           mov     eax, [ebx+$02F4]

* Reference to: controls.TControl.SetText(TControl;TCaption);
|
004800CC   E88BA5FAFF             call    0042A65C

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
004800D1   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
004800D7   E88887FDFF             call    00458864
004800DC   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()                              ;我就不说什么了吧:)
|
004800DE   E855010000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
004800E3   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
004800E9   E87687FDFF             call    00458864
004800EE   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()
|
004800F0   E843010000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
004800F5   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
004800FB   E86487FDFF             call    00458864
00480100   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()
|
00480102   E831010000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
00480107   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
0048010D   E85287FDFF             call    00458864
00480112   8BC3                   mov     eax, ebx

* Reference to : TFrmRamMain.Delay()
|
00480114   E81F010000             call    00480238

* Reference to control TFrmRamMain.ProgressBar1 : TProgressBar
|
00480119   8B83F8020000           mov     eax, [ebx+$02F8]

* Reference to: comctrls.TProgressBar.StepIt(TProgressBar);
|
0048011F   E84087FDFF             call    00458864
00480124   B8E8030000             mov     eax, $000003E8

* Reference to: system.@RandInt;
|
00480129   E86629F8FF             call    00402A94
0048012E   85C0                   test    eax, eax
00480130   6A40                   push    $40

* Possible String Reference to: '电脑消磁圣手'
|
00480132   B900024800             mov     ecx, $00480200

* Possible String Reference to: '融磁成功,已经成功中和电脑周围磁场?
|                                ?
|
00480137   BA10024800             mov     edx, $00480210

* Reference to TApplication instance
|
0048013C   A148284800             mov     eax, dword ptr [$00482848]
00480141   8B00                   mov     eax, [eax]

* Reference to: forms.TApplication.MessageBox(TApplication;PChar;PChar;Longint):Integer;
|
00480143   E89895FCFF             call    004496E0                  ;大功告成,消磁成功!!!
00480148   33D2                   xor     edx, edx

* Reference to control TFrmRamMain.Panel1 : TPanel
|
0048014A   8B83F0020000           mov     eax, [ebx+$02F0]

* Reference to: controls.TControl.SetVisible(TControl;Boolean);
|
00480150   E8EFA3FAFF             call    0042A544
00480155   B201                   mov     dl, $01

* Reference to control TFrmRamMain.Panel2 : TPanel
|
00480157   8B83FC020000           mov     eax, [ebx+$02FC]

* Reference to: controls.TControl.SetVisible(TControl;Boolean);
|
0048015D   E8E2A3FAFF             call    0042A544

* Reference to TFrmAbout instance
|
00480162   A148264800             mov     eax, dword ptr [$00482648]
00480167   8B00                   mov     eax, [eax]
00480169   8B10                   mov     edx, [eax]

* Reference to method TFrmAbout.ShowModal()
|
0048016B   FF92D8000000           call    dword ptr [edx+$00D8]         ;关于窗口露一小脸,是介绍公司的。如此精深的技术,倘不见一下那只下蛋的鸡,岂不是太可惜了么:)
00480171   5B                     pop     ebx
00480172   C3                     ret

上面就是“消磁圣手”的核心代码。逆向了这么重要的代码心里甚是不安。软件的开发公司千万不要告我啊!不过已经看了,再多看一点也无妨吧。谁知这一看不要紧,又发现了软件作者的体贴之处,请看下面的代码,是窗体创建事件对应的代码:

004802F8   55                     push    ebp
004802F9   8BEC                   mov     ebp, esp
004802FB   33C9                   xor     ecx, ecx
004802FD   51                     push    ecx
004802FE   51                     push    ecx
004802FF   51                     push    ecx
00480300   51                     push    ecx
00480301   51                     push    ecx
00480302   51                     push    ecx
00480303   51                     push    ecx
00480304   33C0                   xor     eax, eax
00480306   55                     push    ebp

* Possible String Reference to: '檫0?脬嬪]?
|
00480307   6808044800             push    $00480408

***** TRY
|
0048030C   64FF30                 push    dword ptr fs:[eax]
0048030F   648920                 mov     fs:[eax], esp
00480312   8D55F0                 lea     edx, [ebp-$10]

* Reference to TApplication instance
|
00480315   A148284800             mov     eax, dword ptr [$00482848]
0048031A   8B00                   mov     eax, [eax]

* Reference to: forms.TApplication.GetExeName(TApplication):AnsiString;
|
0048031C   E82F97FCFF             call    00449A50                          ;Who am I?
00480321   8B45F0                 mov     eax, [ebp-$10]
00480324   8D55F4                 lea     edx, [ebp-$0C]

* Reference to: Unit_00406FD0.Proc_00408110
|
00480327   E8E47DF8FF             call    00408110
0048032C   8B45F4                 mov     eax, [ebp-$0C]
0048032F   50                     push    eax
00480330   8D55E8                 lea     edx, [ebp-$18]

* Reference to TApplication instance
|
00480333   A148284800             mov     eax, dword ptr [$00482848]
00480338   8B00                   mov     eax, [eax]

* Reference to: forms.TApplication.GetExeName(TApplication):AnsiString;
|
0048033A   E81197FCFF             call    00449A50
0048033F   8B45E8                 mov     eax, [ebp-$18]
00480342   8D55EC                 lea     edx, [ebp-$14]

* Reference to: Unit_00406FD0.Proc_004080DC
|
00480345   E8927DF8FF             call    004080DC
0048034A   8B55EC                 mov     edx, [ebp-$14]
0048034D   8D45FC                 lea     eax, [ebp-$04]
00480350   59                     pop     ecx

* Reference to: system.@LStrCat3;
|
00480351   E8CA39F8FF             call    00403D20
00480356   B201                   mov     dl, $01

* Reference to class TRegistry
|
00480358   A174F14700             mov     eax, dword ptr [$0047F174]

* Reference to: Unit_0047F114.Proc_0047F274
|
0048035D   E812EFFFFF             call    0047F274
00480362   8945F8                 mov     [ebp-$08], eax
00480365   33C0                   xor     eax, eax
00480367   55                     push    ebp
00480368   68DE034800             push    $004803DE

***** TRY
|
0048036D   64FF30                 push    dword ptr fs:[eax]
00480370   648920                 mov     fs:[eax], esp
00480373   BA02000080             mov     edx, $80000002
00480378   8B45F8                 mov     eax, [ebp-$08]

* Reference to: Unit_0047F114.Proc_0047F314
|
0048037B   E894EFFFFF             call    0047F314
00480380   B101                   mov     cl, $01

* Possible String Reference to: '\SOFTWARE\Microsoft\Windows\Current           ;这个地方好熟悉,为什么我的毒霸不报警呢:)
|                                Version\Run\'
|
00480382   BA1C044800             mov     edx, $0048041C
00480387   8B45F8                 mov     eax, [ebp-$08]

* Reference to: Unit_0047F114.Proc_0047F378
|
0048038A   E8E9EFFFFF             call    0047F378
0048038F   84C0                   test    al, al
00480391   7435                   jz      004803C8
00480393   8D4DE4                 lea     ecx, [ebp-$1C]

* Possible String Reference to: 'JrRClean'
|
00480396   BA54044800             mov     edx, $00480454
0048039B   8B45F8                 mov     eax, [ebp-$08]

* Reference to: Unit_0047F114.Proc_0047F540
|
0048039E   E89DF1FFFF             call    0047F540
004803A3   8B45E4                 mov     eax, [ebp-$1C]
004803A6   8B55FC                 mov     edx, [ebp-$04]

* Reference to: system.@LStrCmp;
|
004803A9   E8363AF8FF             call    00403DE4
004803AE   7410                   jz      004803C0
004803B0   8B4DFC                 mov     ecx, [ebp-$04]

* Possible String Reference to: 'JrRClean'
|
004803B3   BA54044800             mov     edx, $00480454
004803B8   8B45F8                 mov     eax, [ebp-$08]

* Reference to: Unit_0047F114.Proc_0047F514
|
004803BB   E854F1FFFF             call    0047F514
004803C0   8B45F8                 mov     eax, [ebp-$08]

* Reference to: Unit_0047F114.Proc_0047F2E4
|
004803C3   E81CEFFFFF             call    0047F2E4
004803C8   33C0                   xor     eax, eax
004803CA   5A                     pop     edx
004803CB   59                     pop     ecx
004803CC   59                     pop     ecx
004803CD   648910                 mov     fs:[eax], edx

****** FINALLY
|
004803D0   68E5034800             push    $004803E5
004803D5   8B45F8                 mov     eax, [ebp-$08]

* Reference to: system.TObject.Free(TObject);
|
004803D8   E8EF29F8FF             call    00402DCC
004803DD   C3                     ret


* Reference to: system.@HandleFinally;
|
004803DE   E90931F8FF             jmp     004034EC
004803E3   EBF0                   jmp     004803D5

****** END
|
004803E5   33C0                   xor     eax, eax
004803E7   5A                     pop     edx
004803E8   59                     pop     ecx
004803E9   59                     pop     ecx
004803EA   648910                 mov     fs:[eax], edx

****** FINALLY
|

* Possible String Reference to: '嬪]?
|
004803ED   680F044800             push    $0048040F
004803F2   8D45E4                 lea     eax, [ebp-$1C]
004803F5   BA05000000             mov     edx, $00000005

* Reference to: system.@LStrArrayClr;
|
004803FA   E87936F8FF             call    00403A78
004803FF   8D45FC                 lea     eax, [ebp-$04]

* Reference to: system.@LStrClr(String;String);
|
00480402   E84D36F8FF             call    00403A54
00480407   C3                     ret


* Reference to: system.@HandleFinally;
|
00480408   E9DF30F8FF             jmp     004034EC
0048040D   EBE3                   jmp     004803F2

****** END
|
0048040F   8BE5                   mov     esp, ebp
00480411   5D                     pop     ebp
00480412   C3                     ret

上面的代码我就不用多解释了吧?要知道电磁波辐射在开机的时候是最强的,所以“体贴”的作者就把“消磁圣手”加入了启动项中,这样每次启动的时候就能够自动消磁了,真是“人性化”阿~~~~~~当然,每次启动的除了“消磁圣手”,还有宣传的网站:)

只是苦了我又要清理启动项了。为什么98的注册表编辑器不能保存上一次打开的位置阿。

结语:
上面大部分都是废话,能看到这个地方辛苦了大家,真是不好意思。
也许这只是一个开玩笑的程序,或者是有些精深的地方我没有领悟到。没有别的意思,只是闲得无聊。也希望作者没有别的意思,还希望作者在下一版升级的时候加入“取消开机启动”的选项。
权当一笑吧,呵呵~~~~~~~~~~~~

 


monkeycz于2004年平安夜
2004年12月24日


Posted by monkeycz at 11:06 | Read more | Comments (0) | Trackback (0) | Edit |

OllyMachine Script之易格式代码“直奔主题” - []

////////////////////////////////////////////////////////////////////////////////////
//
//  FileName    :   JmpECode.oms(直接转跳到易格式可执行文件的原体起始代码)
//  Author      :   monkeycz
//  Date        :   2004-11-28 23:16
//  Comment     :   搜索易格式所在的节,找到易格式数据头信息,取m_nStartCodeOffset,
//                  计算出易格式代码的起始位置,下断点。
//
////////////////////////////////////////////////////////////////////////////////////

EOB Break1

mov reg04,0x400000                        //ImageBase,需要自行修改
invoke Search, reg04, "2E65636F64"        //查找易格式所在节
cmp reg00,-1
je nofind                                 //没有找到:(
mov reg01,reg00

add reg01,0x0C                            //到VirtualAddress处
invoke ReadMemLong,reg01,0x04             //读取易格式的VirtualAddress
mov reg05,reg00
add reg05,reg04                           //当前易格式所在的节内存中的偏移
mov reg03,reg05
add reg03,60                              //到m_nStartCodeOffset处
invoke ReadMemLong,reg03,0x04             
add reg05,reg00                           //计算出易格式代码的起始位置
invoke bp,reg05
run
halt

Break1:
invoke bc, eip
jmp target

nofind:
invoke msg,"No find the E code!"
halt

target:
invoke msg,"Look,this is target:)"
halt


Posted by monkeycz at 09:34 | Read more | Comments (2) | Trackback (0) | Edit |

OllyMachine Script之Dump易格式原体 - []

///////////////////////////////////////////////////////////////////////////////
//
//  FileName    :   DumpECode.oms(把易格式原体从PE文件中分离出来)
//  Author      :   monkeycz
//  Date        :   2004-11-28 21:36
//  Comment     :   搜索易格式所在的节,然后dump出易格式原体。由于没有经过装载器
//                  重定位,dump出来的原体也不需要修复重定位信息。
//
///////////////////////////////////////////////////////////////////////////////


mov reg04,0x400000                        //ImageBase,需要自行修改
invoke Search, reg04, "2E65636F64"        //查找易格式所在节
cmp reg00,-1
je nofind                                 //没有找到:(
mov reg01,reg00

add reg01,0x0C                            //到VirtualAddress处
invoke ReadMemLong,reg01,0x04             //读取易格式的VirtualAddress
mov reg05,reg00
//invoke PrintNum, reg05, 16
add reg05,reg04                           //当前易格式所在的节内存中的偏移
//invoke PrintNum, reg05, 16

add reg01,0x04                            //到SizeOfRawData处
invoke ReadMemLong,reg01,0x04             //取出易格式的尺寸
mov reg03,reg00
//invoke PrintNum, reg03, 16

invoke InputText,"Please input the filename:"
cmp reg00,0x00
je cancel
invoke DumpMem,reg05,reg03,FreeBufferReg  //dump
je error
invoke msg,"Dump the E code finish!"
halt

nofind:
invoke msg,"No find the E code!"
halt

cancel:
halt

error:
invoke msg,"Write file error!"
halt

 

====================================================

PS:把原先漏掉的也贴上吧:)共有两篇,都是OM的脚本。


Posted by monkeycz at 09:26 | Read more | Comments (0) | Trackback (0) | Edit |

Winamp标题栏中文乱码原因分析及修正 - []

前言:
实在是忍受不了MediaPlayer对内存庞大的占用率和我的小内存之间的矛盾,同时又找不到foobat的WMA插件(有知道的兄弟,请给个下载地址,多谢!),于是装上了Winamp 2.81 简体中文经典怀念版,就是水手汉化的那个(够豪华)。打开一首抒情的歌曲,安抚一下我受伤的心灵——如果连续几天倒霉,先是笔记本电池挂掉、然后是系统瘫痪、接下来是硬盘坏掉(全面瘫痪阿,可怜的国产笔记本,幸好是全球联保的,可是又有什么用呢?刚过了质保期,就全部坏掉,真是牛x),你就会明白什么叫“受伤”——好久没有用过Winamp了,记得上次用还是在N年前(怀念我的大奔133和那个激情的时代),于是随手点击,熟悉一下功能。汉化过的版本就是好,毕竟中国人还是看中文最舒服——慢着,莫非这么古老的BUG还没有被修正么?就是那个滚动标题栏显示中文时乱码的BUG,一个陈旧的毛病。看着下面时而清晰时而混乱的标题,总觉得不舒服,算了,修复一下这个陈年旧疮吧。

分析对象:
Nullsoft Winamp 2.81 简体中文经典怀念版
水手汉化 豪华版

故障分析:
从显示的乱码时常清晰时常混乱就能很明白的想出来,乱码的原因就是可谓“经典”的“半个汉字”,大部分不支持中文的软件都是因为这个。在Ascll码中,每个英文用一个byte来记录,而在GB码中,每一个汉字用一个word来记录。没有经过改造的程序,在处理英文汉字混排的字符串时,如果删除一个汉字的话,每次只能删除这个汉字GB码的低8位,这时,乱码就产生了。只要我们能正确的在英文汉字混排的字符串分辨出汉字和英语,然后针对处理,问题就解决了。

代码分析:
要操刀修改,首先就要找到修改的位置。600多k的Winamp也不算小,蛮力去找自然是大海捞针。且先对其工作流程作一分析。要实现滚动标题栏其实很简单,取得要显示的字符串,把它的长度按需要处理一下(不同的时间起始位置不同),然后用SetWindowTextA显示出来即可。也就是说,Winamp也有可能是用上面的方法来实现的。
经过检测,Winamp没有加壳(其实这样的软件也没有必要加壳:))。打开W32Dasm载入Winamp,选择“查找”-〉“查找文本”,输入SetWindowTextA进行查找。在经历的N多个“查找下一个”后,在0x42EE60停下了,这是一段可疑的代码(由此可见,正确的分析是很重要的,尤其在没有任何线索的时候。当然,运气同样很重要:))。向上找,找到这一段子程序的起始位置,Copy下来分析:


* Referenced by a CALL at Address:
|:0041D2A1   
|
:0042ED10 55                      push ebp
:0042ED11 8BEC                    mov ebp, esp
:0042ED13 B800100000              mov eax, 00001000
:0042ED18 E8D3DF0000              call 0043CCF0
:0042ED1D A000874400              mov al, byte ptr [00448700]
:0042ED22 56                      push esi
:0042ED23 57                      push edi
:0042ED24 888500F0FFFF            mov byte ptr [ebp+FFFFF000], al
:0042ED2A B9FF030000              mov ecx, 000003FF
:0042ED2F 33C0                    xor eax, eax
:0042ED31 8DBD01F0FFFF            lea edi, dword ptr [ebp+FFFFF001]
:0042ED37 BEC0384500              mov esi, 004538C0                      ;在这个地方放的是完整的标题
:0042ED3C F3                      repz                                   ;清空缓冲区
:0042ED3D AB                      stosd
:0042ED3E 66AB                    stosw
:0042ED40 56                      push esi
:0042ED41 AA                      stosb

* Reference To: MSVCRT.strlen, Ord:02BEh
                                  |
:0042ED42 E8F7DF0000              Call 0043CD3E                           ;算一下标题有多少个字
:0042ED47 59                      pop ecx
:0042ED48 8B0D48124500            mov ecx, dword ptr [00451248]           ;这个就是循环用的计数器地址
:0042ED4E 3BC8                    cmp ecx, eax                            ;到头了,就重新再来吧。走马灯效果的实现。
:0042ED50 7D57                    jge 0042EDA9
:0042ED52 8D81C0384500            lea eax, dword ptr [ecx+004538C0]
:0042ED58 50                      push eax
:0042ED59 8D8500F0FFFF            lea eax, dword ptr [ebp+FFFFF000]
:0042ED5F 50                      push eax

* Reference To: MSVCRT.strcpy, Ord:02BAh
                                  |
:0042ED60 E87DDF0000              Call 0043CCE2                          ;按照计数器指定的偏移,把要显示的字符串移到缓冲区
:0042ED65 8D8500F0FFFF            lea eax, dword ptr [ebp+FFFFF000]

* Possible StringData Ref from Data Obj ->" *** "                        ;熟悉的东西:)
                                  |
:0042ED6B 686C644400              push 0044646C
:0042ED70 50                      push eax

* Reference To: MSVCRT.strcat, Ord:02B6h
                                  |
:0042ED71 E872DF0000              Call 0043CCE8
:0042ED76 83C410                  add esp, 00000010
:0042ED79 8D8500F0FFFF            lea eax, dword ptr [ebp+FFFFF000]
:0042ED7F FF3548124500            push dword ptr [00451248]
:0042ED85 56                      push esi
:0042ED86 50                      push eax

* Reference To: MSVCRT.strlen, Ord:02BEh
                                  |
:0042ED87 E8B2DF0000              Call 0043CD3E
:0042ED8C 59                      pop ecx
:0042ED8D 8D840500F0FFFF          lea eax, dword ptr [ebp+eax-00001000]  ;继续塞字符
:0042ED94 50                      push eax

* Reference To: MSVCRT.strncpy, Ord:02C1h
                                  |
:0042ED95 FF1558E24300            Call dword ptr [0043E258]
:0042ED9B 83C40C                  add esp, 0000000C
:0042ED9E FF0548124500            inc dword ptr [00451248]                ;重点到了!每次不判断当前字符的类型,就简单的把计数器加一,“半个汉字”自然就产生了
:0042EDA4 E984000000              jmp 0042EE2D

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0042ED50(C)                                                             ;这个子程序是用作字符全部显示完成后重新开始的,没有什么问题。
|
:0042EDA9 56                      push esi

* Reference To: MSVCRT.strlen, Ord:02BEh
                                  |
:0042EDAA E88FDF0000              Call 0043CD3E
:0042EDAF 8B0D48124500            mov ecx, dword ptr [00451248]
:0042EDB5 8D896C644400            lea ecx, dword ptr [ecx+0044646C]
:0042EDBB 2BC8                    sub ecx, eax
:0042EDBD 8D8500F0FFFF            lea eax, dword ptr [ebp+FFFFF000]
:0042EDC3 51                      push ecx
:0042EDC4 50                      push eax

* Reference To: MSVCRT.strcpy, Ord:02BAh
                                  |
:0042EDC5 E818DF0000              Call 0043CCE2
:0042EDCA 8D8500F0FFFF            lea eax, dword ptr [ebp+FFFFF000]
:0042EDD0 56                      push esi
:0042EDD1 50                      push eax

* Reference To: MSVCRT.strcat, Ord:02B6h
                                  |
:0042EDD2 E811DF0000              Call 0043CCE8
:0042EDD7 56                      push esi

* Reference To: MSVCRT.strlen, Ord:02BEh
                                  |
:0042EDD8 E861DF0000              Call 0043CD3E
:0042EDDD 83C418                  add esp, 00000018
:0042EDE0 6A03                    push 00000003
:0042EDE2 59                      pop ecx
:0042EDE3 2B0D48124500            sub ecx, dword ptr [00451248]
:0042EDE9 03C1                    add eax, ecx
:0042EDEB 50                      push eax
:0042EDEC 8D8500F0FFFF            lea eax, dword ptr [ebp+FFFFF000]

* Possible StringData Ref from Data Obj ->" *** "
                                  |
:0042EDF2 686C644400              push 0044646C
:0042EDF7 50                      push eax

* Reference To: MSVCRT.strlen, Ord:02BEh
                                  |
:0042EDF8 E841DF0000              Call 0043CD3E
:0042EDFD 59                      pop ecx
:0042EDFE 8D840500F0FFFF          lea eax, dword ptr [ebp+eax-00001000]
:0042EE05 50                      push eax

* Reference To: MSVCRT.strncpy, Ord:02C1h
                                  |
:0042EE06 FF1558E24300            Call dword ptr [0043E258]
:0042EE0C FF0548124500            inc dword ptr [00451248]                    ;个人感觉没有必要处理这个地方。
:0042EE12 56                      push esi

* Reference To: MSVCRT.strlen, Ord:02BEh
                                  |
:0042EE13 E826DF0000              Call 0043CD3E
:0042EE18 83C003                  add eax, 00000003
:0042EE1B 83C410                  add esp, 00000010
:0042EE1E 390548124500            cmp dword ptr [00451248], eax
:0042EE24 7C07                    jl 0042EE2D
:0042EE26 83254812450000          and dword ptr [00451248], 00000000

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0042EDA4(U), :0042EE24(C)
|

* Reference To: USER32.GetWindowLongA, Ord:0156h
                                  |
:0042EE2D 8B35B8E34300            mov esi, dword ptr [0043E3B8]
:0042EE33 6AF0                    push FFFFFFF0
:0042EE35 FF3520334500            push dword ptr [00453320]
:0042EE3B FFD6                    call esi

* Reference To: USER32.SetWindowLongA, Ord:0258h
                                  |
:0042EE3D 8B3D50E34300            mov edi, dword ptr [0043E350]
:0042EE43 25FFFF3FFF              and eax, FF3FFFFF
:0042EE48 50                      push eax
:0042EE49 6AF0                    push FFFFFFF0
:0042EE4B FF3520334500            push dword ptr [00453320]
:0042EE51 FFD7                    call edi
:0042EE53 8D8500F0FFFF            lea eax, dword ptr [ebp+FFFFF000]
:0042EE59 50                      push eax
:0042EE5A FF3520334500            push dword ptr [00453320]

* Reference To: USER32.SetWindowTextA, Ord:025Eh                                 ;嘿嘿,终于显示出来了;)
                                  |
:0042EE60 FF15E0E34300            Call dword ptr [0043E3E0]
:0042EE66 6AF0                    push FFFFFFF0
:0042EE68 FF3520334500            push dword ptr [00453320]
:0042EE6E FFD6                    call esi
:0042EE70 0D0000C000              or eax, 00C00000
:0042EE75 50                      push eax
:0042EE76 6AF0                    push FFFFFFF0
:0042EE78 FF3520334500            push dword ptr [00453320]
:0042EE7E FFD7                    call edi
:0042EE80 5F                      pop edi
:0042EE81 5E                      pop esi
:0042EE82 C9                      leave
:0042EE83 C3                      ret

经过分析,发现从0x0042ED10到0x0042EE60的这段代码就是实现滚动标题效果的核心代码。其中0x004538C0放置的是完整的字符串,0x00451248放置的是显示位置计数器值,0x006DA9EC放置的是将要显示出来的字符串。由于0x0042ED9E处没有对当前字符进行类型分析,简单的移动1次计数器,导致了汉字显示乱码。为了证实刚才的分析,打开TRW载入Winamp,下断点BP 0042ED10,把0x0042ED9E处的代码都改为nop。然后继续执行,发现标题栏已经不再继续滚动。证明上面的分析正确。

修改代码:
经过上面分析,只要正确的判断当前字符的类型并做出相应的处理即可。问题是怎么区分英文和汉字。记得可以显示的英文Ascll码到0x80为止。查了一下资料,GB code的内码的两个字节都是从A0H - FEH之间的。这样的话,代码基本上就可以写出来了:

mov ecx,dword ptr [00451248]
lea eax,dword ptr [ecx+004538C0]
cmp byte ptr [eax],A0
jb 1
inc dword ptr [00451248]
1:
inc dword ptr [00451248]  
retn

由于个人比较懒的原因,这里对汉字的判断作了简化处理,只要小于A0的字符都认为是英文,反之则是中文。一般情况下,这样都是可以正常现实的,当然BIG5码除外。关于BIG5码的判断标准如下:“BIG code 的内码的第一个字节是80H - FFH,第二个字节是00H - FFH”有兴趣的朋友可以自行修改。
下面的问题就是找一块能够放下代码的空间。感觉Winamp是用VC++编写的,Language2000证实了这一点。由于代码作了优化处理,所以基本上没有什么缝隙,所以只有从.text节末端寻找可以利用的空间。根据VirtualSize、SizeOfRawData和PointerToRawData计算出在文件0x0003C8E0偏移(RVA:0x0043D4E0)后即为空闲空间。我们就把代码放在这个地方。opcode如下:

8B0D481245008D81C03845008038A07206FF0548124500FF0548124500C3

然后修改0x004538C0(文件偏移0x0002E19E)处的代码:

call 0043D4E0
nop                   ;占位

opcode如下:E83DE7000090

再做些收尾工作,修改.text的实际尺寸。这样就基本上已经完工了。
下面再测试一下,打开Winamp,随着悠扬的乐曲传出,我们发现,滚动标题栏终于可以正确显示中文了:)

后记:
希望上文能把我要说的表达出来。如果有描述不清晰的地方或有错误,请与我联系:coffin13@183.ha.cn。
匆忙之作,加上我水平又菜,不免错误百出,望高手予以指正。在此先谢过了。





monkeycz
2004年12月12日凌晨

为了方便使用,我做了个修正补丁,放在了下面。放到Winamp的目录下直接运行即可。

http://monkeycz.china3t.com/chinese.rar

 

PS:这几天BLOG又连不上了。直到今天才好点。看来有必要备份一下了。


Posted by monkeycz at 09:09 | Read more | Comments (0) | Trackback (0) | Edit |

好久不来了…… - []

好久没有在这个BLOG里面写过东西了。

先传上几篇这几天写的东西,算是凑凑数吧。


Posted by monkeycz at 18:59 | Read more | Comments (0) | Trackback (0) | Edit |

E-Code Explorer - []

E-Code Explorer
欢迎使用世界上第一款易格式可执行文件分析器

如果您发现软件有Bug或者您对软件的功能有好的建议,请告诉我。

建议您在使用EcE之前,先详细的浏览一遍本文档,以便更好的了解和使用软件提供的各项功能。

【作者】
作者:monkeycz
电子信箱:coffin13@183.ha.cn

【帮助】
1。本软件的作用:分析由易语言编译生成的易格式可执行文件的结构,查看其中的各种数据。
2。操作方法:

(1)载入要分析的可执行文件:

□选择“载入”按钮,从弹出的对话框中选择要分析的可执行文件。
★注意:待分析的文件必须是易语言编译生成的包含易格式的标准PE文件(针对0.60版之前的版本而言。0.60版之后的版本支持对不同格式的文件分析)。由于本软件没有检测壳和脱壳功能,所以对于加壳后的文件请先脱壳再进行文件,否则会分析失败。
★注意:在安装目录下有一个文件名为“示例程序.exe”的可执行文件。此程序是用易语言编译而成,初次使用本软件,可以通过分析这个程序来熟悉软件的各项功能。

□在弹出的“询问”对话框中选择是否要采用多线程进行处理。对于有些规模较大的程序,分析可能要花费较长的时间。在此期间程序可能处于无响应状态。如果使用多线程分析,则不会出现这种情况,并且可以在分析的过程中预先查看已经分析过的报告。但是如果采用多线程技术分析比较小的程序,可能反而会减缓分析的速度。所以请视情况选择您需要的分析方法。

□分析结束后,如果没有使用多线程分析,将在提示信息栏出现“分析完成”的提示。这是您就可以通过选择左边工具栏中的各种选项来查看对当前易格式的分析结果了。如果使用了多线程分析,将在提示信息栏逐步提示分析完成的部分。您不需要等待分析完全完成就可以浏览分析结果,不过这个时候可能有一些功能不能使用。

□如果您要分析的文件是易格式原体文件或者是包含了易格式原体的非标准PE文件,您可以在“综合功能中心”-〉“综合设置”-〉“分析设置”中设置您要分析的文件类型或易格式所处的偏移,然后再进行载入分析。
★注意:如果在载入分析的时候提示失败,可以检查此处看是否设置有误。

(2)查看分析结果:

□选择左边功能栏中的各项,即可查看各种分析结果。
1。选择“易格式头信息”,可以查看当前分析的易格式的头信息。
2。选择“附加数据信息”,可以查看当前易格式头信息的附加数据信息。其中包括易格式所调用的所有DllCmd和支持库信息。点击“查看全部”,可以查看所有被调用的DllCmd的详细信息。
3。选择“程序数据段信息”,可以查看易格式所包括的所有数据段的信息。双击列表中的某一项,将显示此数据段的附加信息,包括所有重定位项和输出符号信息。选择“查看内容”,将显示当前选择的数据段的实际内容。比如“@const”段显示所有常量数据,“@form”段显示窗体资源”。目前此功能只支持显示“@const”段的常量数据,在以后的版本将加入对其他段的支持。选择“查看数据”,将以十六进制方式显示当前选择的数据段中的数据。单击列表项的表头,将在下方的状态条中显示此项的解释。
4。选择“重要装载信息”,可以查看当前可执行文件和易格式在装入过程中需要用到的各种重要数据。选择项目后面的“>>”按钮,将直接显示此地址所指向的数据内容。
5。选择“查看树形视图”功能,可以以树形视图模式清晰的查看当前被分析文件中所包含的各种结构。
6。选择“查看文件内容”功能,可以以十六进制方式查看当前文件的内容。选择“地址转跳”功能,可以直接转跳到您输入的地址处。

□如果不明白某一项分析内容的含义,可以将鼠标悬停在当前项的提示文字上或者单击分析列表的表头,在下面的提示栏中将出现此处分析内容的详细解释。

□如果要保存当前分析的结果,请选择“易格式头信息”-〉“导出报告”进行保存。

□如果想了解易格式的详细结构,请选择“综合功能中心”-〉“易格式技术资料”查看易语言作者提供的详细资料。

□可以选择“易格式头信息”-〉“关闭文件”来关闭当前被分析的文件。

(3)设置

□选择“综合功能中心”,在“综合设置”栏中可以进行分析设置和其他相关的设置。

□分析设置可以设置要分析的文件类型,其中包括“标准PE可执行文件”、“标准Linux可执行文件”(目前尚不支持)、“易格式原体文件”、“其他包含易格式的文件”。同时还可以设置从某一具体偏移处开始分析(针对“其他包含易格式的文件”选项)。

(4)帮助和关于

□帮助文件有助您更好的了解和使用本软件的各种功能。选择“综合功能中心”-〉“查看帮助”来浏览本软件的帮助文档。

□选择“综合功能中心”-〉“易格式技术资料”可以查看易语言作者提供的关于易格式结构的详细资料。

□单击软件主窗口左上方的易语言图标,将出现“关于”信息。其中有软件的版本号和软件作者的联系方式。

(5)工具箱

□其中包括了若干实用程序。

【历史】
★0.60版 - 2004年11月14日
1。加入了“分析设置”功能,可以选择分析文件的类型和设置文件所包含易格式的偏移。支持易格式原体文件的载入。
2。加入了“工具箱”功能,其中包含了若干实用工具。
3。加入了“导出易格式原体”功能,可以将当前分析的易格式数据导出保存为易格式原体文件。也可结合分析设置中的易格式偏移设置,将任何文件中包含的易格式数据导出。
4。加入了“易格式原体植入PE骨骼”功能,可以将易格式原体包装生成可用的PE可执行文件。目前尚不支持生成DLL文件。
5。加入了“易格式重定位信息修复”功能,可以根据用户提供的重定位基址重新设定当前载入的易格式原体中的重定位信息。
6。加入了“关闭当前分析的文件”功能。
7。加入了“导出分析报告”的功能。
8。为了添加新的功能,在原有基础上稍微修改了一下界面。
9。软件图标采用了自行设计的新图标。图标上的“EcE”即“E-Code Explorer”的缩写。

★0.54版 - 2004年10月23日
1。修正了DataDirectory中的一个非常低级的错误(又是非常低级的,该打)。成员错位,读取VirtualAddress和isize的时候弄反了。

★0.53版 - 2004年10月21日
1。修正了重定位信息中的一个非常低级的错误。居然把高低位弄反了,怪不得以前算出的重定位信息总是不对。

★0.52版 - 2004年10月17日
1.对易格式常量数据段提供了更好的支持,可以查看、导出在程序中被使用的所有常量数据。
2.可以查看所有在程序中被调用的动态链接库和动态链接库命令。
3.修正了“查看文件内容”功能中的若干定位错误。

★0.50版 - 2004年10月14日
1.第一款易格式可执行文件分析器诞生了。
2.完成了对windows操作系统下易格式封装的可执行文件的PE结构和易格式结构的基本分析。可以查看文件的各个数据结构,以十六进制方式查看文件的各个部分。
3.具有详尽清晰的树形视图查看功能。

【版权及相关声明】
□本软件(E-Code Explorer,简称EcE)的版权归作者monkeycz所有,保留一切权利。

□关于易格式结构(“易格式技术资料”等)的部分,版权为易语言作者吴涛所有。详情见“易格式技术资料”中的版权声明。

□本软件是免费软件。您可以从任何地方复制得到本软件的完整副本并免费的使用。在复制的过程中,请保持本软件的完整。

□声明:本软件仅供学习研究使用,请勿做它用。由本软件产生的一切问题作者概不负责。

【感谢】
□感谢您的使用。您的使用和建议是对EcE最大的支持。

□感谢易语言的作者吴涛先生。


monkeycz
2004年11月14日


Posted by monkeycz at 18:49 | Read more | Comments (0) | Trackback (0) | Edit |

易格式可执行文件脱壳方法一则 - []

易格式可执行文件脱壳方法一则

前言:

易格式壳执行文件就是用易语言编译生成的可执行文件。由于易语言的全中文化和简单易用,现在有不少软件都是用它写的。我们今天就来研究一下关于这种文件的脱壳问题。有人说:脱壳的方法还用你说!是的,我脱壳的水平的确很烂,不过易格式可执行文件和标准的PE文件有所不同(植于不同在何处下面还要详细叙述),所以平常我们用的脱壳的办法就显得不是很方便了,于是就有了这篇文章。其实关于易格式可执行文件脱壳的方法我以前在《易格式初步分析》一文中作过说明,不过那个说明实在是太简单了,而且当时还没有称手的工具,所以现在准备详细的说一下那个方法。

起因:

前几天有人在坛子里放出一个程序请求。据帖子里面留言,是用“软件保护神”加的壳。下载回来打开一看,是一个示例程序,估计是想检验加壳强度吧?

要脱壳的软件:

由于要脱壳的不是什么正式的软件,也就没有必要把地址放上来了,自己用易语言写一个程序再加上壳就可以了。

原理及分析:

易格式可执行文件是一种特殊的可执行文件。它由PE骨骼和易格式原体两部分组成。PE部分用来释放、寻找、加载易格式装载器。易格式原体部分包含了程序运行所需要的代码、数据和资源。易格式可执行文件在被PE装载器装载后,首先PE部分寻找并加载易格式装载器(易格式装载器在krnln.fne这个文件里,这个文件实质上是一个DLL文件),然后把运行权转交给易格式装载器。易格式装载器得到控制权后,载入易格式原体,加载接口地址,并对需要的部分进行重定位。接着又把运行权转交给了易格式的代码部分。到这个时候,程序才开始正式的运作,你在易语言中写的代码才开始被执行。有人认为易语言编译出来的代码不是全编译,是解释执行的。其实通过加载器和支持库的做法只是为了可移植性考虑的做法。至于代码是否是全编译的,自己跟踪一下就知道了:)不好意思,有点跑题了,我们接着刚才的说。说到这儿,不知道有没有人发现问题:因为易格式最终是要被易格式装载器装载的,所以在被装载的时候,易格式的原体部分应该是完整且正确的,否则装载过程将发生错误。这也就是说为什么在用ASProtect对易格式壳执行文件加壳时要选择“保留附加数据”的原因了。根据前面的分析,只要能获得易格式原体,然后我们再给它加上一副PE骨骼,一切就完成了。这样就给了我们可乘之机。在装载器装载完成后,我们就可以从内存中把易格式提取出来。
但是事情不会这么简单的,经过试验(过程下面会详细描述,这里就不多说了),最终合成出了一个可执行文件,执行的时候却出现了非法操作。难道上面的分析有误?调出OD跟踪:

00401000 >/$ E8 06000000    CALL foo24.0040100B
00401005  |. 50             PUSH EAX                                 ; /ExitCode
00401006  \. E8 BB010000    CALL <JMP.&KERNEL32.ExitProcess>         ; \ExitProcess
0040100B  /$ 55             PUSH EBP
0040100C  |. 8BEC           MOV EBP,ESP
0040100E  |. 81C4 F0FEFFFF  ADD ESP,-110
00401014  |. E9 83000000    JMP foo24.0040109C
00401019  |. 6B 72 6E 6C 6E>ASCII "krnln.fnr",0
00401023  |. 6B 72 6E 6C 6E>ASCII "krnln.fne",0
0040102D  |. 47 65 74 4E 65>ASCII "GetNewSock",0
00401038  |. 53 6F 66 74 77>ASCII "Software\FlySky\"
00401048  |. 45 5C 49 6E 73>ASCII "E\Install",0
00401052  |. 50 61 74 68 00>ASCII "Path",0
00401057  |. 4E 6F 74 20 66>ASCII "Not found the ke"
00401067  |. 72 6E 65 6C 20>ASCII "rnel library or "
00401077  |. 74 68 65 20 6B>ASCII "the kernel libra"
00401087  |. 72 79 20 69 73>ASCII "ry is invalid!",0
00401096  |. 45 72 72 6F 72>ASCII "Error",0
0040109C  |> 8D85 FCFEFFFF  LEA EAX,DWORD PTR SS:[EBP-104]
004010A2  |. 50             PUSH EAX
004010A3  |. E8 44010000    CALL foo24.004011EC
004010A8  |. 68 19104000    PUSH foo24.00401019                      ; /StringToAdd = "krnln.fnr"
004010AD  |. 8D85 FCFEFFFF  LEA EAX,DWORD PTR SS:[EBP-104]           ; |
004010B3  |. 50             PUSH EAX                                 ; |ConcatString
004010B4  |. E8 25010000    CALL <JMP.&KERNEL32.lstrcatA>            ; \lstrcatA
004010B9  |. 50             PUSH EAX                                 ; /FileName
004010BA  |. E8 19010000    CALL <JMP.&KERNEL32.LoadLibraryA>        ; \LoadLibraryA 载入核心支持库
004010BF  |. 85C0           TEST EAX,EAX
004010C1  |. 0F85 9E000000  JNZ foo24.00401165
004010C7  |. 8D85 F4FEFFFF  LEA EAX,DWORD PTR SS:[EBP-10C]
004010CD  |. 50             PUSH EAX                                 ; /pHandle
004010CE  |. 68 19000200    PUSH 20019                               ; |Access = KEY_READ
004010D3  |. 6A 00          PUSH 0                                   ; |Reserved = 0
004010D5  |. 68 38104000    PUSH foo24.00401038                      ; |Subkey = "Software\FlySky\E\Install"
004010DA  |. 68 01000080    PUSH 80000001                            ; |hKey = HKEY_CURRENT_USER
004010DF  |. E8 36010000    CALL <JMP.&ADVAPI32.RegOpenKeyExA>       ; \RegOpenKeyExA 从注册表中查找核心支持库的位置
004010E4  |. 83F8 00        CMP EAX,0
004010E7  |. 0F85 B8000000  JNZ foo24.004011A5
004010ED  |. C785 F0FEFFFF >MOV DWORD PTR SS:[EBP-110],103
004010F7  |. 8D85 F0FEFFFF  LEA EAX,DWORD PTR SS:[EBP-110]
004010FD  |. 50             PUSH EAX                                 ; /pBufSize
004010FE  |. 8D85 FCFEFFFF  LEA EAX,DWORD PTR SS:[EBP-104]           ; |
00401104  |. 50             PUSH EAX                                 ; |Buffer
00401105  |. 6A 00          PUSH 0                                   ; |pValueType = NULL
00401107  |. 6A 00          PUSH 0                                   ; |Reserved = NULL
00401109  |. 68 52104000    PUSH foo24.00401052                      ; |ValueName = "Path"
0040110E  |. FFB5 F4FEFFFF  PUSH DWORD PTR SS:[EBP-10C]              ; |hKey
00401114  |. E8 07010000    CALL <JMP.&ADVAPI32.RegQueryValueExA>    ; \RegQueryValueExA
00401119  |. 50             PUSH EAX
0040111A  |. FFB5 F4FEFFFF  PUSH DWORD PTR SS:[EBP-10C]              ; /hKey
00401120  |. E8 EF000000    CALL <JMP.&ADVAPI32.RegCloseKey>         ; \RegCloseKey
00401125  |. 58             POP EAX
00401126  |. 83F8 00        CMP EAX,0
00401129  |. 75 7A          JNZ SHORT foo24.004011A5
0040112B  |. 8D85 FCFEFFFF  LEA EAX,DWORD PTR SS:[EBP-104]
00401131  |. 50             PUSH EAX                                 ; /String
00401132  |. E8 AD000000    CALL <JMP.&KERNEL32.lstrlenA>            ; \lstrlenA
00401137  |. 8D9D FCFEFFFF  LEA EBX,DWORD PTR SS:[EBP-104]
0040113D  |. 03D8           ADD EBX,EAX
0040113F  |. 4B             DEC EBX
00401140  |. 803B 5C        CMP BYTE PTR DS:[EBX],5C
00401143  |. 74 05          JE SHORT foo24.0040114A
00401145  |. 66:C703 5C00   MOV WORD PTR DS:[EBX],5C
0040114A  |> 68 23104000    PUSH foo24.00401023                      ; /StringToAdd = "krnln.fne"
0040114F  |. 8D85 FCFEFFFF  LEA EAX,DWORD PTR SS:[EBP-104]           ; |
00401155  |. 50             PUSH EAX                                 ; |ConcatString
00401156  |. E8 83000000    CALL <JMP.&KERNEL32.lstrcatA>            ; \lstrcatA
0040115B  |. 50             PUSH EAX                                 ; /FileName
0040115C  |. E8 77000000    CALL <JMP.&KERNEL32.LoadLibraryA>        ; \LoadLibraryA
00401161  |. 85C0           TEST EAX,EAX
00401163  |. 74 40          JE SHORT foo24.004011A5
00401165  |> 8985 F8FEFFFF  MOV DWORD PTR SS:[EBP-108],EAX
0040116B  |. 68 2D104000    PUSH foo24.0040102D                      ; /ProcNameOrOrdinal = "GetNewSock"
00401170  |. 50             PUSH EAX                                 ; |hModule
00401171  |. E8 5C000000    CALL <JMP.&KERNEL32.GetProcAddress>      ; \GetProcAddress
00401176  |. 85C0           TEST EAX,EAX
00401178  |. 74 20          JE SHORT foo24.0040119A
0040117A  |. 68 E8030000    PUSH 3E8
0040117F  |. FFD0           CALL EAX
00401181  |. 85C0           TEST EAX,EAX
00401183  |. 74 15          JE SHORT foo24.0040119A
00401185  |. E8 00000000    CALL foo24.0040118A
0040118A  |$ 810424 761E000>ADD DWORD PTR SS:[ESP],1E76
00401191  |. FFD0           CALL EAX                                 ;装跳到核心支持库领空

10029E72   55               PUSH EBP
10029E73   8BEC             MOV EBP,ESP
10029E75   8B45 08          MOV EAX,DWORD PTR SS:[EBP+8]
10029E78   50               PUSH EAX
10029E79   B9 F8E81210      MOV ECX,krnln.1012E8F8
10029E7E   E8 ACF5FFFF      CALL krnln.1002942F                      ;继续跟进
10029E83   5D               POP EBP
10029E84   C2 0400          RETN 4

1002942F   55               PUSH EBP
10029430   8BEC             MOV EBP,ESP
10029432   83EC 08          SUB ESP,8
10029435   53               PUSH EBX
10029436   56               PUSH ESI
10029437   57               PUSH EDI
10029438   894D F8          MOV DWORD PTR SS:[EBP-8],ECX
1002943B   FF15 C8230D10    CALL DWORD PTR DS:[<&KERNEL32.GetProcess>; KERNEL32.GetProcessHeap
10029441   8B4D F8          MOV ECX,DWORD PTR SS:[EBP-8]
10029444   8981 EC030000    MOV DWORD PTR DS:[ECX+3EC],EAX
1002944A   8B55 08          MOV EDX,DWORD PTR SS:[EBP+8]
1002944D   8B42 30          MOV EAX,DWORD PTR DS:[EDX+30]
10029450   83E0 01          AND EAX,1
10029453   85C0             TEST EAX,EAX
10029455   75 10            JNZ SHORT krnln.10029467
10029457   8B4D 08          MOV ECX,DWORD PTR SS:[EBP+8]
1002945A   51               PUSH ECX
1002945B   8B4D F8          MOV ECX,DWORD PTR SS:[EBP-8]
1002945E   E8 FD400300      CALL krnln.1005D560
10029463   FFE0             JMP EAX                                  ;易格式已经装载完成了,转交指挥权

00404207   FC               CLD                                      ;易格式代码的起始位置
00404208   DBE3             FINIT
0040420A   68 027F8000      PUSH 807F02
0040420F   B8 03000000      MOV EAX,3
00404214   E8 31000000      CALL foo24.0040424A
00404219   83C4 04          ADD ESP,4
0040421C   68 01000152      PUSH 52010001
00404221   E8 1E000000      CALL foo24.00404244                      
00404226   83C4 04          ADD ESP,4
00404229   6A 00            PUSH 0
0040422B   E8 0E000000      CALL foo24.0040423E
00404230   E8 03000000      CALL foo24.00404238
00404235   83C4 04          ADD ESP,4
00404238   FF25 94788000    JMP DWORD PTR DS:[807894]
0040423E   FF25 98788000    JMP DWORD PTR DS:[807898]
00404244   FF25 9C788000    JMP DWORD PTR DS:[80789C]
0040424A   FF25 A0788000    JMP DWORD PTR DS:[8078A0]               ;最后在这个地方程序当掉了
00404250   FF25 90788000    JMP DWORD PTR DS:[807890]
00404256   FF25 78788000    JMP DWORD PTR DS:[807878]
0040425C   FF25 7C788000    JMP DWORD PTR DS:[80787C]
00404262   FF25 80788000    JMP DWORD PTR DS:[807880]

转跳指向了一个莫名其妙的地址,程序不当掉才怪。
启动W32Dasm载入程序,进行静态分析。在相同位置得到了这样的反汇编代码:

:00404207 FC                      cld
:00404208 DBE3                    finit
:0040420A 6806424000              push 00404206
:0040420F B803000000              mov eax, 00000003
:00404214 E831000000              call 0040424A
:00404219 83C404                  add esp, 00000004
:0040421C 6801000152              push 52010001
:00404221 E81E000000              call 00404244
:00404226 83C404                  add esp, 00000004
:00404229 6A00                    push 00000000
:0040422B E80E000000              call 0040423E
:00404230 E803000000              call 00404238
:00404235 83C404                  add esp, 00000004

* Referenced by a CALL at Address:
|:00404230   
|
:00404238 FF255C3C4000            jmp dword ptr [00403C5C]

* Referenced by a CALL at Address:
|:0040422B   
|
:0040423E FF25603C4000            jmp dword ptr [00403C60]

* Referenced by a CALL at Address:
|:00404221   
|
:00404244 FF25643C4000            jmp dword ptr [00403C64]

* Referenced by a CALL at Address:
|:00404214   
|
:0040424A FF25683C4000            jmp dword ptr [00403C68]

* Referenced by a CALL at Addresses:
|:00403E10   , :00403EE0   , :00403F67   , :00403F77   , :004040A1   
|:00404107   , :00404194   , :004041FA   
|
:00404250 FF25583C4000            jmp dword ptr [00403C58]

* Referenced by a CALL at Addresses:
|:00403E75   , :00403F37   , :00404014   , :0040403A   , :004040F7   
|:0040412D   , :004041EA   
|
:00404256 FF25403C4000            jmp dword ptr [00403C40]

* Referenced by a CALL at Addresses:
|:00403E4A   , :00403ECD   , :00403FB1   , :0040408E   , :00404181   
|
:0040425C FF25443C4000            jmp dword ptr [00403C44]
:00404262 FF25483C4000            jmp dword ptr [00403C48]

经过对比很明显就能发现,转跳的地址不同。原因呢?很简单:重定位。
用EcE载入程序,查看@code段的重定位信息,得到如下结果:
0:RT_HELP_FUNC    0000053E
0:RT_HELP_FUNC    00000544
0:RT_HELP_FUNC    0000054A
0:RT_HELP_FUNC    00000550
0:RT_HELP_FUNC    00000556
0:RT_HELP_FUNC    0000055C
0:RT_HELP_FUNC    00000562
0:RT_HELP_FUNC    00000568
在“重要装载信息”里显示,易格式所在节的RVA在0x00003000处。@code段的偏移为0x00000CFC。然后计算0x004000000+0x00003000+0x00000cfc+0x0000053E = 0x0040423A,正是那个错误的地址。
也就是说,我们从内存中提取出来的易格式原体是经过装载器重定位后的,所以当我们以重定位后的易格式原体被装载器载入,然后再次进行重定位,自然会指向错误的地址。所以只要我们修复了从内存中提取到易格式原体的重定位信息即可。
总结一下,脱壳的思路如下:
载入要脱壳的程序,等待装载器把易格式装入内存 -〉从内存中获取易格式原体并保存下来 -〉修复易格式原体的重定位信息 -〉将修复后的原体植入PE骨骼。

实施步骤:
1。双击运行加了壳的程序,这里是2-2.exe。(废话:))
2。启动WinHex,在“工具”-〉“RAM编辑器”中选择2-2.exe进程,打开其主要内存。
3。查找字符串“WTNE”,这是易格式的验证字符串。在0x00403000处找到了。
4。然后向下找,找到“@reloc”(如果没有,就找“@var”),结果在0x004042AC处找到了。
5。一般易格式是按照FileAlignment对齐的,也就是说,易格式原体应该是从0x00403000——0x00403400的部分。
6。把这一部分的数据“复制块”-〉“进入正常文件”,我们把它命名为yt.dat。
7。用EcE载入yt.dat,在载入之前,必须要在“综合功能中心”-〉“综合设置”-〉“分析设置”中,设置“分析对象类型”为“易格式原体文件”。如果可以正常载入的话,说明我们的第一步提取成功了。
8。下面我们要进行的是修复重定位的工作。在以前这可是个极度痛苦的工作。试想一下吧,计算修复成千上万个重定位数据后,人会变成什么样子……不过现在情况好多了,可以利用EcE里面带的“易格式重定位信息修复”工具来代替我们完成这个工作,不过你必须要有0.60版本以上的EcE,在坛子里有最新的下载(算是广告吧:))。
9。选择EcE左边工具栏中“综合功能中心”-〉“工具箱”,启动“易格式重定位信息修复”。在一个警告提示之后,会出现一个输入框,让你输入“重定位基址”。这个基址也就是易格式原体实际上的RVA了。由于我们是从进程内存0x00403000处体取得易格式原体,这个地方就输入00403000。确定后稍等片刻,会提示“重定位信息修复完成”。
10。接下来改把易格式重新封装起来了。PE骨骼要求能完成找到易语言核心支持库,装载易格式装载器等一系列工作。到哪儿去制作一个符合要求的PE骨骼呢?EcE的工具箱也提供了这样的功能(好像工具箱是专门为脱壳设计的:))。
11。关闭刚才打开的原体。在“工具箱”中选择“易格式原体植入PE骨骼”。首先会让你选择易格式原体文件,我们选择“yt.dat”。然后在输入要保存到的文件名,这里用new.exe。稍等片刻会提示已经完成。
12。现在基本上大功告成了。执行一下new.exe试试看能否正常运行:)

后记:
之所以没有提供加壳后的软件下载,前面我也说过了,是因为我感觉这种方法适用于大部分壳(当然了,只是针对易格式壳执行程序)。至少我试过的UPX,ASProtect,软件保护神,比泰加密等均壳易用这种方法脱壳或解密,所以也没有很强的针对性了。不过对于某些壳也是无效的,这样就需要变通变通了。
也许有会说这样看来易格式可执行文件的安全性不高啊。其实并非如此。易格式很特殊,而大部分加壳软件的作者并非都熟悉易格式,而且那些软件也没有针对性的保护措施,所以才会很容易的被脱掉。我相信随着人们对易格式的认识加深,用不了多长时间就会有专门的加壳软件 for 易格式的版本或者保护选项了。
另外,加壳不是保护软件的最终手段,不要太依靠那个东西,毕竟,锁是防君子不防小人的。




monkeycz
2004年11月16日


Posted by monkeycz at 18:45 | Read more | Comments (0) | Trackback (0) | Edit |


Page共14页 第一页 上一页 5 6 7 8 9 10 11 12 13 14 下一页 最后一页
© Powered by BlogBus.Com. 2002-, All Rights Reserved.