• 标 题:撰稿人宝典 V1.0
  • 作 者:fly
  • 时 间:2003/02/25 04:41pm
  • 链 接:http://bbs.pediy.com

算法分析——撰稿人宝典 V1.0

下载地址:  http://www.skycn.com/soft/10803.html
软件大小:  696 KB
软件语言:  简体中文
软件类别:  国产软件 / 共享版 / 文字处理
应用平台:  Win9x/NT/2000/XP
加入时间:  2003-02-13 12:08:02
下载次数:  136
推荐等级:  ***  
开 发 商:  http://www.simplepad.51dream.com/


【软件简介】: 一款专为撰稿人设计的字处理软件,除了有常用功能外,还有许多特色功能:1.中文字数统计:您写了多少字,可随时在状态栏察看;2.自动保存:自设保存时间间隔,最小化减少意外损失;3.自动开启输入法:您可以自由选择让软件在启动时就切换出您最熟悉的输入法;4.输入时隐藏鼠标指针;5.自动翻页:读长篇文章时可自动翻页,允许自设翻页时间;6.背景音乐播放:支持“Wave,media,mp3,wma”格式,可循环播放,更加节省系统资源;7.无限次“撤销/恢复”功能;8.三击鼠标可选中一段文字,支持托拽文字操作;9.可插入自定义文本:可自定义“信头”,“联系方法”等常用词,下次即可方便插入,一次定义,一劳永逸!10.独创“随机色彩”功能:撰稿人长时间面对白屏黑字,视觉容易疲劳,受Delphi的启发,为大家精选五种醒目但却不刺眼的颜色,输入时随机变换色彩,可以有效的缓解视疲劳。

【软件限制】:NAG

【作者声明】:初学Crack,只是感兴趣,没有其它目的。失误之处敬请诸位大侠赐教!

【破解工具】:TRW2000娃娃修改版、FI2.5、UPXWin、W32Dasm8.93黄金版

—————————————————————————————
【过    程】:

呵呵,对 MiniPad 2000感到头疼,去 天空 看到一个小东西,当然是DOWN下试试了。

—————————————————————————————
一、脱壳

word.exe是UPX 1.2壳,用UPXWin脱之。423K->1.11M。Delphi编写。


用户名:fly
申请码:103B2C1E
试炼码:1357  2468


—————————————————————————————

二、反汇编、调试

呵呵,当然是祭出倚天剑、屠龙刀了!

--------------------------------------------------------
一>、首先看看申请码的生成


:004E57A8 E8CF36F2FF              call 00408E7C
:004E57AD FF75E4                  push [ebp-1C]
:004E57B0 B838DF4E00              mov eax, 004EDF38
:004E57B5 BA04000000              mov edx, 00000004
                                 ====>4 入 EDX

:004E57BA E84DF0F1FF              call 0040480C
                                 ====>关键CALL!F8进入!

:004E57BF 8B1538DF4E00            mov edx, dword ptr [004EDF38]
:004E57C5 8B86FC020000            mov eax, dword ptr [esi+000002FC]
:004E57CB E8182CF6FF              call 004483E8
:004E57D0 33D2                    xor edx, edx
:004E57D2 8B8600030000            mov eax, dword ptr [esi+00000300]
:004E57D8 8B08                    mov ecx, dword ptr [eax]
:004E57DA FF5164                  call [ecx+64]
:004E57DD 33D2                    xor edx, edx
:004E57DF 8B86F8020000            mov eax, dword ptr [esi+000002F8]
:004E57E5 8B08                    mov ecx, dword ptr [eax]
:004E57E7 FF5164                  call [ecx+64]
:004E57EA 8D55E0                  lea edx, dword ptr [ebp-20]
:004E57ED 8B86FC020000            mov eax, dword ptr [esi+000002FC]
:004E57F3 E8C02BF6FF              call 004483B8
:004E57F8 8B4DE0                  mov ecx, dword ptr [ebp-20]

* Possible StringData Ref from Code Obj ->"IDcode"
                                 |
:004E57FB BA88584E00              mov edx, 004E5888
:004E5800 8BC3                    mov eax, ebx
:004E5802 E8B99EF8FF              call 0046F6C0
:004E5807 8D55DC                  lea edx, dword ptr [ebp-24]
:004E580A 8B86F8020000            mov eax, dword ptr [esi+000002F8]
:004E5810 E8A32BF6FF              call 004483B8
:004E5815 8B4DDC                  mov ecx, dword ptr [ebp-24]

* Possible StringData Ref from Code Obj ->"User"
                                 |
