首页
社区
课程
招聘
[原创]Appointment Advisor 5.52算法分析(顺贺中秋)
2008-9-13 21:48 7769

[原创]Appointment Advisor 5.52算法分析(顺贺中秋)

CRP 活跃值
2
2008-9-13 21:48
7769
【文章标题】: Appointment Advisor 5.52算法分析
【文章作者】: CRP
【作者邮箱】: cccttt@126.com
【作者主页】: No
【作者QQ号】: 249810097
【软件名称】: Appointment Advisor 5.52
【软件大小】: 15742KB
【下载地址】: http://www.onlinedown.net/soft/72975.htm
【加壳方式】: 无壳
【保护方式】: 序列号+解锁码
【编写语言】: Borland C++ 1999 [Overlay]
【使用工具】: OD
【操作平台】: VISTA SP1
【软件介绍】: Appointment Advisor是一个易于使用的工具,跟踪和优化您的工作日程
【作者声明】: 本人乃破解界一大菜鸟,对破解只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  这是一个国外软件。按照看雪要求,必须得分析国外软件,所以费了不少力,找了一个软柿子,高手们别见笑哈。希望能申请到精华。这样,我上半年完成一篇,下半年一篇,算是完成了一个心愿。
  言归正传。安装后,先正常运行程序。点出注册框,是一个根据序列号算出解锁码的注册程式。随便输入12345678,点Validate now,显示Incorrect unlock code错误提示。


