• 标 题:文字处理大师 3.0 破解~~~附注册机 (17千字)
  • 作 者:Sam.com
  • 时 间:2002-3-24 5:29:49
  • 链 接:http://bbs.pediy.com

名称:文字处理大师(TextFile) 3.0
下载:http://www.esoftware.com.cn/file/utility/reader/2002032101.shtml

简介:
    主要是对文本和数据库的各种处理,如:在每一行之前(或某个位址)加上某一字符串,强大的替换功能,在多文件中查找的功能,处理从网页中复制粘贴来的文字中的特殊字符,挺有用的一些功能

限制:
    未注册的“文字处理大师”使用上会有一些限制,一是会禁用某一功能,这一被禁用的功能是随机抽出来的,重新开启程序后,初禁用的功能可能会变为另一个。所以说未注册的用户也是可以完全使用本程序的功能的,只是在使用在有一些不便。

为何发布注册机:
    (Readme中原文)“文本处理大师”其实对未注册版并没有太多的限制,但是还是有极少数.分子.发布它的破解版。我们必须说明的是,这些破解都是不完全的,破解人仅仅是做到将“未注册”这个提示及操作灰显去掉而已,我们的数据处理和加密是密不可分的破解人去掉了这些也就去掉了某一些的功能,并且有可能触发“文本处理大师”的陷井,所以在此提醒各位用户切勿使用盗版以免数据破坏。


    开始~~~~~~~~程序是用delphi开发的,我不大喜欢delphi的软件,老觉得它重复执行一些无用的命令,毫无效率,也许是作者故意放的垃圾代码.进入后程序显示[未注册],点注册,此程序注册有点特别,填入资料后无确定键可按,直接退出程序后再进入,如正确程序显示[正式版]

    破解思路:如果你一开始就将它反汇编(未加壳)查找以上特征字串的话,你会看到Code 2的代码,仔细调试可以找到比较的地方,不过比较的数据全为0,通常你会去调试00524255和0052425F两个地方,因为下面有跳转,这样你会什么都找不到,或者你会爆破,但你看了作者的话后还会这样做吗?在很多东西还是未知数的情况下只能用动态的bpm老方法了,调试过程中一不小心让我看到了GetPrivateProfileString函数,呵呵,程序在读INI文件,不过还是挺难追的,可能是我机器里装了太多东西影响了调试吧.终于让我确定了它的核心地方,请先看Code 1和Code 2两个地方,在Code 2的地方往上一点你可以看到"sys1.ini"字符串(我没贴出来),不用说Code 2是程序启动时运行的,Code 1是程序退出时运行的,因为我们还没有注册,当然在Code 2处是看不到比较的啦.好啦往下看~~

==Code 1==================================================================
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004CF749(C)
|
:004CF7B8 E84F6D0500              call 0052650C      <---这里是核心
:004CF7BD 8B45F8                  mov eax, dword ptr [ebp-08]
:004CF7C0 50                      push eax
:004CF7C1 8D55F0                  lea edx, dword ptr [ebp-10]
:004CF7C4 A138CE5200              mov eax, dword ptr [0052CE38]
:004CF7C9 8B8000030000            mov eax, dword ptr [eax+00000300]
:004CF7CF E8B478F7FF              call 00447088
:004CF7D4 8B55F0                  mov edx, dword ptr [ebp-10]
:004CF7D7 58                      pop eax
:004CF7D8 E88B56F3FF              call 00404E68
:004CF7DD 755A                    jne 004CF839
:004CF7DF 8D55EC                  lea edx, dword ptr [ebp-14]
:004CF7E2 A138CE5200              mov eax, dword ptr [0052CE38]
:004CF7E7 8B8000030000            mov eax, dword ptr [eax+00000300]
:004CF7ED E89678F7FF              call 00447088
:004CF7F2 8B45EC                  mov eax, dword ptr [ebp-14]
:004CF7F5 50                      push eax
:004CF7F6 A1ACBA5200              mov eax, dword ptr [0052BAAC]
:004CF7FB 8B00                    mov eax, dword ptr [eax]

