且行且远
分类: 且行且远 由 ssfighter 于 2006年5月14日 发表

昨天在网易上面看了一个新闻,说天涯社区某女网友发了一篇贴子大骂自己中学时候的老师,听说引来回帖无数,其实想起来在水木Joke版上也看到过类似的贴子,只不过温和的多而已,记得joke版那次大家疯狂地回忆老师都说过什么恶毒都话语,发现原来天下的老师都是相当会讽刺挖苦的一类人。
想起来我小学时候很不爱上学,那时候自己胆子特小,特别怕老师,反正就到现在为止,我对老师这个职业一直都是敬畏大于敬佩。还好小的时候因为特别怕老师,所以在老师面前表现得尤为听话,也就没有太多的被批评教育的机会。
不过话说回来,初中时候我也不知道那根筋和我们班班主任就是对不上了,她貌似就是有点和我过不去,总是找一些我现在看来仍然觉得稀奇古怪都理由来教育我,一直教育的我现在见到老师都没有太多好感……
据说天涯上面某女骂的那个老师还是一个什么特级教师,什么优秀工作者之类的,那个老师的同事都说老师平时各方面都很好,但是我仍然相信那个天涯某贴中所说的老师的所作所为都是实话,因为优秀教师和是否挖苦人真的是两回事。初中时候我的班主任就是所谓的优秀教师,后来听说也平步青云地当上了校长啥的。平心而论,她的教育水平确实相当高,我的语文在初中阶段在她的教育下有了很大的提高(虽然现在语文也的确不咋样),但她给我留下的内心的伤痕却是无法抹去的,这点谁都无法否认。
其实,很多老师自己根本都没有真正在意过自己所说的话会带给孩子怎样的内心伤害,从这点看来,有一部分老师的确是有那么一点心理变态的,他们以为他们的挖苦是幽默,是一种让孩子刻骨铭心的教育方式,刻骨铭心可能是留下了,但留下的却绝对不是什么完美的回忆。我相信,如果问一下现在的年轻人,每个人在小学中学时候都或多或少会有那么几件刺痛内心的事情的,而我们伟大的传道授业解惑的老师啊,你们又有多少人难辞其咎啊……
肆无忌惮地骂人、动辄罚学生站到教室外面站一天、犯了错误要罚款,再加上数不清的挖苦学生的方式,这些事情几乎无一例外地发生在我们每个人的童年,而这些事情也几乎无一例外地发生在现在。我一直搞不清,为什么在感谢老师的恩情的同时,没有人能够告诉老师,尤其是中小学的老师,请你们在批评学生之前就为自己所说出的话负责,要知道你们所说的一句话往往能够影响一个人的一生。我到现在仍然记恨我初中时候的老师,但我不愿发贴数落她的种种不是,那些事情毕竟已经过去,我内心的创伤也不是痛骂她就能够抚平的了,我只希望老师这个职业能够真正起到传道授业解惑的作用,而不要再在孩子脆弱的内心上面肆意践踏。


1. 10 fruit 十种水果
Orange 橙子
Strawberry 草莓
Lemon 柠檬
Lime 酸橙
Banana 香蕉
Grape 葡萄
Kiwi 奇异果(猕猴桃)
Watermelon 西瓜
Pear 生梨
Tangerine 柑橘
Apple 苹果
Cherry 樱桃

2. 10 colors 十种颜色
Red 红色
Orange 橙色
Blue 蓝色
Purple 紫色
Gray 灰色
Black 黑色
Green 绿色
Yellow 黄色
Pink 粉红色
Brown 褐色
Silver 银色
Tan 茶色

3. 8 planets 八大行星
Mercury 水星
Venus 金星
Earth 地球
Mars 火星
Jupiter 木星
Saturn 土星
Uranus 天王星
Neptune 海王星
Pluto 冥王星

4. 8 mythical creatures 八种神话角色
Dragon 龙
Unicorn 独角兽
Vampire 吸血鬼
Werewolf 狼人
Centaur 半人马
Cyclops 独眼巨人
Griffin 狮身鹫
Phoenix 凤凰
Hydra 九头蛇
Pegasus 飞马
Siren 海妖

5.8 barnyard animals 八种农场动物
Cow 母牛
Pig 猪
Horse 马
Sheep 绵羊
Rooster 公鸡
Chicken 小鸡
Cat 猫
Dog 狗
Goat 山羊
Duck 鸭子
Mouse 老鼠

6. 10 parts of the body 十个身体部位
Hand 手
Feet 脚
Eyes 眼睛
Teeth 牙齿
Nose 鼻子
Tongue 舌头
Finger 手指
Toe 脚趾
Eyebrow 眉毛
knee 膝
Shoulde 肩
Hip 臀
Ankle 脚踝