有提示,就好办了。
  用PEID侦壳,无壳,立即OD载入。查ASCII码,找字符Incorrect unlock code所在的区域代码,应该就是判断注册的关键部分。
  结果如下:
  00446297   .  BA 962A6800   mov     edx, 00682A96                    ;  incorrect unlock code
  看来,这句跳转来自 00445DB5, 00445DBD两个地方。向上跟踪,经过分析,找到以下代码段,多调试几次,就会发现00445D42处的call    004462FC为关键算法CALL。
  ==========================================
  00445CE5   .  8D55 F0       lea     edx, dword ptr [ebp-10]
  00445CE8   .  8D45 FC       lea     eax, dword ptr [ebp-4]           ;  假码
  00445CEB   .  E8 54932100   call    0065F044
  00445CF0   .  FF4D A0       dec     dword ptr [ebp-60]
  00445CF3   .  8D45 F0       lea     eax, dword ptr [ebp-10]
  00445CF6   .  BA 02000000   mov     edx, 2
  00445CFB   .  E8 14932100   call    0065F014
  00445D00   .  FF4D A0       dec     dword ptr [ebp-60]               ;  edx放假码
  00445D03   .  8D45 F4       lea     eax, dword ptr [ebp-C]
  00445D06   .  BA 02000000   mov     edx, 2
  00445D0B   .  E8 04932100   call    0065F014
  00445D10   .  66:C745 94 44>mov     word ptr [ebp-6C], 44
  00445D16   .  33C9          xor     ecx, ecx
  00445D18   .  894D EC       mov     dword ptr [ebp-14], ecx
  00445D1B   .  8D55 EC       lea     edx, dword ptr [ebp-14]
  00445D1E   .  FF45 A0       inc     dword ptr [ebp-60]
  00445D21   .  8B45 80       mov     eax, dword ptr [ebp-80]
  00445D24   .  8B80 00030000 mov     eax, dword ptr [eax+300]
  00445D2A   .  E8 31CD2100   call    <jmp.&VCL50.Mask::TCustomMaskEdi>
  00445D2F   .  8D55 EC       lea     edx, dword ptr [ebp-14]
  00445D32   .  8B12          mov     edx, dword ptr [edx]             ;  机器码
  00445D34   .  33C0          xor     eax, eax
  00445D36   .  8945 E8       mov     dword ptr [ebp-18], eax
  00445D39   .  8D4D E8       lea     ecx, dword ptr [ebp-18]
  00445D3C   .  FF45 A0       inc     dword ptr [ebp-60]
  00445D3F   .  8B45 80       mov     eax, dword ptr [ebp-80]
  00445D42   .  E8 B5050000   call    004462FC                         ;  关键算法CALL
  00445D47   .  8D55 E8       lea     edx, dword ptr [ebp-18]
  00445D4A   .  8D45 F8       lea     eax, dword ptr [ebp-8]
  00445D4D   .  E8 F2922100   call    0065F044
  00445D52   .  FF4D A0       dec     dword ptr [ebp-60]
  00445D55   .  8D45 E8       lea     eax, dword ptr [ebp-18]
  00445D58   .  BA 02000000   mov     edx, 2
  00445D5D   .  E8 B2922100   call    0065F014
  00445D62   .  FF4D A0       dec     dword ptr [ebp-60]               ;  竟然出现了真码,内存注册机可在此下断
  00445D65   .  8D45 EC       lea     eax, dword ptr [ebp-14]
  00445D68   .  BA 02000000   mov     edx, 2
  00445D6D   .  E8 A2922100   call    0065F014
  00445D72   .  8B45 FC       mov     eax, dword ptr [ebp-4]
  00445D75   .  E8 FEA72100   call    <jmp.&VCL50.Sysutils::StrToInt>
  00445D7A   .  8BF0          mov     esi, eax
  00445D7C   .  8B45 F8       mov     eax, dword ptr [ebp-8]
  00445D7F   .  E8 F4A72100   call    <jmp.&VCL50.Sysutils::StrToInt>  ;  比较
  00445D84   .  8BC8          mov     ecx, eax
  00445D86   .  8BFE          mov     edi, esi
  00445D88   .  2BF9          sub     edi, ecx
  00445D8A   .  8BC7          mov     eax, edi
  00445D8C   .  99            cdq
  00445D8D   .  33C2          xor     eax, edx
  00445D8F   .  2BC2          sub     eax, edx
  00445D91   .  8985 74FFFFFF mov     dword ptr [ebp-8C], eax
  00445D97   .  66:C745 94 14>mov     word ptr [ebp-6C], 14
  00445D9D   .  EB 0D         jmp     short 00445DAC
  00445D9F   .  33DB          xor     ebx, ebx
  00445DA1   .  66:C745 94 34>mov     word ptr [ebp-6C], 34
  00445DA7   .  E8 F8D72100   call    <jmp.&CC3250MT._CatchCleanup>
  00445DAC   >  8B85 74FFFFFF mov     eax, dword ptr [ebp-8C]
  00445DB2   .  83F8 02       cmp     eax, 2
  00445DB5   .  0F8D D6040000 jge     00446291                         ;  跳走则注册不成功
  00445DBB   .  84DB          test    bl, bl
  00445DBD   .  0F84 CE040000 je      00446291                         ;  跳走则注册不成功
  00445DC3   .  8B15 A8B56C00 mov     edx, dword ptr [6CB5A8]
  00445DC9   .  C682 550A0000>mov     byte ptr [edx+A55], 1
  ==================================================
  
  进入CALL 004462FC,分析如下:
  ====================================================================================================
  004462FC   $  55            push    ebp                              ;  关键算法CALL入口
  004462FD   .  8BEC          mov     ebp, esp
  004462FF   .  83C4 B8       add     esp, -48
  00446302   .  B8 302F6800   mov     eax, 00682F30
  00446307   .  53            push    ebx
  00446308   .  56            push    esi
  00446309   .  57            push    edi
  0044630A   .  894D F0       mov     dword ptr [ebp-10], ecx
  0044630D   .  8955 FC       mov     dword ptr [ebp-4], edx
  00446310   .  E8 2F4E2000   call    0064B144                         ;  机器码入栈
  00446315   .  C745 E8 01000>mov     dword ptr [ebp-18], 1
  0044631C   .  8D55 FC       lea     edx, dword ptr [ebp-4]
  0044631F   .  8D45 FC       lea     eax, dword ptr [ebp-4]
  00446322   .  E8 158B2100   call    0065EE3C
  00446327   .  FF45 E8       inc     dword ptr [ebp-18]
  0044632A   .  33D2          xor     edx, edx
  0044632C   .  66:C745 DC 08>mov     word ptr [ebp-24], 8
  00446332   .  66:C745 DC 14>mov     word ptr [ebp-24], 14
  00446338   .  8955 F8       mov     dword ptr [ebp-8], edx
  0044633B   .  8D55 F8       lea     edx, dword ptr [ebp-8]
  0044633E   .  FF45 E8       inc     dword ptr [ebp-18]
  00446341   .  8D45 FC       lea     eax, dword ptr [ebp-4]
  00446344   .  E8 8B8F2100   call    0065F2D4
  00446349   .  66:C745 DC 08>mov     word ptr [ebp-24], 8
  0044634F   .  68 00003F40   push    403F0000
  00446354   .  6A 00         push    0
  00446356   .  68 00000040   push    40000000                         ;  ASCII "MZP"
  0044635B   .  6A 00         push    0
  0044635D   .  E8 56D32100   call    <jmp.&CC3250MT._pow>
  00446362   .  83C4 10       add     esp, 10
  00446365   .  D825 10654400 fsub    dword ptr [446510]
  0044636B   .  DD5D BC       fstp    qword ptr [ebp-44]
  0044636E   .  66:C745 DC 20>mov     word ptr [ebp-24], 20
  00446374   .  8B45 F8       mov     eax, dword ptr [ebp-8]
  00446377   .  E8 FCA12100   call    <jmp.&VCL50.Sysutils::StrToInt>
  0044637C   .  66:C745 DC 08>mov     word ptr [ebp-24], 8
  00446382   .  8BD8          mov     ebx, eax
  00446384   .  EB 10         jmp     short 00446396
  00446386   .  BB 659A4501   mov     ebx, 1459A65
  0044638B   .  66:C745 DC 28>mov     word ptr [ebp-24], 28
  00446391   .  E8 0ED22100   call    <jmp.&CC3250MT._CatchCleanup>
  00446396   >  83FB 05       cmp     ebx, 5
  00446399   .  7D 05         jge     short 004463A0
  0044639B   .  BB 659A4501   mov     ebx, 1459A65
  004463A0   >  8BCB          mov     ecx, ebx                         ;  ecx=038E908C XOR 12214336 = 11AFD3BA
  004463A2   .  81F1 36432112 xor     ecx, 12214336                    ;  ecx入机器码的16制数
  004463A8   .  8BC1          mov     eax, ecx
  004463AA   .  99            cdq
  004463AB   .  33C2          xor     eax, edx
  004463AD   .  2BC2          sub     eax, edx
  004463AF   .  8BD8          mov     ebx, eax
  004463B1   .  8BCB          mov     ecx, ebx
  004463B3   .  81C9 61341221 or      ecx, 21123461                    ;  11AFD3BA OR 21123461 =31BFF7FB
  004463B9   .  8BC1          mov     eax, ecx
  004463BB   .  99            cdq
  004463BC   .  33C2          xor     eax, edx
  004463BE   .  2BC2          sub     eax, edx
  004463C0   .  8BD8          mov     ebx, eax                         ;  11AFD3BA
  004463C2   .  895D B8       mov     dword ptr [ebp-48], ebx
  004463C5   .  DB45 B8       fild    dword ptr [ebp-48]               ;  浮点加载整数
  004463C8   .  DD5D C4       fstp    qword ptr [ebp-3C]               ;  fstp弹栈,将st0弹出,ST7存放
  004463CB   .  DD45 C4       fld     qword ptr [ebp-3C]               ;  浮点加载
  004463CE   .  D80D 14654400 fmul    dword ptr [446514]               ;  浮点乘法
  004463D4   .  DD5D C4       fstp    qword ptr [ebp-3C]
  004463D7   .  EB 09         jmp     short 004463E2
  004463D9   >  DD45 C4       fld     qword ptr [ebp-3C]
  004463DC   .  DC65 BC       fsub    qword ptr [ebp-44]
  004463DF   .  DD5D C4       fstp    qword ptr [ebp-3C]               ;  相减
  004463E2   >  DD45 C4       fld     qword ptr [ebp-3C]               ;  29213255505
  004463E5   .  DC5D BC       fcomp   qword ptr [ebp-44]
  004463E8   .  DFE0          fstsw   ax                               ;  保存状态字的值到AX
  004463EA   .  9E            sahf                                     ;  恢复标志
  004463EB   .^ 77 EC         ja      short 004463D9                   ;  大于或等于则继续相减,直接差小于2147483647
  004463ED   .  DD45 C4       fld     qword ptr [ebp-3C]
  004463F0   .  E8 39D22100   call    <jmp.&CC3250MT.__ftol>
  004463F5   .  8BD8          mov     ebx, eax                         ;  eax=4D3EE75E(十进制:1295968094)
  004463F7   .  8BCB          mov     ecx, ebx
  004463F9      81F1 10567081 xor     ecx, 81705610                    ;  ecx=4D3EE75E xor  81705610
  004463FF   .  8BC1          mov     eax, ecx
  00446401   .  99            cdq
  00446402   .  33C2          xor     eax, edx
  00446404   .  2BC2          sub     eax, edx
  00446406   .  8BD8          mov     ebx, eax
  00446408   .  895D B8       mov     dword ptr [ebp-48], ebx          ;  33B14EB2存入EBP-48,即存于0012EB74
  0044640B   .  DB45 B8       fild    dword ptr [ebp-48]               ;  浮点加载
  0044640E   .  DD5D C4       fstp    qword ptr [ebp-3C]               ;  以浮点数弹出
  00446411   .  DB2D 18654400 fld     tbyte ptr [446518]               ;  加载实数ds:[00446518]=0.0454545454545454528
  00446417   .  DC4D C4       fmul    qword ptr [ebp-3C]               ;  
  0044641A   .  DD5D C4       fstp    qword ptr [ebp-3C]
  0044641D   .  EB 09         jmp     short 00446428
  0044641F   >  DD45 C4       fld     qword ptr [ebp-3C]
  00446422   .  DC65 BC       fsub    qword ptr [ebp-44]
  00446425   .  DD5D C4       fstp    qword ptr [ebp-3C]
  00446428   >  DD45 C4       fld     qword ptr [ebp-3C]
  0044642B   .  DC5D BC       fcomp   qword ptr [ebp-44]
  0044642E   .  DFE0          fstsw   ax
  00446430   .  9E            sahf
  00446431   .^ 77 EC         ja      short 0044641F               ;  大于或等于则继续相减,直接差小于2147483647      
  00446433   .  DD45 C4       fld     qword ptr [ebp-3C]
  00446436   .  E8 F3D12100   call    <jmp.&CC3250MT.__ftol>
  0044643B   .  8BD8          mov     ebx, eax
  0044643D   .  8BCB          mov     ecx, ebx
  0044643F   .  81C9 22221111 or      ecx, 11112222
  00446445   .  8BC1          mov     eax, ecx
  00446447   .  99            cdq
  00446448   .  33C2          xor     eax, edx                         ;  
  0044644A   .  2BC2          sub     eax, edx
  0044644C   .  8BD8          mov     ebx, eax                         ;  ebx=1359A3B3,堆栈 ss:[0012EB74]=33B14EB2
  0044644E   .  895D B8       mov     dword ptr [ebp-48], ebx          ;  堆栈 ss:[0012EB74]=1359A3B3 (十进制 324641715.)
  00446451   .  DB45 B8       fild    dword ptr [ebp-48]
  00446454   .  DD5D C4       fstp    qword ptr [ebp-3C]
  00446457   .  DD45 C4       fld     qword ptr [ebp-3C]
  0044645A   .  D80D 24654400 fmul    dword ptr [446524]               ;  st=324641715.00000000000,ds:[00446524]=30.00000,作乘法
  00446460   .  DD5D C4       fstp    qword ptr [ebp-3C]
  00446463   .  EB 09         jmp     short 0044646E
  00446465   >  DD45 C4       fld     qword ptr [ebp-3C]
  00446468   .  DC65 BC       fsub    qword ptr [ebp-44]
  0044646B   .  DD5D C4       fstp    qword ptr [ebp-3C]
  0044646E   >  DD45 C4       fld     qword ptr [ebp-3C]
  00446471   .  DC5D BC       fcomp   qword ptr [ebp-44]
  00446474   .  DFE0          fstsw   ax
  00446476   .  9E            sahf
  00446477   .^ 77 EC         ja      short 00446465
  00446479   .  DD45 C4       fld     qword ptr [ebp-3C]               ;  注意这个结果,里面有解锁真码
  0044647C   .  E8 ADD12100   call    <jmp.&CC3250MT.__ftol>
  00446481   .  8BD8          mov     ebx, eax                         ;  含真码的
  00446483   .  B9 E8030000   mov     ecx, 3E8                         ;  3EB = 十进制 1000
  00446488   .  8BC3          mov     eax, ebx
  0044648A   .  99            cdq                                      ;  CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)
  0044648B   .  F7F9          idiv    ecx                              ;  整数3E8,即十进制除以1000,相当于左移3位,eax处为真码
  0044648D   .  66:C745 DC 2C>mov     word ptr [ebp-24], 2C            ;  2C存入0012EB98
  00446493   .  8BD8          mov     ebx, eax                         ;  此处EBX存放真正的注册码
  =====================================================================================================================
  
  下面,我用我机器上实际运算过程,来分析下如何由机器码,算出解锁码的。
  
  我的电脑机器是59674764,由注册程序提供。
  
  首先,038E908C XOR 12214336 = 11AFD3BA
  11AFD3BA 再与 21123461(固定值)相OR,得到31BFF7FB(十进制:834664443),存于0012EB74
  
  其次,834664443 * ds:[00446514]=35.00000 = 29213255505
  计算出的值,与2147483647.000000比较大小,大于或等于则继续计算,过程如下:
  
  29213255505 - 2147483647 =27065771858
  
  27065771858 - 2147483647 = 24918288211
  
  24918288211 - 2147483647 = 22770804564
  
  22770804564 -2147483647 = 20623320917
  
  ……
  3443451741 -2147483647 =  1295968094
  
  结果1295968094小于2147483647,则程序不再跳转,执行一步运算。
  
  1295968094(十六进制4D3EE75E) XOR 81705610(固定值)= CC4EB14E
  
  再由CC4EB14E XOR FFFFFFFF = 33B14EB1
  
  33B14EB1 - FFFFFFFF = 33B14EB2(十进制:867258034)
  
  将结果33B14EB2存于[EBP-48]=0012EB74处,
  
  取实数ds:[00446518]=0.0454545454545454528
  
  将867258034.0000000(十六进制) * 0.0454545454545454528 = 39420819.727272729600(放入st),
  
  将st=39420819.727272724480与堆栈 ss:[0012EB78]=2147483647.000000比较
  没有实现,继续执行下一行代码
  然后,02598393(十进制39420819)OR 11112222 = 1359A3B3
  
  将1359A3B3(十进制324641715)放入st=324641715.00000000000,
  与ds:[00446524]=30.00000作乘法,结果st=9739251449.9999989760
  
  st=9739251449.9999989760与堆栈 ss:[0012EB78]=2147483647.000000比较大小
  大于或等于则作相减运算,
  9739251449.9999989760 -2147483647.000000 =7591767802.999998976
  7591767802.999998976 - 2147483647.000000  =5444284155.999998976
  5444284155.999998976 - 2147483647.000000 =3296800508.999998976
  3296800508.999998976 - 2147483647.000000 = 1149316861.999998976
  
  44812EFE(十进制1149316862)左移3位,得真正的解锁码为1149316(十进制)。