:004E5818 BA98584E00              mov edx, 004E5898
:004E581D 8BC3                    mov eax, ebx
:004E581F E89C9EF8FF              call 0046F6C0
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
进入4E57BA  call 0040480C


:0040480C 53                      push ebx
:0040480D 56                      push esi
:0040480E 57                      push edi
:0040480F 52                      push edx
:00404810 50                      push eax
:00404811 89D3                    mov ebx, edx
:00404813 31FF                    xor edi, edi
:00404815 8B4C9414                mov ecx, dword ptr [esp+4*edx+14]
                                 ====>把ESP+EDX*4+14处的内存中值移入ECX
                                 呵呵,不知道怎么表达了。希望大家指点!
                                 ====>1、00DA26F0中为10

:00404819 85C9                    test ecx, ecx
:0040481B 7406                    je 00404823
:0040481D 3908                    cmp dword ptr [eax], ecx
:0040481F 7502                    jne 00404823
:00404821 89C7                    mov edi, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040481B(C), :0040481F(C)
|
:00404823 31C0                    xor eax, eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404837(C)
|
:00404825 8B4C9414                mov ecx, dword ptr [esp+4*edx+14]
                                 ====>把ESP+EDX*4+14处的内存中值移入ECX
                                 呵呵,不知道怎么表达了。希望大家指点!

                                 ====>1、00DA26F0中为10
                                 ====>2、00DA2F6C中为3B
                                 ====>3、00DA2134中为2C
                                 ====>4、00DA5050中为1E


:00404829 85C9                    test ecx, ecx
:0040482B 7409                    je 00404836
:0040482D 0341FC                  add eax, dword ptr [ecx-04]
:00404830 39CF                    cmp edi, ecx
:00404832 7502                    jne 00404836
:00404834 31FF                    xor edi, edi

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040482B(C), :00404832(C)
|
:00404836 4A                      dec edx
                                 ====>依次减1

:00404837 75EC                    jne 00404825
                                 ====>循环4次!


呵呵,把上面的值连起来就是程序给我们的申请码!不知道为何申请码的生成具有随机性,既每次的申请码皆不同。与用户名无关!希望大家给我指点迷津!

——————————————————————————————————

二>、追注册码的算法!

查找关键提示"注册码错误"在4E5C05 ,由004E596C和004E59B3跳至!因此我们很容易就找到关键的断点了。因为想看看算法,所以把断点下在4E593E处。分别输入上面的试炼码,点“注册”,OK!拦下!


* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004E596C(C), :004E59B3(C)     < ====  向上追!
|
:004E5C03 6A10                    push 00000010

* Possible StringData Ref from Code Obj ->"注册码错误"
                                 |
:004E5C05 68185E4E00              push 004E5E18

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

BPX 4E593E   拦下!呵呵,又开始我的菜鸟学算法之旅了!


:004E593E E8752AF6FF              call 004483B8
                                 ====>拦下!
:004E5943 8B45E8                  mov eax, dword ptr [ebp-18]
:004E5946 50                      push eax
                                 ====>EAX=103B2C1E  申请码

:004E5947 8D55E4                  lea edx, dword ptr [ebp-1C]
:004E594A 8B83F8020000            mov eax, dword ptr [ebx+000002F8]
:004E5950 E8632AF6FF              call 004483B8
:004E5955 8B45E4                  mov eax, dword ptr [ebp-1C]
                                 ====> fly 入 EAX

* Possible StringData Ref from Code Obj ->"EZWord"
                                 ====>注意:EZWord
                                 
:004E5958 B9085D4E00              mov ecx, 004E5D08
                                 ====> EZWord 入 ECX

:004E595D 5A                      pop edx
:004E595E E875F9FFFF              call 004E52D8
                                 ====>运算第一部分!进入!

:004E5963 8B55EC                  mov edx, dword ptr [ebp-14]
                                 ====>结果:9e130943 入 EDX

:004E5966 58                      pop eax
                                 ====>EAX=1357 试炼码的前部分

:004E5967 E824EFF1FF              call 00404890
                                 ====>比较第一部分!进入!

:004E596C 0F8591020000            jne 004E5C03
                                 ====>跳则OVER!

:004E5972 8D55E0                  lea edx, dword ptr [ebp-20]
:004E5975 8B8318030000            mov eax, dword ptr [ebx+00000318]
:004E597B E8382AF6FF              call 004483B8
:004E5980 8B45E0                  mov eax, dword ptr [ebp-20]
:004E5983 50                      push eax
:004E5984 68FC5C4E00              push 004E5CFC
:004E5989 8D45DC                  lea eax, dword ptr [ebp-24]
:004E598C 50                      push eax
:004E598D 8D55D8                  lea edx, dword ptr [ebp-28]
:004E5990 8B83FC020000            mov eax, dword ptr [ebx+000002FC]
:004E5996 E81D2AF6FF              call 004483B8
:004E599B 8B55D8                  mov edx, dword ptr [ebp-28]
                                 ====>103B2C1E 入EDX  申请码

