其实这个桌面日历秀还是挺好用的,个人觉得不比雪狐桌面精灵差,但是这个是共享版的,而且有比较烦人的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”使用,尝试想改一下这里,但是不知道怎么改,以后再研究一下吧。
评论