7. 9 pizza toppings 十种披萨配料
Cheese 乳酪
Olives 橄榄
Bacon 培根
Pepperoni 辣香肠
Sausage 香肠
Pineapple 菠萝
Mushrooms 蘑菇
Onions 洋葱
Peppers 甜椒
Hamburger 碎牛肉
Anchovies 凤尾鱼

8. 10 months of the year 十个月份
January 一月
February 二月
March 三月
April 四月
May 五月
June 六月
July 七月
August 八月
September 九月
October 十月
November 十一月
December 十二月

9. 10 astrological signs 十个星座
Aries 白羊座
Taurus 金牛座
Gemini 双子座
Cancer 巨蟹座
Leo 狮子座
Virgo 处女座
Libra 天秤座
Scorpio 天蝎座
Sagittarius 射手座
Capricorn 摩羯座
Aquarius 水瓶座
Pisces 双鱼座

10. 10 sports 十项体育运动
Soccer 英式足球
Football 美式足球(橄榄球)
Baseball 棒球
Basketball 篮球
Bowling 保龄球
Racing 赛车/***
Tennis 网球
Hockey 曲棍球
Golf 高尔夫球
Skating 滑冰
Skiing 滑雪
Boxing 拳击
Weightlifting 举重
Softball 垒球
Cycling 自行车竞速

11. 10 vegetables 十种蔬菜
Corn 玉米
Peas 碗豆
Spinach 菠菜
Squash 南瓜
Beans 黄豆
Tomato 蕃茄
Onion 洋葱
Artichoke 洋蓟
Beet 甜菜
Mushrooms 蘑菇
Pepper 甜椒
Cucumber 黄瓜
Eggplant 茄子
Carrot 胡萝卜

12. 10 zoo animals 十个动物园动物
Penguin 企鹅
Zebra 斑马
Lion 狮子
Tiger 老虎
Bear 熊
Alligator 鳄鱼
Snake 蛇
Turtle 海龟
Giraffe 长颈鹿
Bobcat 山猫
Hyena 鬣狗
Elephant 象
Gorilla 大猩猩
Ape 猿
Cheetah 猎豹
Panda 熊猫

13. 10 numbers 十个数字
One 一
Two 二
Three 三
Four 四
Five 五
Six 六
Seven 七
Eight 八
Nine 九
Ten 十
Eleven 十一
Twelve 十二
Twenty 二十
Thirty 三十

14. 10 musical instruments 十种乐器
Guitar 吉他
Piano 钢琴
Saxaphone 萨克斯风
Violin 小提琴
Tuba 大号
Harp 竖琴
Clarinet 单簧管
Flute 长笛
Oboe 双簧管
Drums 鼓
Harmonica 口琴
Bass 贝司
Cowbell 铃铛
Xylophone 木琴
Recorder 八孔长笛
Cello 大提琴
Viola 中提琴
Trumpet 小号
Glockenspiel 钟琴

15. 10 European countries 十个欧洲国家
Greece 希腊
Italy 意大利
Portugal 葡萄牙
Switzerland 瑞士
Finland 芬兰
Turkey 土耳其
Austria 奥地利
Denmark 丹麦
France 法国
Norway 挪威
Spain 西班牙
Hungary 匈牙利
Sweden 瑞典
Britian(其实是Britain)英国
Poland 波兰
Germany 德国

16. 10 kitchen utensils 十种厨房用品
Fork 釵子
Spoon 汤匙
Knife 刀
Spatula 抹刀
Pots 壶
Pans 平底锅
Bowl 碗
Jug 水壶
Plate 盘子
Colander 滤锅
Ladle 长柄勺子
Cleaver 切肉刀
Whisk 打蛋器
Tongs 夹具
Wok 炒锅

17. 10 kinds of dogs 十种狗的名称
Beagle 毕尔格猎犬
Chihuahua 吉娃娃
Corgi 威尔士矮脚狗
Spaniel 猎鹬犬
Shepherd 牧羊犬
Greyhound 灵缇
Terrier 绠犬
Boxer 拳师犬
Chow 松狮犬
Poodle 贵宾犬
Pug 巴哥犬
Dalmatian 大麦町犬
Bulldog 斗牛犬
Whippet 小灵犬
Collie 柯利牧羊犬
Pointer 指示猎犬
Foxhound 猎狐犬

18. 10 kinds of trees 十种树的名称
Oak 橡树
Maple 枫树
Elm 榆树
Sycamore 无花果树
Sumac 漆树
Alder 桤木
Birch 桦树
Hazelnut 榛木
Walnut 胡桃木
Pine 松树
Chestnut 栗树
Pecan 山核桃树
Ash 岑树
Willow 柳树

19. 10 ice cream flavors 十种冰淇淋口味
Vanilla 香草
Chocolate 巧克力
Neapolitan 多层不同味道
Strawberry 草莓
Mint 薄荷
Coffee 咖啡
Raspberry 黑莓
Butterscotch 奶油糖果
Caramel 焦糖
Lemon 柠檬
Lime 莱姆(酸柑)
Cherry 樱桃

20. 10 kinds of furniture 十种家具
Couch 沙发床
Table 桌子
Dresser 梳妆台
Recliner 躺椅
Sofa 沙发
Bed 床
Bookcase 书柜
Shelves 架子
Desk 书桌
Chest 柜子/箱子
Armoire 大衣橱
Cabinet 橱柜
Hutch 碗柜

21. 9 kitchen appliances 九种厨房电器
Refrigerator 冰箱
Freezer 冰库
Dishwasher 洗碗机
Toaster 烤面包炉
Oven 烤箱
Griddle 烘培盘
Wafflemaker 烘面包机(威化饼干机)
Fryer 电炸锅
Blender 粉碎机(切割)
Mixer 搅拌机 (混合)
Juicer 榨汁机

22. 10 emotions 十种情绪
Anger 愤怒
Desire 期待
Relief 安慰
Rage 大怒
Envy 羡慕
Awe 敬畏
Boredom 厌倦
Horror 惊骇
Fear 害怕
Joy 快乐
Jealousy 妒忌
Shame 羞愧
Disillusionment 觉醒
Curiosity 好奇

23. 10 parts of a car 十种汽车部件
Door 车门
Hood 引擎盖
Wheel 车轮
Fender 挡泥板
Bumper 避震/保险杆
Headlights 前大灯
Engine 引擎
Axel(其实是Axle)轴承
Seat 座椅
Trunk 后备箱
Windshield 挡风玻璃
Wipers 雨刮
Mirror 后视镜

24. 10 meteorological terms 十种气象用语
Snow 雪
Rain 雨
Hot 高温
Cold 低温
Blizzard 暴风雪
Barometer 气压
Clouds 多云
Drizzle 细雨
Wind 起风
Fog 起雾
Sleet 雨夹雪
Tornado 龙卷风
Hurricane 飓风

25. 10 spices 十种香料
Basil 罗勒
Chives 香葱
Cilantro 香菜(芫荽)
Cinnamon 肉桂
Cumin 孜然
Curry 咖喱
Dill 莳萝
Paprika 红辣椒
Parsley 欧芹
Oregano 牛至
Garlic 大蒜
Sage 鼠尾草
Thyme 百里香(麝香草)
Salt 盐
Pepper 胡椒粉
Rosemary 迷迭香

26. 10 breakfast foods 十种早餐食品
Eggs 蛋(特指煮蛋)
Cereal 谷类
Bacon 培根
Sausage 香肠
Toast 吐司
Pancakes 薄烤饼(班吉)
Hashbrowns 土豆煎饼
Fruit 水果
Cheese 乳酪
Doughnut 甜甜圈
Omelette 煎蛋
Danish 丹麦卷

27. 10 gemstones 十种宝石
Amethyst 紫水晶
Amber 琥珀
Aquamarine 绿玉
Coral 珊瑚
Diamond 钻石
Emerald 祖母绿
Jade 翡翠
Jasper 水苍玉
Onyx 玛瑙
Opal 猫眼石
Ruby 红宝石
Sapphire 蓝宝石
Topaz 黄晶

28. 10 kinds of birds 十种鸟的名称
Crow 乌鸦
Robin 知更鸟
Hawk 鹰
Eagle 雕
Woodpecker 啄木鸟
Duck 鸭子
Goose 鹅
Pigeon 鸽子
Dove 家鸽
Jay 松鸦
Magpie 喜鹊
Cuckoo 杜鹃(布谷)
Sparrow 麻雀
Parrot 鹦鹉
Gull 鸥
Parakeet 长尾小鹦鹉

29. 10 bathroom items 十种浴室用品
Shampoo 洗发水
Soap 香皂
Towels 毛巾
Deodorant 除臭剂
Shaver 剃须刀
Makeup 化妆品
Tissues 纸巾
Mirror 镜子
Conditioner 护发素
Toothpaste 牙膏
Toothbrush 牙刷

30. 10 kinds of nuts 十种坚果名称
Almond 杏仁
Brazil 苏果(巴西豆)
Cashew 腰果
Chestnut 栗子
Coconut 椰子
Hazel 榛子
Macadamia 夏威夷果
Peanut 花生
Pecan 山核桃
Pine 松子
Pistachio 开心果
Walnut 胡桃

31. 10 types of dances 十种舞姿
Mambo 曼波
Waltz 华尔兹
Merengue 梅伦格
Tango 探戈
Fandango 方丹果
Hula 草裙舞
Belly 肚皮舞
Swing 摇摆舞
Jitterbug 吉特巴
Lambada  兰巴达
Salsa  萨尔萨
Rumba 伦巴
Square 方步舞

32. 8 gardening tools 八种园艺用具
Shovel 铲子
Rake 耙子
Pruner 修枝剪刀
Trowel 泥铲
Hoe 锄头
Tiller 耕作机
Mower  割草机
Trimmer 修剪机
Wagon 四轮农用车
Cart 两轮农用车


分类: 逆向手札 由 ssfighter 于 2006年5月10日 发表

其实这个桌面日历秀还是挺好用的,个人觉得不比雪狐桌面精灵差,但是这个是共享版的,而且有比较烦人的Nag窗口,而且待办事项的后面也都有未注册的提示,让人觉得有点不爽,昨天晚上写报告之余研究了一下。

程序是用UPX-Scrambler加的壳,很容易脱。注册那里由于要上网验证,所以把网线拔了,这样可以省去连接网络的时间,但是一直没有找到程序是怎么跳转到注册失败那里的,简单分析一下好像是通过异常化处理来到那边的,研究了半天,只能通过改EIP使程序来到注册成功的地方。但是第二次启动的时候由于要再验一遍注册码,所以又会回到未注册的状态。经过分析,程序启动的时候会读取config.ini里面的注册信息,然后再验算一遍注册码,只有成功才能显示注册,否则仍然是未注册版本。

找字符串参考,config.ini和reg信息,来到这里。

005E7DE1    B9 0C7F5E00     mov     ecx, XDeskCal.005E7F0C           ; config.ini
005E7DE6    8B15 7C156000   mov     edx, ds:[60157C]
005E7DEC    E8 B3D1E1FF     call    XDeskCal.00404FA4
005E7DF1    8B4D FC         mov     ecx, ss:[ebp-4]
005E7DF4    B2 01           mov     dl, 1
005E7DF6    A1 7C734400     mov     eax, ds:[44737C]
005E7DFB    E8 2CF6E5FF     call    XDeskCal.0044742C
005E7E00    8BF0            mov     esi, eax
005E7E02    33C9            xor     ecx, ecx
005E7E04    B2 01           mov     dl, 1
005E7E06    A1 CC1A5600     mov     eax, ds:[561ACC]
005E7E0B    E8 C49DF7FF     call    XDeskCal.00561BD4
005E7E10    8BD8            mov     ebx, eax
005E7E12    8D4D F8         lea     ecx, ss:[ebp-8]
005E7E15    8B15 24176000   mov     edx, ds:[601724]
005E7E1B    8BC3            mov     eax, ebx
005E7E1D    E8 DE92F7FF     call    XDeskCal.00561100
005E7E22    8B45 F8         mov     eax, ss:[ebp-8]
005E7E25    50              push    eax
005E7E26    B9 207F5E00     mov     ecx, XDeskCal.005E7F20           ; regid
005E7E2B    BA 307F5E00     mov     edx, XDeskCal.005E7F30           ; reg
005E7E30    8BC6            mov     eax, esi
005E7E32    8B38            mov     edi, ds:[eax]
005E7E34    FF57 04         call    near ds:[edi+4]
005E7E37    8BC3            mov     eax, ebx
005E7E39    E8 46BFE1FF     call    XDeskCal.00403D84
005E7E3E    33C9            xor     ecx, ecx
005E7E40    B2 01           mov     dl, 1
005E7E42    A1 CC1A5600     mov     eax, ds:[561ACC]
005E7E47    E8 889DF7FF     call    XDeskCal.00561BD4
005E7E4C    8BD8            mov     ebx, eax
005E7E4E    8D4D F4         lea     ecx, ss:[ebp-C]
005E7E51    8B15 28176000   mov     edx, ds:[601728]
005E7E57    8BC3            mov     eax, ebx
005E7E59    E8 A292F7FF     call    XDeskCal.00561100
005E7E5E    8B45 F4         mov     eax, ss:[ebp-C]
005E7E61    50              push    eax
005E7E62    B9 3C7F5E00     mov     ecx, XDeskCal.005E7F3C           ; regcode
005E7E67    BA 307F5E00     mov     edx, XDeskCal.005E7F30           ; reg
005E7E6C    8BC6            mov     eax, esi
005E7E6E    8B38            mov     edi, ds:[eax]
005E7E70    FF57 04         call    near ds:[edi+4]
005E7E73    8BC3            mov     eax, ebx
005E7E75    E8 0ABFE1FF     call    XDeskCal.00403D84
005E7E7A    A1 2C176000     mov     eax, ds:[60172C]
005E7E7F    50              push    eax
005E7E80    B9 4C7F5E00     mov     ecx, XDeskCal.005E7F4C           ; regname
005E7E85    BA 307F5E00     mov     edx, XDeskCal.005E7F30           ; reg
005E7E8A    8BC6            mov     eax, esi
005E7E8C    8B18            mov     ebx, ds:[eax]
005E7E8E    FF53 04         call    near ds:[ebx+4]
005E7E91    33C9            xor     ecx, ecx
005E7E93    B2 01           mov     dl, 1
005E7E95    A1 CC1A5600     mov     eax, ds:[561ACC]
005E7E9A    E8 359DF7FF     call    XDeskCal.00561BD4
005E7E9F    8BD8            mov     ebx, eax
005E7EA1    8D4D F0         lea     ecx, ss:[ebp-10]
005E7EA4    8B15 30176000   mov     edx, ds:[601730]
005E7EAA    8BC3            mov     eax, ebx
005E7EAC    E8 4F92F7FF     call    XDeskCal.00561100
005E7EB1    8B45 F0         mov     eax, ss:[ebp-10]
005E7EB4    50              push    eax
005E7EB5    B9 5C7F5E00     mov     ecx, XDeskCal.005E7F5C           ; regsn
005E7EBA    BA 307F5E00     mov     edx, XDeskCal.005E7F30           ; reg
005E7EBF    8BC6            mov     eax, esi
005E7EC1    8B38            mov     edi, ds:[eax]
005E7EC3    FF57 04         call    near ds:[edi+4]
005E7EC6    8BC3            mov     eax, ebx
005E7EC8    E8 B7BEE1FF     call    XDeskCal.00403D84
005E7ECD    8BC6            mov     eax, esi
005E7ECF    E8 B0BEE1FF     call    XDeskCal.00403D84
005E7ED4    83CB FF         or      ebx, FFFFFFFF
005E7ED7    33C0            xor     eax, eax
005E7ED9    5A              pop     edx
005E7EDA    59              pop     ecx
005E7EDB    59              pop     ecx
005E7EDC    64:8910         mov     fs:[eax], edx
005E7EDF    68 F97E5E00     push    XDeskCal.005E7EF9
005E7EE4    8D45 F0         lea     eax, ss:[ebp-10]
005E7EE7    BA 04000000     mov     edx, 4
005E7EEC    E8 CBCDE1FF     call    XDeskCal.00404CBC
005E7EF1    C3              retn

可以很明显地看到,这里是读取注册码的地方,但是跟了半天也没跟到真正验算注册码的位置,delphi的程序确实很麻烦啊。没办法,只好手动往下跟踪一下。跟了一段之后来到这里:

005F5FFE    A1 10D75F00     mov     eax, ds:[5FD710]
005F6003    8038 00         cmp     byte ptr ds:[eax], 0
005F6006    75 61           jnz     short XDeskCal.005F6069
005F6008    8B0E            mov     ecx, ds:[esi]
005F600A    B2 01           mov     dl, 1
005F600C    A1 20945C00     mov     eax, ds:[5C9420]
005F6011    E8 D2D5E9FF     call    XDeskCal.004935E8
005F6016    8B15 4CD25F00   mov     edx, ds:[5FD24C]                 ; XDeskCal.00601548
005F601C    8902            mov     ds:[edx], eax

5F6006这个跳转很可疑,先手动改一下标志位,发现前面的Nag窗口不见了,但是程序运行之后仍然是未注册版。注意到这里eax=6015AD,尝试直接改变 DS:[6015AD]的值,发现只要把这里改成01就可以保证程序是按照注册版启动的了。很好,然后对这里下硬件写入断点。但是没有找到验证注册码之后修改这里的标识,这说明注册码验证不成功就不改这里,那就看一下最后一次修改这里的语句:

005EB6EA    C605 AD156000 00 mov     byte ptr ds:[6015AD], 0
005EB6F1    68 F4B75E00     push    XDeskCal.005EB7F4                ; ASCII “tcy”
005EB6F6    FF35 24176000   push    dword ptr ds:[601724]
005EB6FC    FF35 28176000   push    dword ptr ds:[601728]
005EB702    68 00B85E00     push    XDeskCal.005EB800                ; ASCII “lovedongdong”
005EB707    8D45 DC         lea     eax, ss:[ebp-24]
005EB70A    BA 04000000     mov     edx, 4

于是,只要把5EB6EA那里赋值的语句改成mov     byte ptr ds:[6015AD], 1就应该可以了,这样,只修改一个字节,把C605AD15600000改成C605AD15600001即可,再运行程序,没有问题,是按照注册版启动的。

但是这样做仍然有一点地方有问题,就是软件主窗口的注册窗口那里,软件授权给“Unregistered”使用,尝试想改一下这里,但是不知道怎么改,以后再研究一下吧。


分类: 逆向手札 由 ssfighter 于 2006年5月6日 发表

【破文标题】对一个KeyFile的CrackMe的分析
【破文作者】ssfighter
【作者邮箱】ssfighter@gmail.com
【作者主页】
【破解工具】OllyICE、FileMon7.01、FileInfo4.01
【破解平台】WinXP
【软件名称】
【软件大小】
【原版下载】
【保护方式】
【软件简介】
【破解声明】第一次玩KeyFile的CrackMe,不是很难,但是算法设计的比较有意思
————————————————————————
这个CrackMe挺有意思的,提示给的很全:-P,不错的练手的教材。高手就不要看了

先用FileInfo侦壳,发现是UPX加的壳,OllyICE载入后停在这里:
004460F0 >  60              pushad
004460F1    BE 00104300     mov     esi, CrackMe.00431000
004460F6    8DBE 0000FDFF   lea     edi, ds:[esi+FFFD0000]
004460FC    57              push    edi
004460FD    83CD FF         or      ebp, FFFFFFFF
00446100    EB 10           jmp     short CrackMe.00446112

用ESP定律,直接到这里:
0044623E    61              popad
0044623F  – E9 D405FEFF     jmp     CrackMe.00426818
00446244    5C              pop     esp

00426818    55              push    ebp    在这里Dump即可
00426819    8BEC            mov     ebp, esp
0042681B    83C4 F4         add     esp, -0C
0042681E    E8 41C9FDFF     call    CrackMe.00403164

脱壳后可以运行,侦壳发现是Delphi编写的,而且还是比较老的Delphi编的:)
用FileMon扫描一下,发现程序需要读取的KeyFile是ctm_cm02.key。新建一个这个文件,在OllyICE中下API断点CreateFileA。从系统领空中返回到这里:
00404166    8D43 48         lea     eax, ds:[ebx+48]
00404169    50              push    eax
0040416A    E8 9DD0FFFF     call    <jmp.&kernel32.CreateFileA>
0040416F    83F8 FF         cmp     eax, -1
00404172    74 29           je      short cr1.0040419D
00404174    8903            mov     ds:[ebx], eax
00404176    5F              pop     edi
00404177    5E              pop     esi
00404178    5B              pop     ebx
00404179    C3              retn
0040417A    33C0            xor     eax, eax
0040417C    C3              retn

再返回到这里:
0042658D    E8 1EDCFDFF     call    cr1.004041B0                     ; 读取文件ctm_cm02.key
00426592    E8 4DC1FDFF     call    cr1.004026E4
00426597    85C0            test    eax, eax
00426599    0F85 66010000   jnz     cr1.00426705
0042659F    8D85 A8FEFEFF   lea     eax, ss:[ebp+FFFEFEA8]
004265A5    E8 5AD9FDFF     call    cr1.00403F04                     ; 判断文件大小
004265AA    E8 F9C0FDFF     call    cr1.004026A8
004265AF    8945 FC         mov     ss:[ebp-4], eax
004265B2    837D FC 00      cmp     dword ptr ss:[ebp-4], 0
004265B6    75 15           jnz     short cr1.004265CD004265B8    BA 64674200     mov     edx, cr1.00426764                ; key file is empty!
004265BD    8B83 B0010000   mov     eax, ds:[ebx+1B0]
004265C3    E8 CCB6FEFF     call    cr1.00411C94
004265C8    E9 28010000     jmp     cr1.004266F5
004265CD    817D FC 0000010>cmp     dword ptr ss:[ebp-4], 10000      ; UNICODE “=::=::\”
004265D4    7E 07           jle     short cr1.004265DD
004265D6    C745 FC 0000010>mov     dword ptr ss:[ebp-4], 10000      ; UNICODE “=::=::\”
004265DD    6A 00           push    0
004265DF    8D95 FCFFFEFF   lea     edx, ss:[ebp+FFFEFFFC]
004265E5    8B4D FC         mov     ecx, ss:[ebp-4]
004265E8    8D85 A8FEFEFF   lea     eax, ss:[ebp+FFFEFEA8]
004265EE    E8 71D8FDFF     call    cr1.00403E64                     ; 读取文件
004265F3    E8 B0C0FDFF     call    cr1.004026A8
004265F8    53              push    ebx
004265F9    57              push    edi
004265FA    56              push    esi
004265FB    8D75 FC         lea     esi, ss:[ebp-4]
004265FE    8B0E            mov     ecx, ds:[esi]
00426600    8DB5 FCFFFEFF   lea     esi, ss:[ebp+FFFEFFFC]
00426606    8DBD FBFFFEFF   lea     edi, ss:[ebp+FFFEFFFB]
0042660C    31C0            xor     eax, eax
0042660E    83CA FF         or      edx, FFFFFFFF
00426611    31DB            xor     ebx, ebx
00426613    40              inc     eax
00426614    F7D2            not     edx

下面就是判断序列号的地方了
00426616    8A1C16          mov     bl, ds:[esi+edx]                 ; 取序列号各位
00426619    84DB            test    bl, bl                           ; 注意这里,只有是0才可以
0042661B    74 29           je      short cr1.00426646
0042661D    E8 16000000     call    cr1.00426638
00426622    52              push    edx
00426623    F7E3            mul     ebx
00426625    5A              pop     edx
00426626    35 326D5463     xor     eax, 63546D32
0042662B    FEC2            inc     dl
0042662D    39CA            cmp     edx, ecx                         ; ecx是文件的大小
0042662F    74 42           je      short cr1.00426673
00426631    80FA FF         cmp     dl, 0FF
00426634    74 3D           je      short cr1.00426673
00426636  ^ EB DE           jmp     short cr1.00426616
可是这里的计算大概上就是去序列号的第一位乘以1,然后和63546D32异或,之后再乘以序列号第二位,然后再和63546D32异或,依次这样进行下去。

再往下看,注意刚才test bl, bl的地方,如果那里没有跳,就会跳到这里,但是只要到这里必然会到Invalid的地方。因此必须让bl=0,这也就是说明在序列号文件某处应该是00 (注意不一定是结尾,一开始我就以为是在结尾,结果把自己绕了进去)只要是00就会从上面那个循环的地方正确地跳出,不会出现Invalid的情况。

00426673    B8 02000000     mov     eax, 2
00426678    8907            mov     ds:[edi], eax
0042667A    5E              pop     esi
0042667B    5F              pop     edi
0042667C    5B              pop     ebx
0042667D    8A85 FBFFFEFF   mov     al, ss:[ebp+FFFEFFFB]
00426683    2C 01           sub     al, 1
00426685    72 08           jb      short cr1.0042668F
00426687    74 4A           je      short cr1.004266D3
00426689    FEC8            dec     al
0042668B    74 58           je      short cr1.004266E5
0042668D    EB 66           jmp     short cr1.004266F5
0042668F    BA 80674200     mov     edx, cr1.00426780                ; valid key file found!
00426694    8B83 B0010000   mov     eax, ds:[ebx+1B0]
0042669A    E8 F5B5FEFF     call    cr1.00411C94
0042669F    BA A0674200     mov     edx, cr1.004267A0                ; registered to:
004266A4    8D85 A4FEFEFF   lea     eax, ss:[ebp+FFFEFEA4]
004266AA    E8 05CCFDFF     call    cr1.004032B4
004266AF    8D85 A4FEFEFF   lea     eax, ss:[ebp+FFFEFEA4]
004266B5    8B95 F4FFFEFF   mov     edx, ss:[ebp+FFFEFFF4]
004266BB    E8 DCCCFDFF     call    cr1.0040339C
004266C0    8B95 A4FEFEFF   mov     edx, ss:[ebp+FFFEFEA4]
004266C6    8B83 C0010000   mov     eax, ds:[ebx+1C0]
004266CC    E8 C3B5FEFF     call    cr1.00411C94
004266D1    EB 22           jmp     short cr1.004266F5
004266D3    BA B8674200     mov     edx, cr1.004267B8                ; key file contains wrong serial!
004266D8    8B83 B0010000   mov     eax, ds:[ebx+1B0]
004266DE    E8 B1B5FEFF     call    cr1.00411C94
004266E3    EB 10           jmp     short cr1.004266F5
004266E5    BA E0674200     mov     edx, cr1.004267E0                ; key file is not valid!
004266EA    8B83 B0010000   mov     eax, ds:[ebx+1B0]
004266F0    E8 9FB5FEFF     call    cr1.00411C94
004266F5    8D85 A8FEFEFF   lea     eax, ss:[ebp+FFFEFEA8]
004266FB    E8 C8D7FDFF     call    cr1.00403EC8
00426700    E8 A3BFFDFF     call    cr1.004026A8

但是仅仅这样还没有完,如果从bl=0处跳转,会来到这里

0042664B    42              inc     edx
0042664C    83C2 04         add     edx, 4
0042664F    39D1            cmp     ecx, edx
这里,edx是序列号中00之前的部分,再加上4应该和ecx(也就是文件长度)相等,这说明在KeyFile中00之后还应该有4个字节,这4个字节很重要,后面将会看到。

00426651    75 20           jnz     short cr1.00426673
00426653    83EA 04         sub     edx, 4
00426656    85C0            test    eax, eax
00426658    76 02           jbe     short cr1.0042665C
0042665A    D1E8            shr     eax, 1
0042665C    3B0416          cmp     eax, ds:[esi+edx]
注意看这里,ESI指向的就是KeyFile中的内容,而ESI+EDX正好指向00之后的那四个字节,而eax是什么,前面异或算了很久的东西,再加上上一部的右移一位就是eax的内容,看到这里我们明白了,这个KeyFile实际上就是在检验00前面和00后面的东西能否对应上,前面的算法已经有了,因此只要把00后面的4个字节的东西加上就可以了。

0042665F    75 09           jnz     short cr1.0042666A
00426661    B8 00000000     mov     eax, 0
这里只有eax=0才能出现正确的提示。

00426666    8907            mov     ds:[edi], eax
00426668    EB 10           jmp     short cr1.0042667A
0042666A    B8 01000000     mov     eax, 1
0042666F    8907            mov     ds:[edi], eax
00426671    EB 07           jmp     short cr1.0042667A

好的,下面就可以自己写一个KeyFile了,计算过程比较简单,假设注册的ID是ssfighter@newsmth,写一个KeyFile如下:
73 73 66 69 67 68 74 65 72 40 6E 65 77 73 6D 74     // ssfighter@newsmt
68 00 51 30 AB 03                    // h…..

运行之后显示成功的信息。
————————————————————————
这是我第一次玩KeyFile的CrackMe,还好这个不是很难,在PYG上面看到的这个CrackMe,觉得有意思就拿来做了一下,PYG论坛上那个人写的破文分析的有点问题,我就自己写了一个破文。
————————————————————————
【版权声明】


分类: 逆向手札, 随心所记 由 ssfighter 于 2006年5月4日 发表

话说回来,这两个程序还是我上大学前就在用的呢。一个是定式讲解的,另一个是死活题的。想起来我也好久没有玩过围棋了,不知道为什么,我对围棋的感情就是那么奇怪,有一段时间爱的特别疯狂,然后又忘的差不多了,现在想起来其实还是比较喜欢下的,可是就是没有那个去找别人下棋的冲动。忽然在以前Maze下载的记录里面发现了以前下载的这两个程序,装上之后发现居然还要注册。这都哪年的软件了,居然还要收费呢。
我记得我高三毕业之后几乎天天在网上和别人下围棋,那时候经常用这两个软件来着,那时候好像是无意中在网上发现了这两个程序的注册码,现在根本不知道当初的注册码放在哪里了,于是只好自己去破解。这个Delphi程序也倒是整了我好久,用Dede根本找不到注册按钮的代码地址在哪里,用API函数也断不下来,主要是根本不知道这个破程序用的什么破API函数读的注册码的值。最好,用RegMon扫描一下,居然发现一个奇怪的键值,V0l2345(这个键太恶心了!!!一开始我看RegMon里面就把L看成了1,结果把键加上去之后发现还是找不到这个键,强烈鄙视作者的这种玩弄我们的行为^^)。然后 OllyICE打开程序,找到键值,看到了一大堆诡异的字符串,也不知道都有啥用,跟踪了半天根本不知道是怎么算出注册码的,不过软件算了那么复杂的一圈注册码最后居然还是用明码比较的,我狂ft。只好直接把明码拷贝下来填上去注册,结果果然一下就通过了,呼呼,后来再想看看这个程序的注册码是怎么算出来的,跟了半天还是一头雾水,呜呜呜。
想起来自己做好多事情都是这样的,本来很感兴趣的一个东西,总是虎头蛇尾,做了一段时间,遇到了瓶颈就不愿意再继续努力了,结果弄到最后一事无成,也许是我比较笨吧,但是好好想想我本来打算学的这些东西,羽毛球、围棋、Crack、Tex、Metapost、 javascript脚本,一大堆东西自己也都是只看了个开头,仅仅有点入门的知识,后面的东西就一窍不通了,sigh。我啥时候才能把一件事情从头至尾彻底地学好呢?受不了我自己了……