* Possible StringData Ref from Code Obj ->"EZWord"
                                 |
:004E599E B9085D4E00              mov ecx, 004E5D08
                                 ====> EZWord 入 ECX

:004E59A3 33C0                    xor eax, eax
:004E59A5 E82EF9FFFF              call 004E52D8
                                 ====>运算第二部分!进入!

:004E59AA 8B55DC                  mov edx, dword ptr [ebp-24]
                                 ====>结果:e4e8a4fe 入 EDX

:004E59AD 58                      pop eax
                                 ====>EAX=2468 试炼码的后部分

:004E59AE E8DDEEF1FF              call 00404890
                                 ====>比较第二部分!进入!

:004E59B3 0F854A020000            jne 004E5C03
                                 ====>跳则OVER!


&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
1、进入运算部分!4E595E   call 004E52D8
2、进入运算部分!4E59A5   call 004E52D8


* Referenced by a CALL at Addresses:
|:004E595E   , :004E59A5   , :004E59F6   , :004E5A14   , :004E5A46  
|:004E5A64   , :004E5A96   , :004E5AB4   , :004E5AE6   , :004E5B04  
|:004E8DD8   , :004E8E11   , :004E8E4A   , :004E8E83  
|
:004E52D8 55                      push ebp
:004E52D9 8BEC                    mov ebp, esp
:004E52DB 83C4EC                  add esp, FFFFFFEC
:004E52DE 53                      push ebx
:004E52DF 33DB                    xor ebx, ebx
:004E52E1 895DEC                  mov dword ptr [ebp-14], ebx
:004E52E4 895DF0                  mov dword ptr [ebp-10], ebx
:004E52E7 894DF4                  mov dword ptr [ebp-0C], ecx
:004E52EA 8955F8                  mov dword ptr [ebp-08], edx
:004E52ED 8945FC                  mov dword ptr [ebp-04], eax
:004E52F0 8B45FC                  mov eax, dword ptr [ebp-04]
:004E52F3 E83CF6F1FF              call 00404934
:004E52F8 8B45F8                  mov eax, dword ptr [ebp-08]
:004E52FB E834F6F1FF              call 00404934
:004E5300 8B45F4                  mov eax, dword ptr [ebp-0C]
:004E5303 E82CF6F1FF              call 00404934
:004E5308 8B450C                  mov eax, dword ptr [ebp+0C]
:004E530B E824F6F1FF              call 00404934
:004E5310 33C0                    xor eax, eax
:004E5312 55                      push ebp
:004E5313 687E534E00              push 004E537E
:004E5318 64FF30                  push dword ptr fs:[eax]
:004E531B 648920                  mov dword ptr fs:[eax], esp
:004E531E FF75FC                  push [ebp-04]
:004E5321 FF75F8                  push [ebp-08]
:004E5324 FF75F4                  push [ebp-0C]
:004E5327 FF750C                  push [ebp+0C]
:004E532A 8B450C                  mov eax, dword ptr [ebp+0C]
:004E532D 50                      push eax
:004E532E 8D45EC                  lea eax, dword ptr [ebp-14]
:004E5331 50                      push eax
:004E5332 8B4DF4                  mov ecx, dword ptr [ebp-0C]
:004E5335 8B55F8                  mov edx, dword ptr [ebp-08]
:004E5338 8B45FC                  mov eax, dword ptr [ebp-04]
:004E533B E840FDFFFF              call 004E5080

:004E5340 FF75EC                  push [ebp-14]
     运算第一部分!              ====>U@pg%,p`      程序自给
     运算第二部分!              ====>npnczwFj      程序自给

:004E5343 8D45F0                  lea eax, dword ptr [ebp-10]
:004E5346 BA05000000              mov edx, 00000005
:004E534B E8BCF4F1FF              call 0040480C
     运算第一部分!    ====>此CALL把用户名、申请码以及上面的U@pg%,p`连接起来
     运算第二部分!    ====>此CALL把申请码以及上面的npnczwFj连接起来