* Possible StringData Ref from Code Obj ->"注册码"
                                  |
:004CF7FD B978F84C00              mov ecx, 004CF878

* Possible StringData Ref from Code Obj ->"注册"
                                  |
:004CF802 BA88F84C00              mov edx, 004CF888
:004CF807 8B18                    mov ebx, dword ptr [eax]
:004CF809 FF5304                  call [ebx+04]
:004CF80C 8D55E8                  lea edx, dword ptr [ebp-18]
:004CF80F A138CE5200              mov eax, dword ptr [0052CE38]
:004CF814 8B80F8020000            mov eax, dword ptr [eax+000002F8]
:004CF81A E86978F7FF              call 00447088
:004CF81F 8B45E8                  mov eax, dword ptr [ebp-18]
:004CF822 50                      push eax
:004CF823 A1ACBA5200              mov eax, dword ptr [0052BAAC]
:004CF828 8B00                    mov eax, dword ptr [eax]

* Possible StringData Ref from Code Obj ->"用户名"
                                  |
:004CF82A B998F84C00              mov ecx, 004CF898

* Possible StringData Ref from Code Obj ->"注册"
                                  |
:004CF82F BA88F84C00              mov edx, 004CF888
:004CF834 8B18                    mov ebx, dword ptr [eax]
:004CF836 FF5304                  call [ebx+04]

==Code 2==================================================================
* Possible StringData Ref from Code Obj ->"用户名"
                                  |
:00524218 B954475200              mov ecx, 00524754

* Possible StringData Ref from Code Obj ->"注册"
                                  |
:0052421D BA64475200              mov edx, 00524764
:00524222 A110825300              mov eax, dword ptr [00538210]
:00524227 8B18                    mov ebx, dword ptr [eax]
:00524229 FF13                    call dword ptr [ebx]
:0052422B 6A00                    push 00000000
:0052422D 8D45F8                  lea eax, dword ptr [ebp-08]
:00524230 50                      push eax

* Possible StringData Ref from Code Obj ->"注册码"
                                  |
:00524231 B974475200              mov ecx, 00524774

* Possible StringData Ref from Code Obj ->"注册"
                                  |
:00524236 BA64475200              mov edx, 00524764
:0052423B A110825300              mov eax, dword ptr [00538210]
:00524240 8B18                    mov ebx, dword ptr [eax]
:00524242 FF13                    call dword ptr [ebx]
:00524244 8D55E4                  lea edx, dword ptr [ebp-1C]
:00524247 8B45FC                  mov eax, dword ptr [ebp-04]
:0052424A E8BD220000              call 0052650C      <---这里才是核心
:0052424F 8B45E4                  mov eax, dword ptr [ebp-1C]
:00524252 8B55F8                  mov edx, dword ptr [ebp-08]
:00524255 E80E0CEEFF              call 00404E68
:0052425A 7511                    jne 0052426D
:0052425C 8B45FC                  mov eax, dword ptr [ebp-04]
:0052425F E8C00AEEFF              call 00404D24
:00524264 83F802                  cmp eax, 00000002
:00524267 0F8D2E020000            jnl 0052449B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0052425A(C)
|
:0052426D 8D55E0                  lea edx, dword ptr [ebp-20]
:00524270 8BC6                    mov eax, esi
:00524272 E8112EF2FF              call 00447088
:00524277 8D45E0                  lea eax, dword ptr [ebp-20]

* Possible StringData Ref from Code Obj ->" - [未注册]"


==Step 1=================================================================
注意在调试过程中我是先找到核心部分才找到Code 1和Code 2的,我们先进来看看

