00401111 > \B8 4F204000 mov eax, 0040204F ; ASCII "星晨缘"
00401116 . E8 1D020000 call 00401338 ; 取得用户名长度
0040111B . A3 A0214000 mov dword ptr [4021A0], eax ; 这里当然就是保存用户长度
00401120 . BB 4F204000 mov ebx, 0040204F ; ASCII "星晨缘"
00401125 . 0FB613 movzx edx, byte ptr [ebx] ; 取用户名第一位
00401128 . 0FB64C03 FF movzx ecx, byte ptr [ebx+eax-1] ; 取用户名最后一位
0040112D . 0FAFD1 imul edx, ecx ; 用户名第一位和最后一位相乘
00401130 . 50 push eax
00401131 . B9 02000000 mov ecx, 2 ; 这里的值用在下边做除数用的
00401136 . 52 push edx
00401137 . 31D2 xor edx, edx
00401139 . F7F9 idiv ecx ; 用户数除以2
0040113B . 5A pop edx ; idiv ece所得到的余数不要,用到前边相乖的值
0040113C . 0FB60C03 movzx ecx, byte ptr [ebx+eax] ; 用户数长度/2
00401140 . 0FAFD1 imul edx, ecx ; 用户长度/2,再*前边两个用户数相乘值
00401143 . BB B8204000 mov ebx, 004020B8 ; 将保存注册码的地址给EBX
00401148 . C703 484E542D mov dword ptr [ebx], 2D544E48 ; 将HNT-保存到注册码中,第一段注册码生成(固定值)
0040114E . 89D0 mov eax, edx
00401150 . 83C3 04 add ebx, 4 ; 将指针指向HNT-后一位
00401153 . E8 F7010000 call 0040134F ; 第二段注册码生成函数
mov dword ptr [ebx], 2D544E48
0040134F /$ 51 push ecx ; 保护现场
00401350 |. 56 push esi
00401351 |. 4B dec ebx
00401352 |. B9 04000000 mov ecx, 4 ; 下的边循环次数,4次
00401357 |. BE 0A000000 mov esi, 0A ; 固定的除数
0040135C |. 52 push edx
0040135D |> 31D2 xor edx, edx
0040135F |. F7FE idiv esi ; EAX/A的值做为下一轮被除数
00401361 |. 80C2 30 add dl, 30 ; EAX/A余数+30
00401364 |. 88140B mov byte ptr [ebx+ecx], dl
00401367 |.^ E2 F4 loopd short 0040135D ; ECX==1时停止循环
00401369 |. 5A pop edx
0040136A |. 5E pop esi
0040136B |. 59 pop ecx
0040136C \. C3 retn
00401158 . C705 00204000>mov dword ptr [402000], 1E
00401162 . 68 00204000 push 00402000 ; /pBufferSize = CrackMe.00402000
00401167 . 68 9A204000 push 0040209A ; |Buffer = CrackMe.0040209A
0040116C . E8 B34E0000 call <jmp.&KERNEL32.GetComputerNameA> ; \GetComputerNameA
00401171 . B8 9A204000 mov eax, 0040209A ; ASCII "DUKE-PC"
00401176 . E8 F2010000 call 0040136D ; 把计算机名个个值相加
0040117B . BB 4F204000 mov ebx, 0040204F ; ASCII "星晨缘"
00401180 . E8 00020000 call 00401385 ; 将用户代入计算,用户*所在位数然后再累加
00401185 . 50 push eax
00401186 . 31C0 xor eax, eax
00401188 . 0FA2 cpuid ; 取得CPU信息
0040118A . 58 pop eax
0040118B . 51 push ecx
0040118C . 52 push edx
0040118D . 21D8 and eax, ebx
0040118F . BB B8204000 mov ebx, 004020B8 ; ASCII "HNT-0768"
00401194 . 89DF mov edi, ebx
00401196 . 50 push eax
00401197 . 66:31C0 xor ax, ax
0040119A . F2:AE repne scas byte ptr es:[edi]
0040119C . 89FB mov ebx, edi
0040119E . 58 pop eax
0040119F . 4B dec ebx
004011A0 . C603 2D mov byte ptr [ebx], 2D ; 前边所得注册码后加个"-"
004011A3 . 43 inc ebx ; 指向最后个"-"
004011A4 . E8 A6010000 call 0040134F ; 将前边计算的值代入计算,生成第三断注册码
00401385 /$ 51 push ecx
00401386 |. 52 push edx
00401387 |. 89D8 mov eax, ebx
00401389 |. E8 AAFFFFFF call 00401338 ; 返回字符串位数
0040138E |. 89C1 mov ecx, eax
00401390 |. 4B dec ebx
00401391 |. 31D2 xor edx, edx ; 清除EDX,后边做为累加器用
00401393 |> 8A140B /mov dl, byte ptr [ebx+ecx] ; 从最后一位往前计算,不过用的是dl前边如有数据会保留下来的
00401396 |. 0FAFD1 |imul edx, ecx ; EDX*位数
00401399 |. 01D0 |add eax, edx ; 累加到EAX
0040139B |. 49 |dec ecx ; i--
0040139C |.^ 75 F5 \jnz short 00401393
0040139E |. 5A pop edx
0040139F |. 59 pop ecx
004013A0 \. C3 retn
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)