:004E5350 8B5508                  mov edx, dword ptr [ebp+08]
:004E5353 8B45F0                  mov eax, dword ptr [ebp-10]
     运算第一部分!    ====>fly103B2C1EEZWord1U@pg%,p`   入 EAX
     运算第二部分!    ====>103B2C1EEZWord1npnczwFj      入 EAX    

:004E5356 E831000000              call 004E538C
                                 ====>运算了!进入!

:004E535B 33C0                    xor eax, eax
:004E535D 5A                      pop edx
:004E535E 59                      pop ecx
:004E535F 59                      pop ecx
:004E5360 648910                  mov dword ptr fs:[eax], edx
:004E5363 6885534E00              push 004E5385

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E5383(U)
|
:004E5368 8D45EC                  lea eax, dword ptr [ebp-14]
:004E536B BA05000000              mov edx, 00000005
:004E5370 E833F1F1FF              call 004044A8
:004E5375 8D450C                  lea eax, dword ptr [ebp+0C]
:004E5378 E807F1F1FF              call 00404484
:004E537D C3                      ret

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
进入运算CALL:4E5356  call 004E538C


* Referenced by a CALL at Address:
|:004E5356  
|
:004E538C 55                      push ebp
:004E538D 8BEC                    mov ebp, esp
:004E538F 83C4F4                  add esp, FFFFFFF4
:004E5392 53                      push ebx
:004E5393 56                      push esi
:004E5394 33C9                    xor ecx, ecx
:004E5396 894DF4                  mov dword ptr [ebp-0C], ecx
:004E5399 8955F8                  mov dword ptr [ebp-08], edx
:004E539C 8945FC                  mov dword ptr [ebp-04], eax
:004E539F 8B45FC                  mov eax, dword ptr [ebp-04]
:004E53A2 E88DF5F1FF              call 00404934
:004E53A7 33C0                    xor eax, eax
:004E53A9 55                      push ebp
:004E53AA 682B544E00              push 004E542B
:004E53AF 64FF30                  push dword ptr fs:[eax]
:004E53B2 648920                  mov dword ptr fs:[eax], esp
:004E53B5 33DB                    xor ebx, ebx
:004E53B7 8B45FC                  mov eax, dword ptr [ebp-04]
     运算第一部分!     ====>fly103B2C1EEZWord1U@pg%,p` 入 EAX
     运算第二部分!     ====>103B2C1EEZWord1npnczwFj    入 EAX

:004E53BA E88DF3F1FF              call 0040474C
                        ====>求上面字符串的长度
:004E53BF 85C0                    test eax, eax
     运算第一部分!     ====>EAX=1A (即:26位)
     运算第二部分!     ====>EAX=17 (即:23位)

:004E53C1 7E2C                    jle 004E53EF

:004E53C3 BE01000000              mov esi, 00000001

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E53ED(C)
|
:004E53C8 8B55FC                  mov edx, dword ptr [ebp-04]
      运算第一部分!    ====>fly103B2C1EEZWord1U@pg%,p` 入 EDX
      运算第二部分!    ====>103B2C1EEZWord1npnczwFj    入 EDX


:004E53CB 8A5432FF                mov dl, byte ptr [edx+esi-01]
     运算第一部分!  ====>逐位从fly103B2C1EEZWord1U@pg%,p`中取字符的HEX值!
                        ====>1、DL=66
                   ……  …… 省略(共26次) …… ……

     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     运算第二部分!     ====>逐位从103B2C1EEZWord1npnczwFj中取字符的HEX值!
                        ====>1、DL=31
                   ……  …… 省略(共23次) …… ……

:004E53CF 32D3                    xor dl, bl
     运算第一部分!     ====>与 BL 进行异或! 第一次BL=0
                        ====>1、DL=66 XOR 0=66
                   ……  …… 省略(共26次) …… ……

     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     运算第二部分!     ====>与 BL 进行异或! 第一次BL=0
                        ====>1、DL=31 XOR 0=31
                   ……  …… 省略(共23次) …… ……


:004E53D1 81E2FF000000            and edx, 000000FF
:004E53D7 8B1495A4BC4E00          mov edx, dword ptr [4*edx+004EBCA4]
     运算第一部分!     ====>1、EDX=A4D1C46D
                   ……  …… 省略(共26次) …… ……

     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     运算第二部分!     ====>1、EDX=51DE003A
                   ……  …… 省略(共23次) …… ……


:004E53DE C1EB08                  shr ebx, 08
                        ====>EBX 右移8位!
                        ====>1、EBX=0

:004E53E1 81E3FFFFFF00            and ebx, 00FFFFFF
:004E53E7 33D3                    xor edx, ebx
     运算第一部分!     ====>1、EDX=A4D1C46D XOR EBX=A4D1C46D
                   ……  …… 省略(共26次) …… ……

     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     运算第二部分!     ====>1、EDX=51DE003A XOR EBX=51DE003A
                   ……  …… 省略(共23次) …… ……