* Referenced by a CALL at Addresses:
|:004CF7B8  , :0052424A          <------=====:-)
|
:0052650C 55                      push ebp
:0052650D 8BEC                    mov ebp, esp
:0052650F 83C4F8                  add esp, FFFFFFF8
:00526512 53                      push ebx
:00526513 56                      push esi
:00526514 57                      push edi
:00526515 33C9                    xor ecx, ecx
:00526517 894DF8                  mov dword ptr [ebp-08], ecx
:0052651A 8BDA                    mov ebx, edx
:0052651C 8945FC                  mov dword ptr [ebp-04], eax
:0052651F 8B45FC                  mov eax, dword ptr [ebp-04]
:00526522 E8E5E9EDFF              call 00404F0C
:00526527 33C0                    xor eax, eax
:00526529 55                      push ebp
:0052652A 68AA655200              push 005265AA
:0052652F 64FF30                  push dword ptr fs:[eax]
:00526532 648920                  mov dword ptr fs:[eax], esp
:00526535 8BC3                    mov eax, ebx
:00526537 8B55FC                  mov edx, dword ptr [ebp-04]
:0052653A E881E5EDFF              call 00404AC0
:0052653F 8BC3                    mov eax, ebx
:00526541 E826E5EDFF              call 00404A6C
:00526546 8B45FC                  mov eax, dword ptr [ebp-04]
:00526549 E8D6E7EDFF              call 00404D24
:0052654E 8BF0                    mov esi, eax
:00526550 85F6                    test esi, esi
:00526552 7E29                    jle 0052657D
:00526554 BF01000000              mov edi, 00000001

-------------------------------------------------------------------
这一小段就是算出注册码的地方,请在此处设断,我的注册名 Sam Von

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0052657B(C)
|
:00526559 8B45FC                  mov eax, dword ptr [ebp-04]
:0052655C 8A4438FF                mov al, byte ptr [eax+edi-01]<---取注册名的第一位
:00526560 346E                    xor al, 6E      <---xor掉,al=3D
:00526562 25FF000000              and eax, 000000FF
:00526567 8D55F8                  lea edx, dword ptr [ebp-08]
:0052656A E89D30EEFF              call 0040960C    <---进去,请先跳到Step 2处
:0052656F 8B55F8                  mov edx, dword ptr [ebp-08]
:00526572 8BC3                    mov eax, ebx
:00526574 E8B3E7EDFF              call 00404D2C    <---保存注册码
:00526579 47                      inc edi
:0052657A 4E                      dec esi          <---循环n次,n是注册名的长度
:0052657B 75DC                    jne 00526559
------------------------------------------------------------------

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00526552(C)
|                                                      这里下d *ebx就可看到最后得到的字符串
:0052657D 53                      push ebx        <---"61153785610"这个是正确的注册码吗?不!
:0052657E 8B03                    mov eax, dword ptr [ebx]
:00526580 B906000000              mov ecx, 00000006
:00526585 BA01000000              mov edx, 00000001
:0052658A E8EDE9EDFF              call 00404F7C    <---里面就是比较的地方,看上面ecx=6,不管你上面
:0052658F 33C0                    xor eax, eax        的结果是多长,程序最多取6位,自己跟进去看看
:00526591 5A                      pop edx              我的注册码是611537
:00526592 59                      pop ecx
:00526593 59                      pop ecx
:00526594 648910                  mov dword ptr fs:[eax], edx
:00526597 68B1655200              push 005265B1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005265AF(U)
|
:0052659C 8D45F8                  lea eax, dword ptr [ebp-08]
:0052659F BA02000000              mov edx, 00000002
:005265A4 E8E7E4EDFF              call 00404A90
:005265A9 C3                      ret


==Step 2=================================================================
为了节约版面,之前的一大段我认为是垃圾的代码略掉,如果你不先在0052656A处设断而在这里设断的话,你会发现程序会经常调用这个地方.

