文字处理大师 3.0 破解~~~附注册机 (17千字)
名称:文字处理大师(TextFile) 3.0http://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