:004E53E9 8BDA                    mov ebx, edx
     运算第一部分!     ====>EDX 移入 EBX

                        ====>循环26次后,EDX=9E130943
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     运算第二部分!     ====>EDX 移入 EBX

                        ====>循环23次后,EDX=E4E8A4FE

:004E53EB 46                      inc esi
                        ====>ESI 增1
:004E53EC 48                      dec eax
                        ====>EAX 减1
:004E53ED 75D9                    jne 004E53C8
     运算第一部分!     ====>继续循环!共26次!
     运算第二部分!     ====>继续循环!共23次!


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E53C1(C)
|
:004E53EF 8BC3                    mov eax, ebx
     运算第一部分!     ====>循环26次后,9E130943入EAX
             
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

     运算第二部分!     ====>循环23次后,E4E8A4FE入EAX
             


:004E53F1 33D2                    xor edx, edx
:004E53F3 52                      push edx
:004E53F4 50                      push eax
:004E53F5 8D55F4                  lea edx, dword ptr [ebp-0C]
:004E53F8 B808000000              mov eax, 00000008
:004E53FD E8B63AF2FF              call 00408EB8
:004E5402 8B45F4                  mov eax, dword ptr [ebp-0C]
:004E5405 8B55F8                  mov edx, dword ptr [ebp-08]

:004E5408 E88735F2FF              call 00408994
     运算第一部分!     ====>将9E130943中的大写字母转化为小写!
                呵呵,  9e130943就是注册码前半部分!
     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

     运算第二部分!     ====>将E4E8A4FE中的大写字母转化为小写!
                呵呵,  e4e8a4fe就是注册码后半部分!


:004E540D 33C0                    xor eax, eax
:004E540F 5A                      pop edx
:004E5410 59                      pop ecx
:004E5411 59                      pop ecx
:004E5412 648910                  mov dword ptr fs:[eax], edx
:004E5415 6832544E00              push 004E5432

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004E5430(U)
|
:004E541A 8D45F4                  lea eax, dword ptr [ebp-0C]
:004E541D E862F0F1FF              call 00404484
:004E5422 8D45FC                  lea eax, dword ptr [ebp-04]
:004E5425 E85AF0F1FF              call 00404484
:004E542A C3                      ret

——————————————————————————————————
看看真假码的比较!

1、进入比较部分!4E5967   call 00404890
2、进入比较部分!4E59AE   call 00404890


* Referenced by a CALL at Addresses:
|:0041838F   , :0041EBD2   , :004213CF   , :00427129   , :00428100  

…… …… 很多地方CALL此处! …… ……


:00404890 53                      push ebx
:00404891 56                      push esi
:00404892 57                      push edi
:00404893 89C6                    mov esi, eax
:00404895 89D7                    mov edi, edx
:00404897 39D0                    cmp eax, edx
     比较第一部分!              ====>D EAX=1357
                                 ====>D EDX=9e130943

     %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     比较第二部分!              ====>D EAX=2468
                                 ====>D EDX=e4e8a4fe


:00404899 0F848F000000            je 0040492E
:0040489F 85F6                    test esi, esi
:004048A1 7468                    je 0040490B
:004048A3 85FF                    test edi, edi
:004048A5 746B                    je 00404912
:004048A7 8B46FC                  mov eax, dword ptr [esi-04]
:004048AA 8B57FC                  mov edx, dword ptr [edi-04]
:004048AD 29D0                    sub eax, edx
:004048AF 7702                    ja 004048B3

————————————————————————————

【KeyMake之内存注册机】:fly{43th}


中断地址:4E5967
中断次数:1
第一字节:E8
指令长度:5
保存下列信息为注册码:
内存方式EDX    
结尾插入字符 -   (- 前的为注册码的前半部分,- 后的则为后半部分)


中断地址:4E59AE
中断次数:1
第一字节:E8
指令长度:5
内存方式:EDX


修改内存:

修改地址:4E596C
修改长度:6          
原始指令:0F8591020000
修改指令:909090909090

—————————————————————————————
【注册信息保存】:

REGEDIT4

[HKEY_LOCAL_MACHINE\Software\EZWord]
"IDcode"="103B2C1E"
"User"="fly"
"Code1"="9e130943"
"Code2"="e4e8a4fe"

呵呵,把这些信息存为.reg文件导入注册表中应该就是注册版了。^-^
—————————————————————————————
【整        理】:


用户名:fly
申请码:103B2C1E
注册码:9e130943  e4e8a4fe

—————————————————————————————

   
                   Cracked By 巢水工作坊——fly【OCN】

                          2003-2-18   23:34