• 标 题:Search32最新版V5.08注册算法笔记 (一) (10千字)
  • 作 者:moonlite
  • 时 间:2001-8-11 11:41:32
  • 链 接:http://bbs.pediy.com

Search32最新版V5.08注册算法笔记 (一)

作者:moonlite
目标: Search32最新版V5.08
应用平台:Windows 9X
下载:http://www.anetsoft.com
大小:1100k
软件用途: Search32  号称是Windows下最快的32位搜索工具。它是离线的搜索引擎,可在本地硬盘里
包括Cache)中用关键字快速查找。
                   
工具:TRW1.22,W32dasm, file info 2.45,teunlockv1, UltraEdit 。
保护: 每次启动都弹出注册窗,提示注册; 30 天试用期;tELock壳; 反调试。

前言: 记得是半年前了,它的v5.05版没有彻底搞定,不甘心啊!直到现在也没有看到v5.x版的破解资料,
          还是再“反攻”一次!

过程实录:

[1] 启动 Search 32, 烦人的注册窗弹出。随便输入姓名和注册码,失败提示 "Entered password is invalid for..."。
[2] 试着启动TRW加载。很快消息窗弹出“Hmm...Debug yourself."这个壳还够厉害。
[3] 用teunlockv1脱掉它后,用w32dasm反汇编,查找"Entered password is invalid for...". 找到一处:

:0048720F 50                      push eax
:00487210 8B00                    mov eax, dword ptr [eax]
:00487212 FF5074                  call [eax+74]<-------------------有问题的call; 如果返回的eax=0,就没戏唱了**
:00487215 8B1510124B00            mov edx, dword ptr [004B1210]
:0048721B 8902                    mov dword ptr [edx], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004871D9(U)
|
:0048721D A110124B00              mov eax, dword ptr [004B1210]
:00487222 833800                  cmp dword ptr [eax], 00000000
:00487225 750F                    jne 00487236

* Possible StringData Ref from Data Obj ->"Entered password is invalid for " <---------------出错信息
                                        ->"
the given registration number."
                                  |
:00487227 B864744800              mov eax, 00487464
:0048722C E8CB86FBFF              call 0043F8FC
:00487231 E9DE010000              jmp 00487414

很明显,:00487212 处的call有问题。
   

[3]再次启动 Search 32,在注册窗 输入姓名:
“moonlite&Group [FCG]” 和注册码“78787878121212129898989845454545”
为什么这么长字串呢?我试过,短了不行)。启动TRW, 按CTL+D 来到TRW的领空。
设断: bpx 487212,F5返回主程点击OK,被TRW拦住去路。
进入那个有问题的call:

:00487212 FF5074                  call [eax+74]---->进入。。。


----------SRCH32_D! is Expired + 00DF——————
:10001E6F 90                      nop
:10001E70 8B44240C                mov eax, dword ptr [esp+0C]//<------光标在这!               
:10001E74 8B4C2408                mov ecx, dword ptr [esp+08]//在此下d eax, d ecx 分别可以看到
                                                                                                //输入的假password 和ID;
:10001E78 56                      push esi
:10001E79 50                      push eax
:10001E7A 51                      push ecx
* Reference To: SRCH32_D.?checkData@@YGHPAD0@Z
                                  |
:10001E7B E880F4FFFF              call 10001300//检查注册码的关键call, 进入==>
:10001E80 8BF0                    mov esi, eax//返回的eax送 esi;
:10001E82 83FE01                  cmp esi, 00000001
:10001E85 7515                    jne 10001E9C//eax不是1,就跳走,那就失败!
:10001E87 8B542408                mov edx, dword ptr [esp+08]
:10001E8B 5E                      pop esi
:10001E8C 894224                  mov dword ptr [edx+24], eax
:10001E8F C705146C011000000000    mov dword ptr [10016C14], 00000000//送成功标志!
:10001E99 C20C00                  ret 000C



* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001E85(C)
|
:10001E9C 68D0070000              push 000007D0//sleep 7D0h 毫秒;

* Reference To: KERNEL32.Sleep, Ord:0296h
                                  |
:10001EA1 FF1534200110            Call dword ptr [10012034]
:10001EA7 8BC6                    mov eax, esi//将esi,即0的值还给eax;
:10001EA9 5E                      pop esi
:10001EAA C20C00                  ret 000C
————————————



下面是注册码的算法--》

[4] 检查注册码的关键call:

* Referenced by a CALL at Address:
|:10001E7B 
|

Exported fn(): ?checkData@@YGHPAD0@Z - Ord:0001h
:10001300 81ECDC020000            sub esp, 000002DC
:10001306 53                      push ebx
:10001307 55                      push ebp
:10001308 56                      push esi
:10001309 57                      push edi
:1000130A 8BBC24F0020000          mov edi, dword ptr [esp+000002F0]//----->指向输入的ID;
                                                        //我的是 “moonlite&Group [FCG]”;
:10001311 83C9FF                  or ecx, FFFFFFFF
:10001314 33C0                    xor eax, eax
:10001316 33DB                    xor ebx, ebx
:10001318 F2                      repnz
:10001319 AE                      scasb
:1000131A F7D1                    not ecx
:1000131C 2BF9                    sub edi, ecx
:1000131E 8D9424A8000000          lea edx, dword ptr [esp+000000A8]
:10001325 8BC1                    mov eax, ecx

                                              //以上是算ID的长度;//

:10001327 8BF7                    mov esi, edi
:10001329 8BFA                    mov edi, edx
:1000132B 895C241C                mov dword ptr [esp+1C], ebx
:1000132F C1E902                  shr ecx, 02
:10001332 F3                      repz
:10001333 A5                      movsd

                                              //ID字串从esi传送到edi 处;//

.............

:10001344 8D8C24A8000000          lea ecx, dword ptr [esp+000000A8]//----->指向输入的ID;
:1000134B 895C2414                mov dword ptr [esp+14], ebx
:1000134F 51                      push ecx
:10001350 E881020100              call 100115D6// ;若ID是小写字母-->变成大写;若ID是大写字母或数字-->不变
:10001355 83C404                  add esp, 00000004
:10001358 53                      push ebx

* Reference To: KERNEL32.GetDriveTypeA, Ord:0104h
                                  |
:10001359 FF1530200110            Call dword ptr [10012030]

                                                      //这个call检查所用驱动器的类型(可查手册);
                                                      //这里返回eax=3,即Fixed Drive;

:1000135F 3BC5                    cmp eax, ebp//ebp=5; 5为CD-ROM;
:10001361 8B8424A8000000          mov eax, dword ptr [esp+000000A8]//----->指向输入的ID;
:10001368 750F                    jne 10001379//在此跳转!

.......................

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001368(C)
|
:10001379 3C43                    cmp al, 43//比较ID的第一个是不是字母“C”;
:1000137B 7509                    jne 10001386//不是就跳走;
:1000137D 80FC44                  cmp ah, 44//比较ID的第二个是不是字母“D”;
:10001380 0F842F040000            je 100017B5//如果ID的前二个字母是“CD”就失败!****

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:1000136C(C), :10001377(U), :1000137B(C)
|
:10001386 A1006C0110              mov eax, dword ptr [10016C00]
:1000138B 8D9424E8010000          lea edx, dword ptr [esp+000001E8]
:10001392 6804010000              push 00000104
:10001397 52                      push edx
:10001398 50                      push eax

* Reference To: KERNEL32.GetModuleFileNameA, Ord:0124h
                                  |
:10001399 FF152C200110            Call dword ptr [1001202C]//获取一个已装载模板的完整路径名称;
                                                                                                    //返回的EAX等于路径字符串的长度;
:1000139F 85C0                    test eax, eax//非0表示成功;
:100013A1 0F840E040000            je 100017B5
:100013A7 8D8C24E8010000          lea ecx, dword ptr [esp+000001E8]//指向SRCH32_D.DLL所在路径;
:100013AE 6A5C                    push 0000005C
:100013B0 51                      push ecx
:100013B1 E8CA980000              call 1000AC80//获取SRCH32_D.DLL字串的地址;
:100013B6 8BF0                    mov esi, eax//SRCH32_D.DLL字串不存在,则eax=0;
:100013B8 83C408                  add esp, 00000008
:100013BB 3BF3                    cmp esi, ebx
:100013BD 0F84F2030000            je 100017B5//判断字串存在与否的跳转; ****
:100013C3 46                      inc esi
:100013C4 56                      push esi
:100013C5 89742428                mov dword ptr [esp+28], esi
:100013C9 E808020100              call 100115D6// 参考 :10001350的call;
:100013CE 8DBC24AC000000          lea edi, dword ptr [esp+000000AC]//指向输入的ID字符串;
:100013D5 83C9FF                  or ecx, FFFFFFFF
:100013D8 33C0                    xor eax, eax
:100013DA 83C404                  add esp, 00000004
:100013DD F2                      repnz
:100013DE AE                      scasb
:100013DF F7D1                    not ecx
:100013E1 49                      dec ecx//算它的长度;
:100013E2 83F920                  cmp ecx, 00000020//长度是否20h位?
:100013E5 732E                    jnb 10001415
:100013E7 8BFE                    mov edi, esi

.................

:10001404 8BCA                    mov ecx, edx
:10001406 4F                      dec edi
:10001407 C1E902                  shr ecx, 02
:1000140A F3                      repz
:1000140B A5                      movsd               
:1000140C 8BCA                    mov ecx, edx
:1000140E 83E103                  and ecx, 00000003
:10001411 F3                      repz
:10001412 A4                      movsb//将“SRCH32_D.DLL”移动到ID字符串的后面,得新ID字串;
                                                      //即 “MOONLITE&GROUP [FCG]SRCH32_D.DLL”
:10001413 EB0B                    jmp 10001420

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100013E5(C)
|
:10001415 8D840C9C000000          lea eax, dword ptr [esp+ecx+0000009C]
:1000141C 89442424                mov dword ptr [esp+24], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001413(U)
|
:10001420 8BB424F4020000          mov esi, dword ptr [esp+000002F4]//指向输入的注册码;
:10001427 83C9FF                  or ecx, FFFFFFFF
:1000142A 8BFE                    mov edi, esi
:1000142C 33C0                    xor eax, eax
:1000142E F2                      repnz
:1000142F AE                      scasb
:10001430 F7D1                    not ecx
:10001432 49                      dec ecx//计算所输入的出注册码的长度;
:10001433 8BD1                    mov edx, ecx//送edx;
:10001435 83FA18                  cmp edx, 00000018//18h=24位;
:10001438 89542418                mov dword ptr [esp+18], edx//将注册码的长度保存;
:1000143C 0F8273030000            jb 100017B5//注册码的长度小于24位,就完了; ****
:10001442 B907000000              mov ecx, 00000007//置循环次数;
:10001447 B84D4D4D4D              mov eax, 4D4D4D4D
:1000144C 8D7C2448                lea edi, dword ptr [esp+48]
:10001450 F3                      repz
:10001451 AB                      stosd
:10001452 66AB                    stosw
:10001454 AA                      stosb//到此,将4*7+2+1=31字节用“4D”填满:
:10001455 B81F000000              mov eax, 0000001F
:1000145A B14D                    mov cl, 4D

..........................

<待续>

  • 标 题:Search32最新版V5.08注册算法笔记 (二) (15千字)
  • 作 者:moonlite
  • 时 间:2001-8-11 11:55:21

Search32最新版V5.08注册算法笔记 (二)  (续上篇)++


........................

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100014FB(C)
|
:10001475 0FBE0C33                movsx ecx, byte ptr [ebx+esi]将输入的注册码的第一个字符送ecx;
:10001479 51                      push ecx
:1000147A E8D7970000              call 1000AC56//将注册码字符查表,0~9数字对应“84”,返回eax=4;
:1000147F 83C404                  add esp, 00000004
:10001482 85C0                    test eax, eax
:10001484 7512                    jne 10001498

------------------------------------------------------------------------------------------------------------------------------

将输入的注册码按奇数和偶数位分两组,并按不同次序排列;

如果注册码的形式是:
a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 a20 a21 a22 a23 a24

则分组后排列为:
奇数位组: a1 a3 a5 a7 a9 a11 a13 a15 a17 a 19 a21 a23

偶数位组:  a24 a 20 a16 a12 a8 a4 a2 a6 a10 a14 a18 a20 (以a2为对称中心)
                                                            ^
---------------------------------------------------------------------------------------------------------------------------------
   
                                                     

:100014F8 43                      inc ebx
:100014F9 3BD8                    cmp ebx, eax
:100014FB 0F8274FFFFFF            jb 10001475

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000146F(C)
|
:10001501 8D7C2448                lea edi, dword ptr [esp+48]//指向偶数位组地址: 0070f01c;
:10001505 83C9FF                  or ecx, FFFFFFFF
:10001508 33C0                    xor eax, eax
:1000150A C6442C4800              mov [esp+ebp+48], 00
:1000150F F2                      repnz
:10001510 AE                      scasb//计算偶数位组中(从70f01c开始)后半部分的长度;
:10001511 8B542420                mov edx, dword ptr [esp+20]
:10001515 F7D1                    not ecx
:10001517 49                      dec ecx
:10001518 C644142800              mov [esp+edx+28], 00
:1000151D 83E1FE                  and ecx, FFFFFFFE
:10001520 83F90A                  cmp ecx, 0000000A//该长度与“A”比较;
:10001523 0F828C020000            jb 100017B5//小于则失败; ****
:10001529 8D442448                lea eax, dword ptr [esp+48]//指向偶数位组地址: 0070f01c;
:1000152D 50                      push eax
:1000152E E818970000              call 1000AC4B//偶数位组后半部分的计算, 结果送eax;
                                                                            //比方这部分的ASI字符的形式是: 00000083450, 那么
                                                                          //eax返回83450的HEX值; 假如该ASCII字符大于
                                                                          //FFFFFFFFh=4294967295, 则返回的eax就不是此规律了;

:10001533 8B7C2428                mov edi, dword ptr [esp+28]
:10001537 8BD8                    mov ebx, eax//eax送ebx保存;
:10001539 A1086C0110              mov eax, dword ptr [10016C08]//置数;
:1000153E 83C9FF                  or ecx, FFFFFFFF
:10001541 33D8                    xor ebx, eax
:10001543 33C0                    xor eax, eax

........................

:1000155D 8BCD                    mov ecx, ebp
:1000155F 4F                      dec edi
:10001560 C1E902                  shr ecx, 02
:10001563 F3                      repz
:10001564 A5                      movsd
:10001565 8BCD                    mov ecx, ebp
:10001567 83E103                  and ecx, 00000003
:1000156A F3                      repz
:1000156B A4                      movsb//将“SRCH32_D.DLL”移动并接到奇数位组的后面,得新奇数位组字串;
                                                     
:1000156C 8DBC24A8000000          lea edi, dword ptr [esp+000000A8]//指向新ID字串;
:10001573 83C9FF                  or ecx, FFFFFFFF
:10001576 F2                      repnz
:10001577 AE                      scasb
:10001578 F7D1                    not ecx
:1000157A 49                      dec ecx//得新ID字串的长度,我的是20h;
:1000157B 8D7C2428                lea edi, dword ptr [esp+28]//指向奇数位组字串;
:1000157F 8BD1                    mov edx, ecx
:10001581 83C9FF                  or ecx, FFFFFFFF
:10001584 F2                      repnz
:10001585 AE                      scasb
:10001586 F7D1                    not ecx
:10001588 49                      dec ecx//计算它的长度;
:10001589 83FA20                  cmp edx, 00000020//新ID字串的长度与20h比较;
:1000158C 894C2418                mov dword ptr [esp+18], ecx
:10001590 0F821F020000            jb 100017B5//小于的话,命运就惨了!!****
:10001596 85D2                    test edx, edx
:10001598 7617                    jbe 100015B1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100015AF(C)
|
:1000159A 0FBE8C04A8000000        movsx ecx, byte ptr [esp+eax+000000A8]//新ID字串第一字节送ecx;
:100015A2 8B7C241C                mov edi, dword ptr [esp+1C]
:100015A6 03F9                    add edi, ecx//将它的HEX值按字节累加;
:100015A8 40                      inc eax
:100015A9 3BC2                    cmp eax, edx
:100015AB 897C241C                mov dword ptr [esp+1C], edi//累加的结果保存起来。假定为十六进数为T;
:100015AF 72E9                    jb 1000159A

........................

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100015B6(C)
|
:100015D8 8BB424A8000000          mov esi, dword ptr [esp+000000A8]//指向新ID字串;
:100015DF B804000000              mov eax, 00000004//初始eax;

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:100015C0(C), :100015D6(U)
|
:100015E4 3BC2                    cmp eax, edx
:100015E6 7310                    jnb 100015F8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100015F6(C)
|
:100015E8 8BAC04A8000000          mov ebp, dword ptr [esp+eax+000000A8]
:100015EF 83C004                  add eax, 00000004
:100015F2 33F5                    xor esi, ebp//将新ID字串的5~8位和1~4位做异或, 再将结果与9~12位异或;
                                                                //类推,直到完成, 结果存esi。 假定为十六进数为M;
:100015F4 3BC2                    cmp eax, edx
:100015F6 72F0                    jb 100015E8

......................................

<<<从:1000161E 到 :1000163A 是将奇数位组字串求异或,结果存ebp。 假定为十六进数为N;算法同上>>>

....................................


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000162D(C)
|
:1000163C 8D542468                lea edx, dword ptr [esp+68]
:10001640 6A0A                    push 0000000A
:10001642 52                      push edx
:10001643 8BC6                    mov eax, esi
:10001645 33D2                    xor edx, edx
:10001647 B9FFFFFF7F              mov ecx, 7FFFFFFF
:1000164C F7F1                    div ecx//新ID 字串异或值除ecx, 得余数edx;
:1000164E 33EB                    xor ebp, ebx//N与ebx异或,结果假定为数Y;
:10001650 52                      push edx
:10001651 E8FFF60000              call 10010D55//将M转成10进制数--假定为数A;
:10001656 8B5C2428                mov ebx, dword ptr [esp+28]//指向T;
:1000165A 8B3D086C0110            mov edi, dword ptr [10016C08]
:10001660 8D9424B4010000          lea edx, dword ptr [esp+000001B4]
:10001667 6A0A                    push 0000000A
:10001669 52                      push edx
:1000166A 53                      push ebx
:1000166B 33F7                    xor esi, edi//M与edi异或,结果假定为数X;
:1000166D E8E3F60000              call 10010D55//将T的值转成10进制数--假定为数B;
:10001672 8DBC2480000000          lea edi, dword ptr [esp+00000080]
:10001679 83C9FF                  or ecx, FFFFFFFF
:1000167C 33C0                    xor eax, eax
:1000167E 83C418                  add esp, 00000018
:10001681 F2                      repnz
:10001682 AE                      scasb
:10001683 F7D1                    not ecx
:10001685 49                      dec ecx//计算数A的长度;
:10001686 8DBC24A8010000          lea edi, dword ptr [esp+000001A8]
:1000168D 894C2424                mov dword ptr [esp+24], ecx//数A的长度保存;
:10001691 83C9FF                  or ecx, FFFFFFFF
:10001694 F2                      repnz
:10001695 AE                      scasb
:10001696 F7D1                    not ecx
:10001698 49                      dec ecx//计算数B的长度;
:10001699 8BC3                    mov eax, ebx
:1000169B 894C2418                mov dword ptr [esp+18], ecx//B的长度保存;
:1000169F 33D2                    xor edx, edx
:100016A1 B905000000              mov ecx, 00000005
:100016A6 F7F1                    div ecx//将T除以5, 得余数edx;
:100016A8 85D2                    test edx, edx
:100016AA 8954241C                mov dword ptr [esp+1C], edx//将余数edx保存-->J;
:100016AE 7504                    jne 100016B4//不等于0则跳走;
:100016B0 894C241C                mov dword ptr [esp+1C], ecx//余数等于0则将5保存。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100016AE(C)
|
:100016B4 33DB                    xor ebx, ebx
:100016B6 33FF                    xor edi, edi
:100016B8 3BF5                    cmp esi, ebp//X与Y比较;
:100016BA C644241400              mov [esp+14], 00
:100016BF 0F85F0000000            jne 100017B5//不相等就完了; ****

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:10001796(C), :1000179E(U)
|
:100016C5 8A443C68                mov al, byte ptr [esp+edi+68]//数A的第一个字节送al;
:100016C9 8A4C241C                mov cl, byte ptr [esp+1C]//数J送cl;
:100016CD 02C1                    add al, cl
:100016CF 0FBED0                  movsx edx, al//相加的结果送edx--->K;
:100016D2 52                      push edx
:100016D3 88442416                mov byte ptr [esp+16], al
:100016D7 E87A950000              call 1000AC56//al如果是数字,返回的eax=4;否则,eax=0;
:100016DC 83C404                  add esp, 00000004
:100016DF 85C0                    test eax, eax
:100016E1 7505                    jne 100016E8
:100016E3 80442412F7              add byte ptr [esp+12], F7//如果K不是数字,K加F7-->P;

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:100016E1(C)
|
:100016E8 8A442412                mov al, byte ptr [esp+12]//数P送al;
:100016EC 8A4C1C28                mov cl, byte ptr [esp+ebx+28]//指向奇数位组字串的第一个字节;
:100016F0 3AC1                    cmp al, cl//两数比较;
:100016F2 0F85BD000000            jne 100017B5//不等就死了; ****
:100016F8 43                      inc ebx
:100016F9 83FB0E                  cmp ebx, 0000000E
:100016FC 0F83A1000000            jnb 100017A3
:10001702 0FBE4C1C28              movsx ecx, byte ptr [esp+ebx+28]//指向奇数位组字串的第二个字节;
:10001707 51                      push ecx
:10001708 E849950000              call 1000AC56
:1000170D 83C404                  add esp, 00000004
:10001710 85C0                    test eax, eax
:10001712 750A                    jne 1000171E
:10001714 43                      inc ebx
:10001715 83FB0E                  cmp ebx, 0000000E
:10001718 0F8385000000            jnb 100017A3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001712(C)
|
:1000171E 8B742424                mov esi, dword ptr [esp+24]//A的长度送esi;
:10001722 47                      inc edi
:10001723 3BFE                    cmp edi, esi
:10001725 7202                    jb 10001729
:10001727 33FF                    xor edi, edi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:10001725(C)
|
:10001729 8BC7                    mov eax, edi
:1000172B 33D2                    xor edx, edx
:1000172D F7742418                div [esp+18]//除以B的长度;
:10001731 8A4C3C68                mov cl, byte ptr [esp+edi+68]//数A的第二个字节送al;
:10001735 8A442414                mov al, byte ptr [esp+14]
:10001739 6A0A                    push 0000000A
:1000173B 8A9414AC010000          mov dl, byte ptr [esp+edx+000001AC]//数B的第二个字节送dl;
:10001742 32D1                    xor dl, cl//上面两数异或;

:10001744 B90A000000              mov ecx, 0000000A
:10001749 02C2                    add al, dl
:1000174B 88442418                mov byte ptr [esp+18], al//累加的结果送[esp+18];
:1000174F 8D442416                lea eax, dword ptr [esp+16]
:10001753 50                      push eax
:10001754 8B44241C                mov eax, dword ptr [esp+1C]//指向id 偶数第一位;
:10001758 25FF000000              and eax, 000000FF
:1000175D 99                      cdq
:1000175E F7F9                    idiv ecx//除以Ah=10(十进制),得余数edx;
:10001760 52                      push edx
:10001761 E8EFF50000              call 10010D55// 将edx 做ascii 字符调整, 保存于 [esp+1E];
:10001766 8A54241E                mov dl, byte ptr [esp+1E]//送dl;
:1000176A 8A441C34                mov al, byte ptr [esp+ebx+34]//指向奇数位组的偶数第一位;
:1000176E 83C40C                  add esp, 0000000C
:10001771 3AD0                    cmp dl, al//比较,不等就失败;
:10001773 7540                    jne 100017B5
:10001775 43                      inc ebx
:10001776 83FB0E                  cmp ebx, 0000000E
:10001779 7328                    jnb 100017A3
:1000177B 0FBE441C28              movsx eax, byte ptr [esp+ebx+28]
:10001780 50                      push eax
:10001781 E8D0940000              call 1000AC56
:10001786 83C404                  add esp, 00000004
:10001789 85C0                    test eax, eax
:1000178B 7506                    jne 10001793
:1000178D 43                      inc ebx
:1000178E 83FB0E                  cmp ebx, 0000000E//循环14次;
:10001791 7310                    jnb 100017A3

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:1000178B(C)
|
:10001793 47                      inc edi
:10001794 3BFE                    cmp edi, esi
:10001796 0F8229FFFFFF            jb 100016C5
:1000179C 33FF                    xor edi, edi
:1000179E E922FFFFFF              jmp 100016C5

......//上面是循环的计算和判断//......

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:100016FC(C), :10001718(C), :10001779(C), :10001791(C)
|
:100017A3 5F                      pop edi/<---------------如果走到这里就成功了!
:100017A4 5E                      pop esi
:100017A5 5D                      pop ebp
:100017A6 B801000000              mov eax, 00000001
:100017AB 5B                      pop ebx
:100017AC 81C4DC020000            add esp, 000002DC
:100017B2 C20800                  ret 0008



* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:10001371(C), :10001380(C), :100013A1(C), :100013BD(C), :1000143C(C)
|:10001523(C), :10001590(C), :100016BF(C), :100016F2(C), :10001773(C)
|
:100017B5 5F                      pop edi//<---------------跳到这里就game over了!
:100017B6 5E                      pop esi
:100017B7 5D                      pop ebp
:100017B8 33C0                    xor eax, eax 
:100017BA 5B                      pop ebx
:100017BB 81C4DC020000            add esp, 000002DC
:100017C1 C20800                  ret 0008

---------------------------------------



[5] 小花絮---->
      1) RegName 和 Password 以加密的方式写在它的配置文件 Search32.ini中。
   2)KEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\TRTData
        的 Data9 键值 是安装时间记录。

[6] 我的体会:
        本来想算出它的注册码,实在太烦琐了。感谢您花时间从头看到尾!
        虽然没有算出注册码,但是长了不少见识。只能盼望高手搞定它的注册机了。
        愿与各位朋友交流。^_^
                                                            <完>


            ★☆ moonlite 于2001-8-6☆★

  • 标 题:不好意思,更正两个打字错误::10001350 若ID是大写字母或数字-->不变; :100016B0 余数等于0则将5保存。 (空)
  • 时 间:2001-8-11 12:19:03
    阅读次数:3