0187:0040A156 B90A000000      MOV      ECX,0A
0187:0040A15B 8D759F          LEA      ESI,[EBP-61]
0187:0040A15E 31D2            XOR      EDX,EDX
0187:0040A160 F7F1            DIV      ECX      <---这时eax=3D,相当于注册名的第一位
0187:0040A162 80C230          ADD      DL,30    <---dl=1,
0187:0040A165 80FA3A          CMP      DL,3A
0187:0040A168 7203            JC      0040A16D
0187:0040A16A 80C207          ADD      DL,07
0187:0040A16D 4E              DEC      ESI
0187:0040A16E 8816            MOV      [ESI],DL  <---保存,d esi可看到字符"1"
0187:0040A170 09C0            OR      EAX,EAX  <---如果eax不为0的话就往上跳
0187:0040A172 75EA            JNZ      0040A15E  <---注册名的第一位算出了字符串"61"
0187:0040A174 8D4D9F          LEA      ECX,[EBP-61]
0187:0040A177 29F1            SUB      ECX,ESI
0187:0040A179 8B55DC          MOV      EDX,[EBP-24]
0187:0040A17C 83FA10          CMP      EDX,BYTE +10
0187:0040A17F 7601            JNA      0040A182
0187:0040A181 C3              RET
从这里返回后再经过一段垃圾,我们回到了Step 1处,需要注意的是,在调试时,程序会经过很多次循环,通常第一次循环完后就可以找到它保存注册码的地址,但有些程序的注册码是一部分一部分产生的,它保存的地址在第n次循环时可能会变,特别是delphi做的软件,我试过好几个都是这样,最好是在它保存注册码的Call处设断,不要每次都用F10带过,这样很容易跟丢的.现在我们回到Step 1

==End====================================================================

其实程序的算法并不难,只不过不容易找到而已,下面讲一点小技巧:
=========================================================================
象delphi这样的程序有很多过程好象都是没用的(个人认为),上面的Step 2是经过了好大一段代码才找到的,我在第一次调试时看到内存里的不少数据,如我发贴问过的-663098319(25 64 00 00),总认为它们会参于运算,但最终运算就一点关系都没有,那在第一次调试时当我们发现某个Call里做的事情基本可以确定与算法无关,我们就把它记在纸上,以后再遇上时就用F10代过,这样可以省不少功夫,也不会被程序搞晕了头.如果要确定一个Call有无作用,一般可在进入Call之前看看各寄存器指向的地址是否指向我们的注册名或注册码等,另外象Step 1中我的注册名第一位"S" xor 6E=3D,这个3D一定要留意,看到它的出现,就离成功很近了.

如下这一段基本无用,只是将注册码保存而已!