注册成功后,会在注册表中Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Coon Creek Software]

[HKEY_LOCAL_MACHINE\SOFTWARE\Coon Creek Software\AppAdvisor]

[HKEY_LOCAL_MACHINE\SOFTWARE\Coon Creek Software\AppAdvisor\5.0]
生成注册信息。其中,Last_access存放注册成功解锁码(非明码)
  


--------------------------------------------------------------------------------
【经验总结】
  总的感觉,难度不高,但稍显烦琐。思路是由注册错误提示,找出注册关键部分,进而找出算法CALL,再进行算法分析。
  由于本人也是初学,所以请高手多多指点。
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2008年09月13日 21:53:43

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (13)
雪    币: 83295
活跃值: (198380)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
linhanshi 2008-9-13 22:17
2
0
support.
雪    币: 248
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
CRP 2 2008-9-13 22:20
3
0
THX。近来论坛人气又越来越好了,可喜可贺。我现在仍是菜鸟一个,每次上来都是如饥似渴看那些高手们讨论,感觉差距真的太大了。希望高手们多多指点,当然,更多还是靠自己努力。我也正在努力,感谢支持!
雪    币: 337
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
nbw 24 2008-9-13 22:48
4
0
中秋快乐 !
雪    币: 248
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
CRP 2 2008-9-13 22:52
5
0
same to you & all !
雪    币: 248
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
CRP 2 2008-9-13 23:08
6
0
谢谢各位帮我实现第2篇精华的目标。这是我中秋最好的礼物了!THX ALL
雪    币: 83295
活跃值: (198380)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
linhanshi 2008-9-13 23:11
7
0
Thank you very much for the support of the Forum, hope to continue to work hard.
雪    币: 83295
活跃值: (198380)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
linhanshi 2008-9-13 23:14
8
0
I wish a happy Mid-Autumn Festival, one more round full moon!

ALL.
雪    币: 248
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
CRP 2 2008-9-13 23:16
9
0
No problem, I need to have sufficient time.
Never give up.
雪    币: 308
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
痞子辉 1 2008-9-13 23:50
10
0
牛!!!!!
雪    币: 322
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
wuhanqi 5 2008-9-14 20:28
11
0
there's no full moon in the sky in shanghai, my god!
雪    币: 471
活跃值: (3057)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
xss 4 2008-9-14 21:34
12
0
浮点运算,比较头大
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chyichin 2008-9-15 10:48
13
0
目前对我来说很难 呵呵
请教LZ    不是VISTA下的eax 是rax什么来的吗 还有ecx-->rcx  好像说64位系统是这样
雪    币: 248
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
CRP 2 2008-9-15 19:17
14
0
回chiyichin:目前我也是第一次在VISTA下调试,是32位的,还没有遇到你说的这些问题。感觉和XP下调试没什么两样。
游客
登录 | 注册 方可回帖
返回