一个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期)