且行且远
分类: 逆向手札 由 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”使用,尝试想改一下这里,但是不知道怎么改,以后再研究一下吧。



发表评论

昵称:  (必须)
邮件:  (必须)
网址: 
评论: