首页
社区
课程
招聘
一个crackme的注册分析
发表于: 2005-8-13 15:45 6385

一个crackme的注册分析

2005-8-13 15:45
6385

一个crackme的注册分析
【破解作者】 jsliyangsj
【作者邮箱】 sjcrack@yahoo.com.cn
【使用工具】 peid OllyDbg1.10
【破解平台】 Winxp
【软件名称】
【软件地址】 附件:liyangsj.rar
【编写语言】 Microsoft Visual C++ 6.0
在邮箱里面看见的,随便看了看.
搜索程序没有可利用的有用信息  暂停法
…………………………………………………………………………………………………………
00401780   .  6A>push -1                                    ;  暂停法到了这里
00401782   .  68>push UserReg.00402190                      ;  SE 句柄安装
00401787   .  64>mov eax,dword ptr fs:[0]
0040178D   .  50 push eax
0040178E   .  64>mov dword ptr fs:[0],esp
00401795   .  83>sub esp,48
00401798   .  55 push ebp
00401799   .  56 push esi
0040179A   .  57 push edi
0040179B   .  8B>mov esi,ecx
0040179D   .  6A>push 1
0040179F   .  E8>call <jmp.&MFC42.#6334>
004017A4   .  68>push UserReg.0040413C
004017A9   .  8D>lea ecx,dword ptr ss:[esp+10]
004017AD   .  E8>call <jmp.&MFC42.#537>
004017B2   .  68>push UserReg.0040405C                      ; /FileName = "TcDll.dll"
004017B7   .  C7>mov dword ptr ss:[esp+60],0                ; |
004017BF   .  FF>call dword ptr ds:[<&KERNEL32.LoadLibraryA>; \LoadLibraryA
004017C5   .  8B>mov edi,eax
004017C7   .  85>test edi,edi
004017C9   .  75>jnz short UserReg.004017EF
004017CB   .  6A>push 66
004017CD   .  8D>lea ecx,dword ptr ss:[esp+10]
004017D1   .  E8>call <jmp.&MFC42.#4160>
004017D6   .  8B>mov eax,dword ptr ss:[esp+C]
004017DA   .  57 push edi
004017DB   .  57 push edi
004017DC   .  50 push eax
004017DD   .  E8>call <jmp.&MFC42.#1200>
004017E2   .  C7>mov dword ptr ss:[esp+5C],-1
004017EA   .  E9>jmp UserReg.00401B44
004017EF   >  8B>mov ebp,dword ptr ds:[<&KERNEL32.GetProcAd>;  kernel32.GetProcAddress
004017F5   .  68>push UserReg.0040404C                      ; /ProcNameOrOrdinal = "SaveInformation"
004017FA   .  57 push edi                                   ; |hModule
004017FB   .  FF>call ebp                                   ; \GetProcAddress
004017FD   .  85>test eax,eax
004017FF   .  89>mov dword ptr ss:[esp+30],eax
00401803   .  75>jnz short UserReg.0040182B
00401805   .  6A>push 67
00401807   .  8D>lea ecx,dword ptr ss:[esp+10]
0040180B   .  E8>call <jmp.&MFC42.#4160>
00401810   .  8B>mov ecx,dword ptr ss:[esp+C]
00401814   .  6A>push 0
00401816   .  6A>push 0
00401818   .  51 push ecx
00401819   .  E8>call <jmp.&MFC42.#1200>
0040181E   .  C7>mov dword ptr ss:[esp+5C],-1
00401826   .  E9>jmp UserReg.00401B44
0040182B   >  68>push UserReg.0040403C                      ;  ASCII "CheckInstrument"
00401830   .  57 push edi
00401831   .  FF>call ebp
00401833   .  8B>mov edi,eax
00401835   .  85>test edi,edi
00401837   .  75>jnz short UserReg.0040185D
00401839   .  6A>push 67
0040183B   .  8D>lea ecx,dword ptr ss:[esp+10]
0040183F   .  E8>call <jmp.&MFC42.#4160>
00401844   .  8B>mov edx,dword ptr ss:[esp+C]
00401848   .  57 push edi
00401849   .  57 push edi
0040184A   .  52 push edx
0040184B   .  E8>call <jmp.&MFC42.#1200>
00401850   .  C7>mov dword ptr ss:[esp+5C],-1
00401858   .  E9>jmp UserReg.00401B44
0040185D   >  8D>lea ecx,dword ptr ss:[esp+10]
00401861   .  E8>call <jmp.&MFC42.#540>                     ;  得到用户名
00401866   .  8B>mov eax,dword ptr ds:[esi+60]
00401869   .  C6>mov byte ptr ss:[esp+5C],1
0040186E   .  8B>mov ecx,dword ptr ds:[eax-8]
00401871   .  85>test ecx,ecx
00401873   .  75>jnz short UserReg.0040188E
00401875   .  6A>push 6A
00401877   .  8D>lea ecx,dword ptr ss:[esp+10]
0040187B   .  E8>call <jmp.&MFC42.#4160>
00401880   .  8B>mov ecx,dword ptr ss:[esp+C]
00401884   .  6A>push 0
00401886   .  6A>push 0
00401888   .  51 push ecx
00401889   .  E9>jmp UserReg.00401955
0040188E   >  8D>lea edx,dword ptr ds:[esi+68]
00401891   .  8D>lea eax,dword ptr ds:[esi+64]
00401894   .  52 push edx
00401895   .  8D>lea ecx,dword ptr ss:[esp+1C]
00401899   .  50 push eax
0040189A   .  51 push ecx
0040189B   .  E8>call <jmp.&MFC42.#922>                     ;  得到注册码的前2组
004018A0   .  8D>lea edx,dword ptr ds:[esi+6C]
004018A3   .  C6>mov byte ptr ss:[esp+5C],2
004018A8   .  52 push edx
004018A9   .  50 push eax
004018AA   .  8D>lea eax,dword ptr ss:[esp+28]
004018AE   .  50 push eax
004018AF   .  E8>call <jmp.&MFC42.#922>                     ;  得到第3组并与前面合并
004018B4   .  8D>lea ecx,dword ptr ds:[esi+70]
004018B7   .  8D>lea edx,dword ptr ss:[esp+24]
004018BB   .  51 push ecx
004018BC   .  50 push eax
004018BD   .  52 push edx
004018BE   .  C6>mov byte ptr ss:[esp+68],3
004018C3   .  E8>call <jmp.&MFC42.#922>                     ;  得到第4组并与前面合并
004018C8   .  50 push eax
004018C9   .  8D>lea ecx,dword ptr ss:[esp+14]
004018CD   .  C6>mov byte ptr ss:[esp+60],4
004018D2   .  E8>call <jmp.&MFC42.#858>
004018D7   .  8D>lea ecx,dword ptr ss:[esp+24]
004018DB   .  C6>mov byte ptr ss:[esp+5C],3
004018E0   .  E8>call <jmp.&MFC42.#800>
004018E5   .  8D>lea ecx,dword ptr ss:[esp+20]
004018E9   .  C6>mov byte ptr ss:[esp+5C],2
004018EE   .  E8>call <jmp.&MFC42.#800>
004018F3   .  8D>lea ecx,dword ptr ss:[esp+18]
004018F7   .  C6>mov byte ptr ss:[esp+5C],1
004018FC   .  E8>call <jmp.&MFC42.#800>
00401901   .  8B>mov eax,dword ptr ss:[esp+10]              ;  取出注册码
00401905   .  83>cmp dword ptr ds:[eax-8],10                ;  位数与10比较
00401909   .  74>je short UserReg.00401921
0040190B   .  6A>push 6C
0040190D   .  8D>lea ecx,dword ptr ss:[esp+10]
00401911   .  E8>call <jmp.&MFC42.#4160>
00401916   .  8B>mov ecx,dword ptr ss:[esp+C]
0040191A   .  6A>push 0
0040191C   .  6A>push 0
0040191E   .  51 push ecx
0040191F   .  EB>jmp short UserReg.00401955
00401921   >  6A>push 68
00401923   .  8D>lea ecx,dword ptr ss:[esp+10]
00401927   .  E8>call <jmp.&MFC42.#4160>
0040192C   .  8D>lea ecx,dword ptr ss:[esp+10]
00401930   .  E8>call <jmp.&MFC42.#4204>
00401935   .  8B>mov ecx,dword ptr ss:[esp+10]              ;  取出注册码
00401939   .  8B>mov eax,dword ptr ds:[esi+60]              ;  取出用户名
0040193C   .  8D>lea edx,dword ptr ss:[esp+34]
00401940   .  52 push edx
00401941   .  51 push ecx                                   ;  压入注册码
00401942   .  50 push eax                                   ;  压入用户名
00401943   .  FF>call edi                                   ;  调用DLL关键的CALL
00401945   .  3D>cmp eax,3E8
0040194A   .  7D>jge short UserReg.00401975                 ;  这里才是关键跳转
0040194C   .  8B>mov edx,dword ptr ss:[esp+C]
00401950   .  6A>push 0
00401952   .  6A>push 0
00401954   .  52 push edx
00401955   >  E8>call <jmp.&MFC42.#1200>                    ;  错误信息
0040195A   .  8D>lea ecx,dword ptr ss:[esp+10]
0040195E   .  C6>mov byte ptr ss:[esp+5C],0
00401963   .  E8>call <jmp.&MFC42.#800>

00401A86   .  E8>call <jmp.&MFC42.#800>
00401A8B   >  8B>mov eax,dword ptr ds:[esi+60]
00401A8E   .  8B>mov edi,dword ptr ss:[esp+30]
00401A92   .  68>push UserReg.0040402C                      ;  ASCII "HospitalName"
00401A97   .  50 push eax
00401A98   .  FF>call edi
00401A9A   .  85>test eax,eax
00401A9C   .  75>jnz short UserReg.00401AAC
00401A9E   .  50 push eax
00401A9F   .  50 push eax
00401AA0   .  8B>mov eax,dword ptr ss:[esp+14]
00401AA4   .  50 push eax
00401AA5   .  E8>call <jmp.&MFC42.#1200>
00401AAA   .  EB>jmp short UserReg.00401B24
00401AAC   >  8B>mov ecx,dword ptr ss:[esp+10]
00401AB0   .  68>push UserReg.00404020                      ;  ASCII "SerialNo"
00401AB5   .  51 push ecx
00401AB6   .  FF>call edi
00401AB8   .  85>test eax,eax
00401ABA   .  75>jnz short UserReg.00401ACA
00401ABC   .  8B>mov edx,dword ptr ss:[esp+C]
00401AC0   .  50 push eax
00401AC1   .  50 push eax
00401AC2   .  52 push edx
00401AC3   .  E8>call <jmp.&MFC42.#1200>
00401AC8   .  EB>jmp short UserReg.00401B24
00401ACA   >  6A>push 69
00401ACC   .  8D>lea ecx,dword ptr ss:[esp+10]
00401AD0   .  E8>call <jmp.&MFC42.#4160>
00401AD5   .  8D>lea eax,dword ptr ss:[esp+14]
00401AD9   .  8D>lea ecx,dword ptr ss:[esp+C]
00401ADD   .  50 push eax
00401ADE   .  E8>call <jmp.&MFC42.#939>
00401AE3   .  8D>lea ecx,dword ptr ss:[esp+1C]
00401AE7   .  E8>call <jmp.&MFC42.#540>
00401AEC   .  6A>push 6D
00401AEE   .  8D>lea ecx,dword ptr ss:[esp+20]
00401AF2   .  C6>mov byte ptr ss:[esp+60],0B
00401AF7   .  E8>call <jmp.&MFC42.#4160>
00401AFC   .  8B>mov ecx,dword ptr ss:[esp+1C]
00401B00   .  8B>mov edx,dword ptr ss:[esp+C]
00401B04   .  6A>push 40
00401B06   .  51 push ecx
00401B07   .  52 push edx
00401B08   .  8B>mov ecx,esi
00401B0A   .  E8>call <jmp.&MFC42.#4224>                    ;  成功信息
00401B0F   .  8B>mov ecx,esi
00401B11   .  E8>call <jmp.&MFC42.#4853>
00401B16   .  8D>lea ecx,dword ptr ss:[esp+1C]
00401B1A   .  C6>mov byte ptr ss:[esp+5C],5
………………………………………………………………………………………………………………………………………………
进入00401943   .  FF>call edi                                   ;  调用DLL关键的CALL
…………………………………………………………………………………………………………………………………………+
00CC1E00 >/$  6A>push -1
00CC1E02  |.  68>push TcDll.00CC7250                        ;  SE 句柄安装
00CC1E07  |.  64>mov eax,dword ptr fs:[0]
00CC1E0D  |.  50 push eax
00CC1E0E  |.  64>mov dword ptr fs:[0],esp
00CC1E15  |.  83>sub esp,28
00CC1E18  |.  53 push ebx
00CC1E19  |.  55 push ebp
00CC1E1A  |.  56 push esi
00CC1E1B  |.  57 push edi
00CC1E1C  |.  68>push TcDll.00CCA4B8
00CC1E21  |.  8D>lea ecx,dword ptr ss:[esp+28]
00CC1E25  |.  E8>call <jmp.&MFC42.#537>
00CC1E2A  |.  33>xor ebx,ebx
00CC1E2C  |.  68>push TcDll.00CCA4B8
00CC1E31  |.  8D>lea ecx,dword ptr ss:[esp+18]
00CC1E35  |.  89>mov dword ptr ss:[esp+44],ebx
00CC1E39  |.  E8>call <jmp.&MFC42.#537>
00CC1E3E  |.  8D>lea ecx,dword ptr ss:[esp+20]
00CC1E42  |.  C6>mov byte ptr ss:[esp+40],1
00CC1E47  |.  89>mov dword ptr ss:[esp+2C],ebx
00CC1E4B  |.  E8>call <jmp.&MFC42.#540>
00CC1E50  |.  8D>lea ecx,dword ptr ss:[esp+1C]
00CC1E54  |.  C6>mov byte ptr ss:[esp+40],2
00CC1E59  |.  E8>call <jmp.&MFC42.#540>
00CC1E5E  |.  8D>lea ecx,dword ptr ss:[esp+18]
00CC1E62  |.  C6>mov byte ptr ss:[esp+40],3
00CC1E67  |.  E8>call <jmp.&MFC42.#540>
00CC1E6C  |.  8B>mov eax,dword ptr ss:[esp+48]              ;  得到用户名
00CC1E70  |.  8D>lea ecx,dword ptr ss:[esp+24]
00CC1E74  |.  50 push eax
00CC1E75  |.  C6>mov byte ptr ss:[esp+44],4
00CC1E7A  |.  E8>call <jmp.&MFC42.#860>
00CC1E7F  |.  8B>mov ecx,dword ptr ss:[esp+4C]              ;  得到注册码
00CC1E83  |.  51 push ecx
00CC1E84  |.  8D>lea ecx,dword ptr ss:[esp+18]
00CC1E88  |.  E8>call <jmp.&MFC42.#860>
00CC1E8D  |.  8D>lea ecx,dword ptr ss:[esp+14]
00CC1E91  |.  E8>call <jmp.&MFC42.#4204>                    ;  拷贝一下注册码
00CC1E96  |.  8B>mov eax,dword ptr ss:[esp+14]
00CC1E9A  |.  8B>mov esi,dword ptr ds:[eax-8]               ;  得到注册码的位数
00CC1E9D  |.  4E dec esi
00CC1E9E  |.  3B>cmp esi,ebx                                ;  一共16次循环
00CC1EA0  |.  7C>jl short TcDll.00CC1EBB
00CC1EA2  |>  80>/cmp byte ptr ds:[esi+eax],2D              ;  这里不可能等于2D
00CC1EA6  |.  75>|jnz short TcDll.00CC1EB8
00CC1EA8  |.  6A>|push 1
00CC1EAA  |.  56 |push esi
00CC1EAB  |.  8D>|lea ecx,dword ptr ss:[esp+1C]
00CC1EAF  |.  E8>|call <jmp.&MFC42.#6648>
00CC1EB4  |.  8B>|mov eax,dword ptr ss:[esp+14]
00CC1EB8  |>  4E |dec esi
00CC1EB9  |.^ 79>\jns short TcDll.00CC1EA2
00CC1EBB  |>  8B>mov edi,dword ptr ss:[esp+24]              ;  得到用户名
00CC1EBF  |.  8B>mov esi,dword ptr ds:[edi-8]               ;  用户名的位数
00CC1EC2  |.  3B>cmp esi,ebx                                ;  是否为0
00CC1EC4  |.  0F>je TcDll.00CC220B
00CC1ECA  |.  8B>mov eax,dword ptr ds:[eax-8]               ;  注册码的位数
00CC1ECD  |.  3B>cmp eax,ebx                                ;  比较是否为0
00CC1ECF  |.  0F>je TcDll.00CC220B
00CC1ED5  |.  83>cmp eax,10
00CC1ED8  |.  0F>jnz TcDll.00CC220B                         ;  注册码的位数一定等于16
00CC1EDE  |.  8B>mov eax,esi
00CC1EE0  |.  25>and eax,8000000F
00CC1EE5  |.  79>jns short TcDll.00CC1EEC
00CC1EE7  |.  48 dec eax
00CC1EE8  |.  83>or eax,FFFFFFF0
00CC1EEB  |.  40 inc eax
00CC1EEC  |>  33>xor ecx,ecx
00CC1EEE  |.  3B>cmp esi,ebx
00CC1EF0  |.  89>mov dword ptr ss:[esp+48],eax
00CC1EF4  |.  7E>jle short TcDll.00CC1F12                   ;  下面将对用户名进行处理
00CC1EF6  |>  0F>/movsx eax,byte ptr ds:[ecx+edi]           ;  依次得到每一位用户名
00CC1EFA  |.  99 |cdq
00CC1EFB  |.  33>|xor eax,edx
00CC1EFD  |.  2B>|sub eax,edx
00CC1EFF  |.  03>|add ebx,eax
00CC1F01  |.  41 |inc ecx
00CC1F02  |.  3B>|cmp ecx,esi
00CC1F04  |.^ 7C>\jl short TcDll.00CC1EF6                   ;  将用户名的每一位ASCII码依次相加保存在EBX中
00CC1F06  |.  81>cmp ebx,0FF                                ;  比较是否等于0FF
00CC1F0C  |.  89>mov dword ptr ss:[esp+30],ebx              ;  结果储存
00CC1F10  |.  7D>jge short TcDll.00CC1F22
00CC1F12  |>  BA>mov edx,0FF
00CC1F17  |.  2B>sub edx,ebx
00CC1F19  |.  0F>imul edx,ebx
00CC1F1C  |.  89>mov dword ptr ss:[esp+30],edx
00CC1F20  |.  8B>mov ebx,edx
00CC1F22  |>  8B>mov ecx,esi
00CC1F24  |.  81>and ecx,8000000F
00CC1F2A  |.  79>jns short TcDll.00CC1F31
00CC1F2C  |.  49 dec ecx
00CC1F2D  |.  83>or ecx,FFFFFFF0
00CC1F30  |.  41 inc ecx
00CC1F31  |>  B8>mov eax,10
00CC1F36  |.  2B>sub eax,ecx                                ;  注册码的位数减去用户名的位数
00CC1F38  |.  99 cdq
00CC1F39  |.  8B>mov ebp,eax
00CC1F3B  |.  33>xor ebp,edx
00CC1F3D  |.  2B>sub ebp,edx
00CC1F3F  |.  75>jnz short TcDll.00CC1F46
00CC1F41  |.  BD>mov ebp,10
00CC1F46  |>  85>test esi,esi
00CC1F48  |.  7E>jle short TcDll.00CC1F6E                   ;  下面又要对用户名进行处理
00CC1F4A  |.  B9>mov ecx,1
00CC1F4F  |>  0F>/movsx eax,byte ptr ds:[edi+ecx-1]         ;  依次得到每一位用户名
00CC1F54  |.  99 |cdq
00CC1F55  |.  33>|xor eax,edx
00CC1F57  |.  2B>|sub eax,edx
00CC1F59  |.  8B>|mov edx,dword ptr ss:[esp+2C]
00CC1F5D  |.  0F>|imul eax,ecx                              ;  用户名每一位ASCII乘以对应的位数值
00CC1F60  |.  03>|add edx,eax                               ;  上面的值加上上一次储存的结果
00CC1F62  |.  41 |inc ecx
00CC1F63  |.  89>|mov dword ptr ss:[esp+2C],edx             ;  储存
00CC1F67  |.  8D>|lea edx,dword ptr ds:[ecx-1]
00CC1F6A  |.  3B>|cmp edx,esi
00CC1F6C  |.^ 7C>\jl short TcDll.00CC1F4F
00CC1F6E  |>  0F>imul ebp,dword ptr ss:[esp+2C]             ;  将第2次对用户名处理的结果乘以用16减去7的数值
00CC1F73  |.  8B>mov eax,ebp                                ;  值给了EAX
00CC1F75  |.  3D>cmp eax,7FFF                               ;  比较是否超过了7FFF
00CC1F7A  |.  7D>jge short TcDll.00CC1F85                   ;  如果没有超过32767就用65535减去上面得到的数值
00CC1F7C  |.  B9>mov ecx,0FFFF
00CC1F81  |.  2B>sub ecx,eax
00CC1F83  |.  8B>mov eax,ecx
00CC1F85  |>  50 push eax
00CC1F86  |.  8D>lea edx,dword ptr ss:[esp+24]
00CC1F8A  |.  68>push TcDll.00CCA2AC                        ;  ASCII "%04d"
00CC1F8F  |.  52 push edx
00CC1F90  |.  E8>call <jmp.&MFC42.#2818>                    ;  将第2次对用户名处理的结果转化为十进制数值39363
00CC1F95  |.  83>add esp,0C
00CC1F98  |.  8D>lea eax,dword ptr ss:[esp+18]
00CC1F9C  |.  53 push ebx                                   ;  得到第1次用户名得到的数值
00CC1F9D  |.  68>push TcDll.00CCA2A4                        ;  ASCII "%03d"
00CC1FA2  |.  50 push eax
00CC1FA3  |.  E8>call <jmp.&MFC42.#2818>                    ;  将第一次用用户名得到数值转化为十进制数值737
00CC1FA8  |.  8B>mov ecx,dword ptr ss:[esp+54]              ;  得到用户名的位数
00CC1FAC  |.  83>add esp,0C
00CC1FAF  |.  8D>lea edx,dword ptr ss:[esp+1C]
00CC1FB3  |.  51 push ecx
00CC1FB4  |.  68>push TcDll.00CCA29C                        ;  ASCII "%01d"
00CC1FB9  |.  52 push edx
00CC1FBA  |.  E8>call <jmp.&MFC42.#2818>                    ;  将用户名的位数转化为十进制数值
00CC1FBF  |.  83>add esp,0C
00CC1FC2  |.  8D>lea eax,dword ptr ss:[esp+1C]              ;  得到用户名位数字符
00CC1FC6  |.  8D>lea ecx,dword ptr ss:[esp+20]              ;  得到第2次将用户名转化的数值字符地址
00CC1FCA  |.  8D>lea edx,dword ptr ss:[esp+2C]              ;  得到第2次用户名转化没有乘以9时的数据
00CC1FCE  |.  50 push eax
00CC1FCF  |.  51 push ecx
00CC1FD0  |.  52 push edx
00CC1FD1  |.  E8>call <jmp.&MFC42.#922>                     ;  就是将用户名的位数加在第2次化后数据的后面393637
00CC1FD6  |.  8D>lea ecx,dword ptr ss:[esp+18]
00CC1FDA  |.  8D>lea edx,dword ptr ss:[esp+28]
00CC1FDE  |.  51 push ecx
00CC1FDF  |.  50 push eax
00CC1FE0  |.  52 push edx
00CC1FE1  |.  C6>mov byte ptr ss:[esp+4C],5
00CC1FE6  |.  E8>call <jmp.&MFC42.#922>                     ;  又将第1次处理用户名的数据合并在刚才合并好的后面393637737
00CC1FEB  |.  8D>lea ecx,dword ptr ss:[esp+2C]
00CC1FEF  |.  C6>mov byte ptr ss:[esp+40],7
00CC1FF4  |.  E8>call <jmp.&MFC42.#800>                     ;  不知道干什么
00CC1FF9  |.  8B>mov eax,dword ptr ss:[esp+14]              ;  得到注册码
00CC1FFD  |.  8B>mov edx,dword ptr ss:[esp+20]              ;  得到第2次用户名计算的结果
00CC2001  |.  8A>mov cl,byte ptr ds:[eax+B]                 ;  注册码的第12位
00CC2004  |.  8A>mov bl,byte ptr ds:[edx]
00CC2006  |.  3A>cmp cl,bl                                  ;  注册码的第12位必须等于第2次计算出来的第1位
00CC2008  |.  0F>jnz TcDll.00CC21FD
00CC200E  |.  8B>mov esi,dword ptr ss:[esp+18]              ;  第1次用户名计算出来的值
00CC2012  |.  8A>mov cl,byte ptr ds:[eax+D]                 ;  注册码的地14位
00CC2015  |.  3A>cmp cl,byte ptr ds:[esi]                   ;  注册码的地14位必须等于第一次计算出来的第1位
00CC2017  |.  0F>jnz TcDll.00CC21FD
00CC201D  |.  8B>mov edi,dword ptr ss:[esp+1C]              ;  用户名的位数
00CC2021  |.  8A>mov cl,byte ptr ds:[eax+5]
00CC2024  |.  3A>cmp cl,byte ptr ds:[edi]                   ;  注册码的第6位必须等于用户名的位数
00CC2026  |.  0F>jnz TcDll.00CC21FD
00CC202C  |.  8A>mov cl,byte ptr ds:[eax+7]                 ;  注册码的第8位
00CC202F  |.  8A>mov bl,byte ptr ds:[edx+1]
00CC2032  |.  3A>cmp cl,bl                                  ;  注册码的第8位必须等于第2次计算出来的第2位
00CC2034  |.  0F>jnz TcDll.00CC21FD
00CC203A  |.  8A>mov cl,byte ptr ds:[eax+9]
00CC203D  |.  8A>mov bl,byte ptr ds:[esi+1]
00CC2040  |.  3A>cmp cl,bl                                  ;  注册码的第10位必须等于第1次计算出来的第2位
00CC2042  |.  0F>jnz TcDll.00CC21FD
00CC2048  |.  8A>mov cl,byte ptr ds:[eax+1]
00CC204B  |.  8A>mov bl,byte ptr ds:[edx+2]
00CC204E  |.  3A>cmp cl,bl                                  ;  注册码的第2位必须等于第2次计算出来的第3位
00CC2050  |.  0F>jnz TcDll.00CC21FD
00CC2056  |.  8A>mov cl,byte ptr ds:[eax+3]
00CC2059  |.  8A>mov bl,byte ptr ds:[esi+2]
00CC205C  |.  3A>cmp cl,bl                                  ;  注册码的第4位必须等于第1次计算出来的第3位
00CC205E  |.  0F>jnz TcDll.00CC21FD
00CC2064  |.  8A>mov cl,byte ptr ds:[eax+F]
00CC2067  |.  8A>mov bl,byte ptr ds:[edx+3]
00CC206A  |.  3A>cmp cl,bl                                  ;  注册码的第16位必须等于第2次计算出来的第4位
00CC206C  |.  0F>jnz TcDll.00CC21FD
00CC2072  |.  8A>mov cl,byte ptr ds:[eax+8]
00CC2075  |.  8A>mov dl,byte ptr ds:[eax+6]
00CC2078  |.  8A>mov bl,byte ptr ds:[eax+C]                 ;  上面是注册码的第9,7,13位
00CC207B  |.  0F>movsx ecx,cl
00CC207E  |.  0F>movsx edx,dl
00CC2081  |.  8D>lea ecx,dword ptr ds:[ecx+ecx*4]           ;  注册码的第9位乘以5
00CC2084  |.  88>mov byte ptr ss:[esp+48],bl                ;  第13位储存
00CC2088  |.  8A>mov bl,byte ptr ds:[eax+A]                 ;  注册码的第11位
00CC208B  |.  8D>lea ecx,dword ptr ds:[edx+ecx*2]           ;  原第9位乘以10加上第7位
00CC208E  |.  88>mov byte ptr ss:[esp+4C],bl                ;  第11位储存
00CC2092  |.  0F>movsx edx,byte ptr ss:[esp+48]             ;  取出第13位
00CC2097  |.  8A>mov bl,byte ptr ds:[eax+2]                 ;  第3位
00CC209A  |.  8D>lea ecx,dword ptr ds:[ecx+ecx*4]           ;  再将原第9位乘以10加上第7位的结果乘以5
00CC209D  |.  88>mov byte ptr ss:[esp+13],bl                ;  第3位储存
00CC20A1  |.  8A>mov bl,byte ptr ds:[eax+4]                 ;  第5位
00CC20A4  |.  8D>lea ecx,dword ptr ds:[edx+ecx*2]           ;  原第9位乘以10加上第7位的结果乘以5的结果乘以2加上第13位
00CC20A7  |.  0F>movsx edx,byte ptr ss:[esp+4C]             ;  取出第11位
00CC20AC  |.  8D>lea ecx,dword ptr ds:[ecx+ecx*4]           ;  原第9位乘以10加上第7位的结果乘以5的结果乘以2加上第13位的结果再乘以5
00CC20AF  |.  8D>lea ecx,dword ptr ds:[edx+ecx*2]           ;  原第9位乘以10加上第7位的结果乘以5的结果乘以2加上第13位的结果再乘以5的结果乘以2再加上第11位
00CC20B2  |.  0F>movsx edx,byte ptr ss:[esp+13]             ;  取第3位
00CC20B7  |.  8D>lea ecx,dword ptr ds:[ecx+ecx*4]           ;  原第9位乘以10加上第7位的结果乘以5的结果乘以2加上第13位的结果再乘以5的结果乘以2再加上第11位的结果乘以5
00CC20BA  |.  8D>lea ecx,dword ptr ds:[edx+ecx*2]           ;  原第9位乘以10加上第7位的结果乘以5的结果乘以2加上第13位的结果再乘以5的结果乘以2再加上第11位的结果乘以5的结果乘以2加上第3位
00CC20BD  |.  0F>movsx edx,bl                               ;  第5位
00CC20C0  |.  8D>lea ecx,dword ptr ds:[ecx+ecx*4]           ;  原第9位乘以10加上第7位的结果乘以5的结果乘以2加上第13位的结果再乘以5的结果乘以2再加上第11位的结果乘以5的结果乘以2加上第3位乘以5
00CC20C3  |.  8D>lea ebp,dword ptr ds:[edx+ecx*2+FFAE9EB0]  ;  原第9位乘以10加上第7位的结果乘以5的结果乘以2加上第13位的结果再乘以5的结果乘以2再加上第11位的结果乘以5的结果乘以2加上第3位乘以5的结果乘以2加上第5位-5333328保存再EBP
00CC20CA  |.  81>cmp ebp,186A0
00CC20D0  |.  0F>jl TcDll.00CC21FD                          ;  结果如果小于186A0就完了
00CC20D6  |.  8B>mov esi,dword ptr ss:[esp+30]              ;  取第一次处理用户名的数值2E1
00CC20DA  |.  B9>mov ecx,-3039                              ;  固定脂FFFFCFC7(-12345)
00CC20DF  |.  0F>movsx eax,byte ptr ds:[eax]                ;  注册码的第一位
00CC20E2  |.  2B>sub ecx,esi                                ;  固定值减去第一次处理用户名的值2E1
00CC20E4  |.  03>add ebp,ecx                                ;  把减去的结果加在上面的值EBP上(上面的总结果先减去12345(10进制)再减去用户名第一次处理的结果)
00CC20E6  |.  25>and eax,80000001
00CC20EB  |.  79>jns short TcDll.00CC20F2                   ;  不可能有符号位的所以这里必跳转
00CC20ED  |.  48 dec eax
00CC20EE  |.  83>or eax,FFFFFFFE
00CC20F1  |.  40 inc eax
00CC20F2  |>  75>jnz short TcDll.00CC2106                   ;  如果注册码的第一位与1 AND运算为0就要把上面的结果除以3E8
00CC20F4  |.  8B>mov eax,ebp
00CC20F6  |.  B9>mov ecx,3E8
00CC20FB  |.  99 cdq
00CC20FC  |.  F7>idiv ecx
00CC20FE  |.  85>test edx,edx
00CC2100  |.  0F>jnz TcDll.00CC21FD
00CC2106  |>  55 push ebp                                   ; /Arg1
00CC2107  |.  E8>call TcDll.BeckManGetInstrument            ; \这里又是一个关键最后的值必须比186A0小
00CC210C  |.  50 push eax
00CC210D  |.  8D>lea ecx,dword ptr ss:[esp+38]
00CC2111  |.  E8>call <jmp.&MFC42.#537>
00CC2116  |.  8B>mov edx,dword ptr ss:[esp+34]
00CC211A  |.  83>or ebx,FFFFFFFF
00CC211D  |.  8B>mov edi,edx
00CC211F  |.  8B>mov ecx,ebx
00CC2121  |.  33>xor eax,eax
00CC2123  |.  C6>mov byte ptr ss:[esp+40],7
00CC2128  |.  F2>repne scas byte ptr es:[edi]
00CC212A  |.  F7>not ecx
00CC212C  |.  2B>sub edi,ecx
00CC212E  |.  8B>mov eax,ecx
00CC2130  |.  8B>mov esi,edi
00CC2132  |.  8B>mov edi,dword ptr ss:[esp+50]
00CC2136  |.  C1>shr ecx,2
00CC2139  |.  F3>rep movs dword ptr es:[edi],dword ptr ds:[>
00CC213B  |.  8B>mov ecx,eax
00CC213D  |.  83>and ecx,3
00CC2140  |.  F3>rep movs byte ptr es:[edi],byte ptr ds:[es>
00CC2142  |.  8B>mov eax,dword ptr ds:[edx-8]
00CC2145  |.  8D>lea ecx,dword ptr ss:[esp+34]
00CC2149  |.  85>test eax,eax
00CC214B  |.  75>jnz short TcDll.00CC21A1                   ;  关键必须跳
00CC214D  |.  E8>call <jmp.&MFC42.#800>
00CC2152  |.  8D>lea ecx,dword ptr ss:[esp+28]
00CC2156  |.  C6>mov byte ptr ss:[esp+40],4
00CC215B  |.  E8>call <jmp.&MFC42.#800>
00CC2160  |.  8D>lea ecx,dword ptr ss:[esp+18]
00CC2164  |.  C6>mov byte ptr ss:[esp+40],3
00CC2169  |.  E8>call <jmp.&MFC42.#800>
00CC216E  |.  8D>lea ecx,dword ptr ss:[esp+1C]
00CC2172  |.  C6>mov byte ptr ss:[esp+40],2
00CC2177  |.  E8>call <jmp.&MFC42.#800>
00CC217C  |.  8D>lea ecx,dword ptr ss:[esp+20]
00CC2180  |.  C6>mov byte ptr ss:[esp+40],1
00CC2185  |.  E8>call <jmp.&MFC42.#800>
00CC218A  |.  8D>lea ecx,dword ptr ss:[esp+14]
00CC218E  |.  C6>mov byte ptr ss:[esp+40],0
00CC2193  |.  E8>call <jmp.&MFC42.#800>
00CC2198  |.  89>mov dword ptr ss:[esp+40],ebx
00CC219C  |.  E9>jmp TcDll.00CC224B
00CC21A1  |>  E8>call <jmp.&MFC42.#800>
00CC21A6  |.  8D>lea ecx,dword ptr ss:[esp+28]
00CC21AA  |.  C6>mov byte ptr ss:[esp+40],4
00CC21AF  |.  E8>call <jmp.&MFC42.#800>
00CC21B4  |.  8D>lea ecx,dword ptr ss:[esp+18]
00CC21B8  |.  C6>mov byte ptr ss:[esp+40],3
00CC21BD  |.  E8>call <jmp.&MFC42.#800>
00CC21C2  |.  8D>lea ecx,dword ptr ss:[esp+1C]
00CC21C6  |.  C6>mov byte ptr ss:[esp+40],2
00CC21CB  |.  E8>call <jmp.&MFC42.#800>
00CC21D0  |.  8D>lea ecx,dword ptr ss:[esp+20]
00CC21D4  |.  C6>mov byte ptr ss:[esp+40],1
00CC21D9  |.  E8>call <jmp.&MFC42.#800>
00CC21DE  |.  8D>lea ecx,dword ptr ss:[esp+14]
00CC21E2  |.  C6>mov byte ptr ss:[esp+40],0
00CC21E7  |.  E8>call <jmp.&MFC42.#800>
00CC21EC  |.  8D>lea ecx,dword ptr ss:[esp+24]
00CC21F0  |.  89>mov dword ptr ss:[esp+40],ebx
00CC21F4  |.  E8>call <jmp.&MFC42.#800>
00CC21F9  |.  8B>mov eax,ebp
00CC21FB  |.  EB>jmp short TcDll.00CC2256
00CC21FD  |>  8D>lea ecx,dword ptr ss:[esp+28]
00CC2201  |.  C6>mov byte ptr ss:[esp+40],4
00CC2206  |.  E8>call <jmp.&MFC42.#800>
00CC220B  |>  8D>lea ecx,dword ptr ss:[esp+18]
00CC220F  |.  C6>mov byte ptr ss:[esp+40],3
00CC2214  |.  E8>call <jmp.&MFC42.#800>
00CC2219  |.  8D>lea ecx,dword ptr ss:[esp+1C]
00CC221D  |.  C6>mov byte ptr ss:[esp+40],2
00CC2222  |.  E8>call <jmp.&MFC42.#800>
00CC2227  |.  8D>lea ecx,dword ptr ss:[esp+20]
00CC222B  |.  C6>mov byte ptr ss:[esp+40],1
00CC2230  |.  E8>call <jmp.&MFC42.#800>
00CC2235  |.  8D>lea ecx,dword ptr ss:[esp+14]
00CC2239  |.  C6>mov byte ptr ss:[esp+40],0
00CC223E  |.  E8>call <jmp.&MFC42.#800>
00CC2243  |.  C7>mov dword ptr ss:[esp+40],-1
00CC224B  |>  8D>lea ecx,dword ptr ss:[esp+24]
00CC224F  |.  E8>call <jmp.&MFC42.#800>
00CC2254  |.  33>xor eax,eax
00CC2256  |>  8B>mov ecx,dword ptr ss:[esp+38]
00CC225A  |.  5F pop edi
00CC225B  |.  5E pop esi
00CC225C  |.  5D pop ebp

…………………………………………………………………………………………………………………………………………………………
总结:
先由用户名得到两个字符串:
第一:将用户名的ASCII一个一个累加起来并转化为10进制字符
第二:将用户名的ASCII一个一个乘以自己的位数全部相加起来的结果乘以用16减去用户名位数的数值比较是否超过了7FFF
如果如果没有超过就用FFFF减去上面得到的数值最后的结果转化为10进制字符
下面是部分比较了:
注册码的第12位必须等于第2次计算出来的第1位
注册码的地14位必须等于第一次计算出来的第1位
注册码的第6位必须等于用户名的位数
注册码的第8位必须等于第2次计算出来的第2位
注册码的第10位必须等于第1次计算出来的第2位
注册码的第2位必须等于第2次计算出来的第3位
注册码的第4位必须等于第1次计算出来的第3位
注册码的第16位必须等于第2次计算出来的第4位
第9位乘以10加上第7位的结果乘以10加上第13位的结果再乘以10再加上第11位的结果乘以10加上第3位乘以10加上第5位最后加上FFAE9EB0若这个结果加A
则A必须大于186A0
再上面的总结果先减去12345(10进制)再减去用户名第一次处理的结果2E1的结果叫B
再判断:
如果注册码的第一位与1 AND运算为0就要把上面的结果除以3E8如果运算结果为1就不计算了
这样B必须又小于186A0
这样就成功了
例如:
sjcrack
9317270913334746


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 328
活跃值: (925)
能力值: ( LV9,RANK:1010 )
在线值:
发帖
回帖
粉丝
2
上传不了附件,??
2005-8-13 15:50
0
雪    币: 50161
活跃值: (20635)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
最初由 liyangsj 发布
上传不了附件,??


有什么错误提示吗?建议刷新一下再试试。
2005-8-13 16:05
0
雪    币: 328
活跃值: (925)
能力值: ( LV9,RANK:1010 )
在线值:
发帖
回帖
粉丝
4
可以了,多谢!
2005-8-13 16:10
0
雪    币: 214
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
佩服、佩服
2005-8-13 18:17
0
游客
登录 | 注册 方可回帖
返回
//