:00404D2C 85D2                    test edx, edx
:00404D2E 743F                    je 00404D6F
:00404D30 8B08                    mov ecx, dword ptr [eax]
:00404D32 85C9                    test ecx, ecx
:00404D34 0F8486FDFFFF            je 00404AC0
:00404D3A 53                      push ebx
:00404D3B 56                      push esi
:00404D3C 57                      push edi
:00404D3D 89C3                    mov ebx, eax
:00404D3F 89D6                    mov esi, edx
:00404D41 8B79FC                  mov edi, dword ptr [ecx-04]
:00404D44 8B56FC                  mov edx, dword ptr [esi-04]
:00404D47 01FA                    add edx, edi
:00404D49 39CE                    cmp esi, ecx
:00404D4B 7417                    je 00404D64
:00404D4D E856030000              call 004050A8
:00404D52 89F0                    mov eax, esi
:00404D54 8B4EFC                  mov ecx, dword ptr [esi-04]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404D6D(U)
|
:00404D57 8B13                    mov edx, dword ptr [ebx]
:00404D59 01FA                    add edx, edi
:00404D5B E8A8DCFFFF              call 00402A08  <---进去看看,请看Call 1
:00404D60 5F                      pop edi
:00404D61 5E                      pop esi
:00404D62 5B                      pop ebx
:00404D63 C3                      ret
==Call 1================================================================
* Referenced by a CALL at Addresses:
|:004027BD  , :00402F37  , :004030F2  , :0040310C  , :00404ADB 
|:00404B78  , :00404D16  , :00404D5B  , :00404DAE  , :00404DBD 
|:00404E40  , :00404F49  , :00404FED  , :00405048  , :00405055 
|:004050F8  , :0040536C  , :0040537A  , :004053BF  , :00405527 
|:0040577F  , :00405868  , :00406216  , :00406385  , :004093FC 
|:00409432  , :0040956C  , :00409C0C  , :0040B499  , :0041931C 
|:004194AA  , :00419920  , :0041AB0C  , :0041AB2A  , :0041B517 
|:0041B7A0  , :0041C04E  , :0041C1E5  , :00422AC1  , :00424206 
|:004267EF  , :004269D5  , :00428BC4  , :00429CAA  , :004355E3 
|:0043F71A  , :004404BA  , :00481F9B  , :00481FB8  , :0048B6B7 
|:0048C6B8  , :00498F72  , :0049CA50  , :0049CB36  , :004A1E59 
|:004A1EA8  , :004A1F54  , :004A48D7  , :004A4955  , :004A505F 
|:004A50AC  , :004A56DE  , :004A56F9  , :004A8107  , :004A87DF 
|:004B71D1  , :004B73AC  , :004B7874  , :004B788A  , :004B7D13 
|:004B9601  , :004BB6D6  , :004BB7B6  , :0050760C  , :0050A913 
|:0050ACCA  , :0050AE4E  , :0050B1D3  , :0050B1F7  , :0050C057 
|:0050C1B1  , :0050C1CB  , :0050C2FE  , :0050C34A  , :0050C90F 
|:0050E871  , :0051375D  <-----=====哇~~~~~~~~~~~~~
|
:00402A08 56                      push esi
:00402A09 57                      push edi
:00402A0A 89C6                    mov esi, eax
:00402A0C 89D7                    mov edi, edx
:00402A0E 89C8                    mov eax, ecx
:00402A10 39F7                    cmp edi, esi
:00402A12 7713                    ja 00402A27
:00402A14 742F                    je 00402A45
:00402A16 C1F902                  sar ecx, 02
:00402A19 782A                    js 00402A45
:00402A1B F3                      repz
:00402A1C A5                      movsd
:00402A1D 89C1                    mov ecx, eax
:00402A1F 83E103                  and ecx, 00000003
:00402A22 F3                      repz    <---看清楚这个Call里的内容后就可确定它有无用处了.
:00402A23 A4                      movsb

==KeyGen==================================================================
附上注册机,将下面代码保存为.rek文件,用注册机编写器编译,注册机编写器1.65测试通过.
支持中文名

.data
szHomePage db "http://www.365hz.net",0
szEmail    db "mailto:ljyljx@163.com",0
szErrMess  db "请输入注册名!",0
szTemp    db 100 dup(0)
szBuffer  db 100 dup(0)
.code
mov ebx,eax
mov eax,0
mov ecx,50
lea edi,szTemp
rep stosw
invoke lstrlen,ebx
push eax
lea edi,szTemp
mov ebp,esp
mov esi,ebp

Start:
xor eax,eax
mov al,byte ptr [ebx]
xor al,6Eh
PRO0:
xor edx,edx
mov ecx,0Ah
div ecx
add dl,30h
cmp dl,3Ah
jc PRO1
add dl,7

PRO1:
dec esi
mov [esi],byte ptr dl
or eax,eax
jnz PRO0
inc ebx
mov ecx,ebp
sub ecx,esi
rep movsb
mov eax,dword ptr [ebp]
dec eax
mov [ebp],dword ptr eax
jnz Start

lea esi,szTemp
lea edi,szBuffer
mov ecx,6
rep movsb
lea eax,szBuffer


;==Code End====================================================

      _/_/_/
    _/          _/_/_/  _/_/_/  _/_/
    _/_/    _/    _/  _/    _/    _/
        _/  _/    _/  _/    _/    _/
_/_/_/      _/_/_/  _/    _/    _/

                                              Sam.com
                                          4:54 2002-3-24