全局变量简单分析:屏幕监视专家2.1
【破解作者】 jsliyangsj
【作者邮箱】 sjcrack@yahoo.com.cn
【使用工具】 peid OllyDbg1.10
【破解平台】 Winxp
【软件名称】 屏幕监视专家2.1
【软件地址】 http://www.tlxsoft.com/pmjszj/index.htm
【编写语言】 C
一直在用它,不错。分析还是上个学期的事了,不能在拖了(不然忘了)。这里稍微整理了一下下。
此软件烦在全局变量上,败也在全局变量上。
如果看到注册成功就收手,呵呵录像白屏!!
全局变量--下内存断点。
过程:
0041EF38 /. 55 push ebp
0041EF39 |. 8BEC mov ebp,esp
0041EF3B |. 83C4>add esp,-3C
0041EF3E |. 8955>mov dword ptr ss:[ebp-3C],edx
0041EF41 |. 8945>mov dword ptr ss:[ebp-38],eax
0041EF44 |. B8 B>mov eax,pmjszj.004A4BBC
0041EF49 |. E8 6>call pmjszj.0048EDB8
0041EF4E |. 66:C>mov word ptr ss:[ebp-24],8
0041EF54 |. 8D45>lea eax,dword ptr ss:[ebp-4]
0041EF57 |. E8 5>call pmjszj.004035AC
0041EF5C |. 8BD0 mov edx,eax
0041EF5E |. FF45>inc dword ptr ss:[ebp-18]
0041EF61 |. 8B4D>mov ecx,dword ptr ss:[ebp-38]
0041EF64 |. 8B81>mov eax,dword ptr ds:[ecx+2E4]
0041EF6A |. E8 3>call pmjszj.0045B2A0
0041EF6F |. 8D55>lea edx,dword ptr ss:[ebp-4]
0041EF72 |. FF32 push dword ptr ds:[edx] ; 压入注册码
0041EF74 |. 8D45>lea eax,dword ptr ss:[ebp-8]
0041EF77 |. E8 3>call pmjszj.004035AC
0041EF7C |. 8BD0 mov edx,eax
0041EF7E |. FF45>inc dword ptr ss:[ebp-18]
0041EF81 |. 8B4D>mov ecx,dword ptr ss:[ebp-38]
0041EF84 |. 8B81>mov eax,dword ptr ds:[ecx+2DC]
0041EF8A |. E8 1>call pmjszj.0045B2A0
0041EF8F |. 8D55>lea edx,dword ptr ss:[ebp-8] ; |
0041EF92 |. FF32 push dword ptr ds:[edx] ; |压入用户名
0041EF94 |. 8B0D>mov ecx,dword ptr ds:[4A93D0] ; |pmjszj._MainForm
0041EF9A |. FF31 push dword ptr ds:[ecx] ; |Arg1
0041EF9C |. E8 A>call pmjszj.0040EE44 ; \pmjszj.0040EE44
0041EFA1 |. 83C4>add esp,0C
0041EFA4 |. FF4D>dec dword ptr ss:[ebp-18]
0041EFA7 |. 8D45>lea eax,dword ptr ss:[ebp-8]
0041EFAA |. BA 0>mov edx,2
0041EFAF |. E8 F>call pmjszj.004991AC
0041EFB4 |. FF4D>dec dword ptr ss:[ebp-18]
0041EFB7 |. 8D45>lea eax,dword ptr ss:[ebp-4]
0041EFBA |. BA 0>mov edx,2
0041EFBF |. E8 E>call pmjszj.004991AC
0041EFC4 |. 8B0D>mov ecx,dword ptr ds:[4A93D0] ; pmjszj._MainForm
0041EFCA |. FF31 push dword ptr ds:[ecx] ; /Arg1
0041EFCC |. E8 4>call pmjszj.00409A14 ; \对注册码第一次判断--注册码码输入格式是否正确
0041EFD1 |. 59 pop ecx
0041EFD2 |. 3C 0>cmp al,1
0041EFD4 |. 0F85>jnz pmjszj.0041F05E
0041EFDA |. A1 D>mov eax,dword ptr ds:[4A93D0]
0041EFDF |. FF30 push dword ptr ds:[eax] ; /Arg1
0041EFE1 |. E8 8>call pmjszj.00409A68 ; \第二次判断--用注册的前5位运算结果与机器码用户名计算的结果比较
0041EFE6 |. 59 pop ecx
0041EFE7 |. 3C 0>cmp al,1
0041EFE9 |. 75 7>jnz short pmjszj.0041F05E ; 关键比较
0041EFEB |. 66:C>mov word ptr ss:[ebp-24],14
0041EFF1 |. BA 3>mov edx,pmjszj.004A4B30 ; 注册成功
0041EFF6 |. 8D45>lea eax,dword ptr ss:[ebp-C]
0041EFF9 |. E8 A>call pmjszj.00498FA0
0041EFFE |. FF45>inc dword ptr ss:[ebp-18]
0041F001 |. 8B00 mov eax,dword ptr ds:[eax]
0041F003 |. E8 6>call pmjszj.00456168
0041F008 |. FF4D>dec dword ptr ss:[ebp-18]
0041F00B |. 8D45>lea eax,dword ptr ss:[ebp-C]
0041F00E |. BA 0>mov edx,2
0041F013 |. E8 9>call pmjszj.004991AC
0041F018 |. 8B0D>mov ecx,dword ptr ds:[4A93D0] ; pmjszj._MainForm
0041F01E |. 8B01 mov eax,dword ptr ds:[ecx]
0041F020 |. C680>mov byte ptr ds:[eax+414],1
0041F027 |. 8B15>mov edx,dword ptr ds:[4A93D0] ; pmjszj._MainForm
0041F02D |. 8B0A mov ecx,dword ptr ds:[edx]
0041F02F |. 8B81>mov eax,dword ptr ds:[ecx+3C4]
0041F035 |. B2 0>mov dl,1
0041F037 |. E8 5>call pmjszj.0043478C
0041F03C |. 8B0D>mov ecx,dword ptr ds:[4A93D0] ; pmjszj._MainForm
0041F042 |. FF31 push dword ptr ds:[ecx] ; /Arg1
0041F044 |. E8 0>call pmjszj.0040AC54 ; \pmjszj.0040AC54
0041F049 |. 59 pop ecx
0041F04A |. 8B45>mov eax,dword ptr ss:[ebp-38]
0041F04D |. C680>mov byte ptr ds:[eax+2F4],1
0041F054 |. 8B45>mov eax,dword ptr ss:[ebp-38]
0041F057 |. E8 4>call pmjszj.004490A0
0041F05C |. EB 3>jmp short pmjszj.0041F09A
0041F05E |> 66:C>mov word ptr ss:[ebp-24],20
0041F064 |. BA 3>mov edx,pmjszj.004A4B39 ; 注册失败
0041F069 |. 8D45>lea eax,dword ptr ss:[ebp-10]
0041F06C |. E8 2>call pmjszj.00498FA0
0041F071 |. FF45>inc dword ptr ss:[ebp-18]
0041F074 |. 8B00 mov eax,dword ptr ds:[eax]
0041F076 |. E8 E>call pmjszj.00456168
0041F07B |. FF4D>dec dword ptr ss:[ebp-18]
0041F07E |. 8D45>lea eax,dword ptr ss:[ebp-10]
………………………………………………………………………………………………………………………………
进入:0041EFCC |. E8 4>call pmjszj.00409A14 ; \对注册码第一次判断--注册码码输入格式是否正确
………………………………………………………………………………………………………………………………
00409A14 /$ 55 push ebp
00409A15 |. 8BEC mov ebp,esp
00409A17 |. 83C4>add esp,-8
00409A1A |. 33C0 xor eax,eax
00409A1C |. 8945>mov dword ptr ss:[ebp-8],eax
00409A1F |. 33D2 xor edx,edx
00409A21 |. 8955>mov dword ptr ss:[ebp-4],edx
00409A24 |> 8B4D>/mov ecx,dword ptr ss:[ebp+8] ; 全加起来
00409A27 |. 8B45>|mov eax,dword ptr ss:[ebp-4]
00409A2A |. 0FBE>|movsx edx,byte ptr ds:[ecx+eax+445] ; 得到每一位注册码
00409A32 |. 0155>|add dword ptr ss:[ebp-8],edx ; 把得到的每一位的ASCII加起来
00409A35 |. FF45>|inc dword ptr ss:[ebp-4] ; 计数器
00409A38 |. 837D>|cmp dword ptr ss:[ebp-4],13 ; 总共19位
00409A3C |.^ 7C E>\jl short pmjszj.00409A24 ; 将每一位值相加
00409A3E |. 8B4D>mov ecx,dword ptr ss:[ebp+8]
00409A41 |. 0FBE>movsx eax,byte ptr ds:[ecx+458] ; 第20位的注册
00409A48 |. 83C0>add eax,-41 ; 第20位的注册码的ASCII减去16进制41
00409A4B |. 8945>mov dword ptr ss:[ebp-4],eax
00409A4E |. 8B45>mov eax,dword ptr ss:[ebp-8] ; 得到前19位相加之和
00409A51 |. B9 1>mov ecx,14
00409A56 |. 99 cdq
00409A57 |. F7F9 idiv ecx ; 得到前19位相加之和除以16进制14
00409A59 |. 3B55>cmp edx,dword ptr ss:[ebp-4] ; 相除的余数与第20位的注册码的ASCII减去16进制41的结果比较
00409A5C |. 75 0>jnz short pmjszj.00409A62
00409A5E |. B0 0>mov al,1
00409A60 |. EB 0>jmp short pmjszj.00409A64
00409A62 |> 33C0 xor eax,eax
00409A64 |> 59 pop ecx
00409A65 |. 59 pop ecx
00409A66 |. 5D pop ebp
…………………………………………………………………………………………………………………………
上面检查输入格式,注册码一共有20位,第20位的注册码的ASCII减去41得到的结果
一定要等于前19位的输入码的ASCII相加的和除以20得到的余数。
…………………………………………………………………………………………………………………………
………………………………………………………………………………………………………………………………
进入 0041EFE1 |. E8 8>call pmjszj.00409A68 ; \第二次判断--用注册的前5位运算结果与机器码用户名计算的结果比较
…………………………………………………………………………………………………………………………………………
00409A68 /$ 55 push ebp
00409A69 |. 8BEC mov ebp,esp
00409A6B |. 83C4>add esp,-58
00409A6E |. B8 1>mov eax,pmjszj.0049E518
00409A73 |. E8 4>call pmjszj.0048EDB8
00409A78 |. 33D2 xor edx,edx
00409A7A |. 8955>mov dword ptr ss:[ebp-30],edx
00409A7D |> 8B4D>/mov ecx,dword ptr ss:[ebp-30] ; 控制位数
00409A80 |. 8B45>|mov eax,dword ptr ss:[ebp+8] ; 用户名的基地址
00409A83 |. 8A94>|mov dl,byte ptr ds:[eax+ecx+430] ; 得到用户名各个字符的ASCII
00409A8A |. 8B4D>|mov ecx,dword ptr ss:[ebp-30]
00409A8D |. 8B45>|mov eax,dword ptr ss:[ebp+8]
00409A90 |. 3294>|xor dl,byte ptr ds:[eax+ecx+46F] ; 用依次得到的用户名ASCII与依次得到机器码的每个字符的ASCII进行XOR运算
00409A97 |. 8B4D>|mov ecx,dword ptr ss:[ebp-30] ; 位数
00409A9A |. 8854>|mov byte ptr ss:[ebp+ecx-54],dl ; 上面XOR结果存储了
00409A9E |. FF45>|inc dword ptr ss:[ebp-30] ; 位数加1
00409AA1 |. 837D>|cmp dword ptr ss:[ebp-30],14 ; 一共20位
00409AA5 |.^ 7C D>\jl short pmjszj.00409A7D
…………………………………………………………………………………………………………………………
把用户名与机器码对应的ASCII XOR 储存用于下面再次运算
…………………………………………………………………………………………………………………………
00409AA7 |. 33D2 xor edx,edx
00409AA9 |. 8955>mov dword ptr ss:[ebp-34],edx
00409AAC |. 33C0 xor eax,eax
00409AAE |. 8945>mov dword ptr ss:[ebp-30],eax ; 计数器
00409AB1 |> 8B55>/mov edx,dword ptr ss:[ebp-30]
00409AB4 |. 0FBE>|movsx ecx,byte ptr ss:[ebp+edx-54] ; 依次得到上面刚刚处理好的20位结果
00409AB9 |. 894D>|mov dword ptr ss:[ebp-58],ecx
00409ABC |. DB45>|fild dword ptr ss:[ebp-58] ; 把得到的ASCII码转化为10进制实数
00409ABF |. 83C4>|add esp,-8 ; /
00409AC2 |. DD1C>|fstp qword ptr ss:[esp] ; |Arg1 (8-byte)
00409AC5 |. E8 2>|call pmjszj.004920F0 ; \pmjszj.004920F0
00409ACA |. 83C4>|add esp,8
00409ACD |. DB45>|fild dword ptr ss:[ebp-30]
00409AD0 |. DEC9 |fmulp st(1),st ; 依次得到上面对应XOR的20个结果乘以位数
00409AD2 |. DB45>|fild dword ptr ss:[ebp-34] ; 得到上一次相加的结果
00409AD5 |. DEC1 |faddp st(1),st ; 加上这次计算(与位数相乘)的结果
00409AD7 |. E8 3>|call pmjszj.00492118 ; 把实数转化为16进制数
00409ADC |. 8945>|mov dword ptr ss:[ebp-34],eax ; 结果储存
00409ADF |. FF45>|inc dword ptr ss:[ebp-30]
00409AE2 |. 837D>|cmp dword ptr ss:[ebp-30],14
00409AE6 |.^ 7C C>\jl short pmjszj.00409AB1
00409AE8 |. 8145>add dword ptr ss:[ebp-34],0D431 ; 最后结果加上0D431
…………………………………………………………………………………………………………………………
把上面得到的结果用20位,每一位的ASCII分别乘以它自己的位数全部相加起来最后结果加上D431(16进制)
位数从0开始的
…………………………………………………………………………………………………………………………
00409AEF |. 33D2 xor edx,edx
00409AF1 |. 8955>mov dword ptr ss:[ebp-30],edx
00409AF4 |> 8B4D>/mov ecx,dword ptr ss:[ebp-30] ; 计数器
00409AF7 |. 8B45>|mov eax,dword ptr ss:[ebp+8]
00409AFA |. 8A94>|mov dl,byte ptr ds:[eax+ecx+445] ; 依次得到得到注册码
00409B01 |. 80C2>|add dl,0E7 ; 每一位注册码的ASCII加上0E7只有两位进位不算
00409B04 |. 8B4D>|mov ecx,dword ptr ss:[ebp-30] ; 位数
00409B07 |. 8854>|mov byte ptr ss:[ebp+ecx-3C],dl ; 储存了
00409B0B |. FF45>|inc dword ptr ss:[ebp-30]
00409B0E |. 837D>|cmp dword ptr ss:[ebp-30],5 ; 只取前5位
00409B12 |.^ 7C E>\jl short pmjszj.00409AF4
00409B14 |. C645>mov byte ptr ss:[ebp-37],0
00409B18 |. 8B45>mov eax,dword ptr ss:[ebp-34] ; 得到上面加上0D431后的数据
00409B1B |. 8B55>mov edx,dword ptr ss:[ebp+8]
00409B1E |. 8982>mov dword ptr ds:[edx+418],eax ; 转存在另一个地方,重要的数据后面第三次用到的(由第三次计算后下内存断点得到这里)
00409B24 |. 8D45>lea eax,dword ptr ss:[ebp-8]
00409B27 |. 8B55>mov edx,dword ptr ss:[ebp-34]
00409B2A |. E8 8>call pmjszj.004990B8 ; 进入 用机器码与用户名得到的结果计算出1个字符串
00409B2F |. 50 push eax
00409B30 |. FF45>inc dword ptr ss:[ebp-10]
00409B33 |. 66:C>mov word ptr ss:[ebp-1C],8
00409B39 |. 8D55>lea edx,dword ptr ss:[ebp-3C]
00409B3C |. 8D45>lea eax,dword ptr ss:[ebp-4]
00409B3F |. E8 5>call pmjszj.00498FA0
00409B44 |. FF45>inc dword ptr ss:[ebp-10]
00409B47 |. 5A pop edx
00409B48 |. E8 2>call pmjszj.0049927C
00409B4D |. 50 push eax
00409B4E |. FF4D>dec dword ptr ss:[ebp-10]
00409B51 |. 8D45>lea eax,dword ptr ss:[ebp-8]
00409B54 |. BA 0>mov edx,2
00409B59 |. E8 4>call pmjszj.004991AC
00409B5E |. FF4D>dec dword ptr ss:[ebp-10]
00409B61 |. 8D45>lea eax,dword ptr ss:[ebp-4]
00409B64 |. BA 0>mov edx,2
00409B69 |. E8 3>call pmjszj.004991AC
00409B6E |. 58 pop eax
00409B6F |. 84C0 test al,al
00409B71 |. 74 0>je short pmjszj.00409B81
00409B73 |. B0 0>mov al,1
00409B75 |. 8B55>mov edx,dword ptr ss:[ebp-2C]
00409B78 |. 64:8>mov dword ptr fs:[0],edx
00409B7F |. EB 0>jmp short pmjszj.00409B8D
00409B81 |> 33C0 xor eax,eax
00409B83 |. 8B55>mov edx,dword ptr ss:[ebp-2C]
00409B86 |. 64:8>mov dword ptr fs:[0],edx
00409B8D |> 8BE5 mov esp,ebp
00409B8F |. 5D pop ebp
……………………………………………………………………………………………………………………………………………………
00409B2A |. E8 8>call pmjszj.004990B8 ; 进入 用机器码与用户名得到的结果计算出1个字符串
……………………………………………………………………………………………………………………………………………………
004990D4 |. 8B55>mov edx,dword ptr ss:[ebp-4]
004990D7 |. 33C9 xor ecx,ecx
004990D9 |. 890A mov dword ptr ds:[edx],ecx
004990DB |. 53 push ebx ; /由用户名与机器码计算出来的数据
004990DC |. 68 E>push pmjszj.004A8EE3 ; |Arg2 = 004A8EE3 ASCII "%i"
004990E1 |. FF75>push dword ptr ss:[ebp-4] ; |Arg1
004990E4 |. E8 F>call pmjszj.004992E8 ; \进入
004990E9 |. 83C4>add esp,0C
004990EC |. 8B45>mov eax,dword ptr ss:[ebp-28]
004990EF |. 64:6>mov dword ptr fs:[0],eax
…………………………………………………………………………………………
进入004990E4 |. E8 F>call pmjszj.004992E8 ; \进入
…………………………………………………………………………………………………………………………
004992EF |. 8D45>lea eax,dword ptr ss:[ebp+10]
004992F2 |. 50 push eax ; /Arg3
004992F3 |. FF75>push dword ptr ss:[ebp+C] ; |Arg2
004992F6 |. 53 push ebx ; |Arg1
004992F7 |. E8 B>call pmjszj.004992AC ; \进入
004992FC |. 83C4>add esp,0C
004992FF |. 8BC3 mov eax,ebx
…………………………………………………………………………………………………………………………
004992F7 |. E8 B>call pmjszj.004992AC ; \进入
……………………………………………………………………………………………………………………………………
004992B0 |. 56 push esi
004992B1 |. 57 push edi
004992B2 |. 8B7D>mov edi,dword ptr ss:[ebp+C]
004992B5 |. 8B5D>mov ebx,dword ptr ss:[ebp+8]
004992B8 |. FF75>push dword ptr ss:[ebp+10] ; /Arg4
004992BB |. 57 push edi ; |Arg3
004992BC |. 6A 0>push 0 ; |Arg2 = 00000000
004992BE |. 6A 0>push 0 ; |Arg1 = 00000000
004992C0 |. E8 9>call pmjszj.00490560 ; \进入
004992C5 |. 83C4>add esp,10
004992C8 |. 8BF0 mov esi,eax
004992CA |. 8BD6 mov edx,esi
……………………………………………………………………………………………………
004992C0 |. E8 9>call pmjszj.00490560 ; \进入
…………………………………………………………………………………………………………………………
0049057C |. 8D45>lea eax,dword ptr ss:[ebp+8] ; |
0049057F |. 50 push eax ; |Arg2
00490580 |. 68 0>push pmjszj.00490500 ; |Arg1 = 00490500
00490585 |. E8 0>call pmjszj.00490998 ; \pmjszj.00490998
0049058A |. 83C4>add esp,18
……………………………………………………………………………………………………………………………………
进入00490585 |. E8 0>call pmjszj.00490998 ; \pmjszj.00490998
………………………………………………………………………………………………………………………………
00490DD2 |> \8A45>|mov al,byte ptr ss:[ebp-1D]
00490DD5 |. 50 |push eax ; /Arg6
00490DD6 |. 51 |push ecx ; |Arg5
00490DD7 |. 8B55>|mov edx,dword ptr ss:[ebp-38] ; |
00490DDA |. 52 |push edx ; |Arg4
00490DDB |. 8B4D>|mov ecx,dword ptr ss:[ebp-18] ; |
00490DDE |. 51 |push ecx ; |Arg3
00490DDF |. FF75>|push dword ptr ss:[ebp-24] ; |Arg2
00490DE2 |. FF75>|push dword ptr ss:[ebp-28] ; |Arg1
00490DE5 |. E8 B>|call pmjszj.004921A8 ; \进入计算出注册码的前5位
00490DEA |. 83C4>|add esp,18
00490DED |> 837D>|cmp dword ptr ss:[ebp-8],0
00490DF1 |. 0F8C>|jl pmjszj.00491010
00490DF7 |. 8B55>|mov edx,dword ptr ss:[ebp-18]
…………………………………………………………………………………………………………
进入
……………………………………………………………………………………………………………………
004921A8 /$ 55 push ebp
004921A9 |. 8BEC mov ebp,esp
004921AB |. 83C4>add esp,-44
004921AE |. 53 push ebx
004921AF |. 56 push esi
004921B0 |. 57 push edi
004921B1 |. 8B7D>mov edi,dword ptr ss:[ebp+14]
004921B4 |. 8B75>mov esi,dword ptr ss:[ebp+10]
004921B7 |. 83FF>cmp edi,2
004921BA |. 0F8C>jl pmjszj.0049224C
004921C0 |. 83FF>cmp edi,24
004921C3 |. 0F8F>jg pmjszj.0049224C
004921C9 |. 837D>cmp dword ptr ss:[ebp+C],0
004921CD |. 75 0>jnz short pmjszj.004921D7
004921CF |. 837D>cmp dword ptr ss:[ebp+8],0
004921D3 |. 73 2>jnb short pmjszj.004921F6
004921D5 |. EB 0>jmp short pmjszj.004921D9
004921D7 |> 7D 1>jge short pmjszj.004921F6
004921D9 |> 807D>cmp byte ptr ss:[ebp+18],0
004921DD |. 74 1>je short pmjszj.004921F6
004921DF |. C606>mov byte ptr ds:[esi],2D
004921E2 |. 46 inc esi
004921E3 |. 8B45>mov eax,dword ptr ss:[ebp+8]
004921E6 |. 8B55>mov edx,dword ptr ss:[ebp+C]
004921E9 |. F7D8 neg eax
004921EB |. 83D2>adc edx,0
004921EE |. 8945>mov dword ptr ss:[ebp+8],eax
004921F1 |. F7DA neg edx
004921F3 |. 8955>mov dword ptr ss:[ebp+C],edx
004921F6 |> 8D5D>lea ebx,dword ptr ss:[ebp-44] ; 这里是计算前5位注册码的地方
004921F9 |> 8BC7 /mov eax,edi
004921FB |. 99 |cdq
004921FC |. 52 |push edx ; 0
004921FD |. 50 |push eax ; A
004921FE |. 8B45>|mov eax,dword ptr ss:[ebp+8] ; 得到机器码与用户名计算出来的数据
00492201 |. 8B55>|mov edx,dword ptr ss:[ebp+C]
00492204 |. E8 2>|call pmjszj.00491C2E ; 机器码与用户名计算出来的数据计算出来的值除以A得到余数
00492209 |. 8803 |mov byte ptr ds:[ebx],al ; 余数储存
0049220B |. 8BC7 |mov eax,edi
0049220D |. 99 |cdq
0049220E |. 52 |push edx ; 0
0049220F |. 50 |push eax ; A
00492210 |. 8B45>|mov eax,dword ptr ss:[ebp+8] ; 得到机器码与用户名计算出来的数据
00492213 |. 8B55>|mov edx,dword ptr ss:[ebp+C]
00492216 |. 43 |inc ebx
00492217 |. E8 4>|call pmjszj.00491B6B ; 机器码与用户名计算出来的数据计算出来的值除以A得到商
0049221C |. 8945>|mov dword ptr ss:[ebp+8],eax ; 把得到的商储存覆盖原来的计算出来的值
0049221F |. 8955>|mov dword ptr ss:[ebp+C],edx
00492222 |. 83FA>|cmp edx,0
00492225 |.^ 75 D>|jnz short pmjszj.004921F9
00492227 |. 83F8>|cmp eax,0
0049222A |.^ 75 C>\jnz short pmjszj.004921F9 ; 上面的循环是把机器码与用户名计算的值一次一次除以A得到余数
0049222C |. EB 1>jmp short pmjszj.00492245
0049222E |> 4B /dec ebx
0049222F |. 8A03 |mov al,byte ptr ds:[ebx] ; 依次从最后得到的余数值
00492231 |. 3C 0>|cmp al,0A
00492233 |. 7D 0>|jge short pmjszj.0049223D ; 是否大于A不可能的 必不跳
00492235 |. 83C0>|add eax,30 ; 加30
00492238 |. 8806 |mov byte ptr ds:[esi],al ; 储存了!!
0049223A |. 46 |inc esi
0049223B |. EB 0>|jmp short pmjszj.00492245
0049223D |> 0245>|add al,byte ptr ss:[ebp+1C]
00492240 |. 04 F>|add al,0F6
00492242 |. 8806 |mov byte ptr ds:[esi],al
00492244 |. 46 |inc esi
00492245 |> 8D55> lea edx,dword ptr ss:[ebp-44] ; 得到上面余数地址
00492248 |. 3BDA |cmp ebx,edx
0049224A |.^ 75 E>\jnz short pmjszj.0049222E
0049224C |> C606>mov byte ptr ds:[esi],0
0049224F |. 8B45>mov eax,dword ptr ss:[ebp+10] ; 得到一串字符串,肯定为0~9
00492252 |. 5F pop edi
00492253 |. 5E pop esi
00492254 |. 5B pop ebx
00492255 |. 8BE5 mov esp,ebp
00492257 |. 5D pop ebp
…………………………………………………………………………………………………………………………
用机器码与用户名得到的结果(乘以位数加上D341之后的)分别除以A得到余数在加上30得到一串字符串
必定在0~9之间用这个字符串与输入码的处理后的前5位进行比较
…………………………………………………………………………………………………………………………
00409B6E |. 58 pop eax
00409B6F |. 84C0 test al,al
00409B71 |. 74 0>je short pmjszj.00409B81
00409B73 |. B0 0>mov al,1
00409B75 |. 8B55>mov edx,dword ptr ss:[ebp-2C]
00409B78 |. 64:8>mov dword ptr fs:[0],edx
00409B7F |. EB 0>jmp short pmjszj.00409B8D
00409B81 |> 33C0 xor eax,eax
…………………………………………………………………………………………………………………………
0041EFE1 |. E8 8>call pmjszj.00409A68 ; \第二次判断--用注册的前5位运算结果与机器码用户名计算的结果比较
0041EFE6 |. 59 pop ecx
0041EFE7 |. 3C 0>cmp al,1
0041EFE9 |. 75 7>jnz short pmjszj.0041F05E ; 关键比较
0041EFEB |. 66:C>mov word ptr ss:[ebp-24],14
0041EFF1 |. BA 3>mov edx,pmjszj.004A4B30 ; 注册成功
0041EFF6 |. 8D45>lea eax,dword ptr ss:[ebp-C]
0041EFF9 |. E8 A>call pmjszj.00498FA0
0041EFFE |. FF45>inc dword ptr ss:[ebp-18]
0041F001 |. 8B00 mov eax,dword ptr ds:[eax]
0041F003 |. E8 6>call pmjszj.00456168
0041F008 |. FF4D>dec dword ptr ss:[ebp-18]
0041F00B |. 8D45>lea eax,dword ptr ss:[ebp-C]
0041F00E |. BA 0>mov edx,2
0041F013 |. E8 9>call pmjszj.004991AC
0041F018 |. 8B0D>mov ecx,dword ptr ds:[4A93D0] ; pmjszj._MainForm
0041F01E |. 8B01 mov eax,dword ptr ds:[ecx]
0041F020 |. C680>mov byte ptr ds:[eax+414],1
0041F027 |. 8B15>mov edx,dword ptr ds:[4A93D0] ; pmjszj._MainForm
0041F02D |. 8B0A mov ecx,dword ptr ds:[edx]
0041F02F |. 8B81>mov eax,dword ptr ds:[ecx+3C4]
0041F035 |. B2 0>mov dl,1
0041F037 |. E8 5>call pmjszj.0043478C
0041F03C |. 8B0D>mov ecx,dword ptr ds:[4A93D0] ; pmjszj._MainForm
0041F042 |. FF31 push dword ptr ds:[ecx] ; /Arg1
0041F044 |. E8 0>call pmjszj.0040AC54 ; \pmjszj.0040AC54
0041F049 |. 59 pop ecx
0041F04A |. 8B45>mov eax,dword ptr ss:[ebp-38]
0041F04D |. C680>mov byte ptr ds:[eax+2F4],1
0041F054 |. 8B45>mov eax,dword ptr ss:[ebp-38]
0041F057 |. E8 4>call pmjszj.004490A0
0041F05C |. EB 3>jmp short pmjszj.0041F09A
0041F05E |> 66:C>mov word ptr ss:[ebp-24],20
0041F064 |. BA 3>mov edx,pmjszj.004A4B39 ; 注册失败
0041F069 |. 8D45>lea eax,dword ptr ss:[ebp-10]
0041F06C |. E8 2>call pmjszj.00498FA0
0041F071 |. FF45>inc dword ptr ss:[ebp-18]
0041F074 |. 8B00 mov eax,dword ptr ds:[eax]
0041F076 |. E8 E>call pmjszj.00456168
0041F07B |. FF4D>dec dword ptr ss:[ebp-18]
0041F07E |. 8D45>lea eax,dword ptr ss:[ebp-10]
………………………………………………………………………………………………………………………………………………
总结:
把用户名与机器码对应的ASCII XOR运算得到20位结果,得到的结果用20位,每一位的ASCII分别乘以它自己的
位数全部相加起来最后结果加上D431(16进制)位数从0开始的;结果分别除以A得到余数在加上30得到一串字符串
必定在0~9之间用这个字符串一共有5字符,用这5个字符的ASCII加上16进制19,即得到输入码的前5位字符
输入码一共有20位字符,第20位有要求:
第20位的注册码的ASCII减去41得到的结果
一定要等于前19位的输入码的ASCII相加的和除以20得到的余数
其中:把用户名与机器码对应的ASCII XOR运算得到20位结果,得到的结果用20位,每一位的ASCII分别乘以它自己的
位数全部相加起来最后结果加上D431(16进制)位数从0开始的用到第三次。结果为A。
…………………………………………………………………………………………………………………………………………
如果看到注册成功就收手,呵呵录像白屏!!
…………………………………………………………………………………………………………
第二部分:
………………………………………………………………………………………………………………………………
004026C8 $ 55 push ebp ; 这里准备计算第二组(第10位到第16位)计算及判断
004026C9 . 8BEC mov ebp,esp
004026CB . 83C4>add esp,-34
004026CE . 53 push ebx
004026CF . 56 push esi
004026D0 . 57 push edi
004026D1 . B8 3>mov eax,pmjszj.0049BE38
004026D6 . E8 D>call pmjszj.0048EDB8
004026DB . 33D2 xor edx,edx
004026DD . 8955>mov dword ptr ss:[ebp-2C],edx
004026E0 . 66:C>mov word ptr ss:[ebp-14],8
004026E6 . FF35>push dword ptr ds:[_MainForm] ; /Arg1 = 00E720CC
004026EC . E8 D>call pmjszj.004029D0 ; \处理机器码的地方(处理的结果为第二次判断作准备)
004026F1 . 59 pop ecx
004026F2 . B9 0>mov ecx,0A
004026F7 . 8B55>mov edx,dword ptr ss:[ebp+8]
004026FA . 8B45>mov eax,dword ptr ss:[ebp+C]
004026FD . 8B18 mov ebx,dword ptr ds:[eax]
004026FF . FF53>call dword ptr ds:[ebx+8]
00402702 . 8B45>mov eax,dword ptr ss:[ebp+C]
00402705 . E8 9>call pmjszj.00479FA4
0040270A . 8945>mov dword ptr ss:[ebp-30],eax
0040270D . 8D55>lea edx,dword ptr ss:[ebp-2C]
00402710 . B9 0>mov ecx,4
00402715 . 8B45>mov eax,dword ptr ss:[ebp+C]
00402718 . 8B18 mov ebx,dword ptr ds:[eax]
0040271A . FF53>call dword ptr ds:[ebx+8]
0040271D . FF35>push dword ptr ds:[_MainForm]
00402723 . E8 7>call pmjszj.00402AA0 ; 这里要得到全局变量(注册码)进行转化后计算
00402728 . 59 pop ecx
00402729 . 8B55>mov edx,dword ptr ss:[ebp+8]
0040272C . 83C2>add edx,24
0040272F . B9 0>mov ecx,4
00402734 . 8B45>mov eax,dword ptr ss:[ebp+C]
00402737 . 8B18 mov ebx,dword ptr ds:[eax]
00402739 . FF53>call dword ptr ds:[ebx+8]
0040273C . 8B55>mov edx,dword ptr ss:[ebp+8]
0040273F . 83C2>add edx,28
00402742 . B9 0>mov ecx,4
00402747 . 8B45>mov eax,dword ptr ss:[ebp+C]
0040274A . 8B18 mov ebx,dword ptr ds:[eax]
0040274C . FF53>call dword ptr ds:[ebx+8]
0040274F . 8B55>mov edx,dword ptr ss:[ebp+8]
00402752 . 83C2>add edx,38
00402755 . B9 0>mov ecx,4
0040275A . 8B45>mov eax,dword ptr ss:[ebp+C]
0040275D . 8B18 mov ebx,dword ptr ds:[eax]
0040275F . FF53>call dword ptr ds:[ebx+8]
00402762 . 8B55>mov edx,dword ptr ss:[ebp+8]
00402765 . 83C2>add edx,3C
00402768 . B9 0>mov ecx,4
0040276D . 8B45>mov eax,dword ptr ss:[ebp+C]
00402770 . 8B18 mov ebx,dword ptr ds:[eax]
00402772 . FF53>call dword ptr ds:[ebx+8]
00402775 . 8B55>mov edx,dword ptr ss:[ebp+8]
00402778 . 83C2>add edx,2C
0040277B . B9 0>mov ecx,4
00402780 . 8B45>mov eax,dword ptr ss:[ebp+C]
00402783 . 8B18 mov ebx,dword ptr ds:[eax]
00402785 . FF53>call dword ptr ds:[ebx+8]
00402788 . A1 4>mov eax,dword ptr ds:[_MainForm]
0040278D . 80B8>cmp byte ptr ds:[eax+414],0
00402794 . 75 2>jnz short pmjszj.004027BF
00402796 . 8B15>mov edx,dword ptr ds:[_MainForm]
0040279C . 8B8A>mov ecx,dword ptr ds:[edx+3EC]
004027A2 . 8B41>mov eax,dword ptr ds:[ecx+6C]
004027A5 . 8B15>mov edx,dword ptr ds:[_MainForm]
004027AB . 3B82>cmp eax,dword ptr ds:[edx+484]
004027B1 . 7E 0>jle short pmjszj.004027BF
004027B3 . 8B4D>mov ecx,dword ptr ss:[ebp+8]
004027B6 . C741>mov dword ptr ds:[ecx+24],2
004027BD . EB 0>jmp short pmjszj.004027CB
004027BF > FF35>push dword ptr ds:[_MainForm]
004027C5 . E8 E>call pmjszj.00402BB4 ; 这里两个结果相减了一定要保证等于0(其实是前6相减的绝对值小于10-6)
004027CA . 59 pop ecx ; 00E720CC
004027CB > 8B45>mov eax,dword ptr ss:[ebp+8]
004027CE . 8378>cmp dword ptr ds:[eax+24],0
004027D2 . 74 0>je short pmjszj.004027E1
004027D4 . 8B55>mov edx,dword ptr ss:[ebp+8]
004027D7 . 837A>cmp dword ptr ds:[edx+24],1
004027DB . 0F85>jnz pmjszj.0040291F
004027E1 > 8B55>mov edx,dword ptr ss:[ebp+8]
004027E4 . 83C2>add edx,1C
004027E7 . B9 0>mov ecx,4
004027EC . 8B45>mov eax,dword ptr ss:[ebp+C]
004027EF . 8B18 mov ebx,dword ptr ds:[eax]
004027F1 . FF53>call dword ptr ds:[ebx+8]
004027F4 . 8B55>mov edx,dword ptr ss:[ebp+8]
004027F7 . 83C2>add edx,20
004027FA . B9 0>mov ecx,4
004027FF . 8B45>mov eax,dword ptr ss:[ebp+C]
00402802 . 8B18 mov ebx,dword ptr ds:[eax]
00402804 . FF53>call dword ptr ds:[ebx+8]
00402807 . 8B55>mov edx,dword ptr ss:[ebp+8]
0040280A . 83C2>add edx,30
0040280D . B9 0>mov ecx,4
00402812 . 8B45>mov eax,dword ptr ss:[ebp+C]
00402815 . 8B18 mov ebx,dword ptr ds:[eax]
00402817 . FF53>call dword ptr ds:[ebx+8]
0040281A . A1 4>mov eax,dword ptr ds:[_MainForm] ; 下面是验证上面两处是否相等
0040281F . D980>fld dword ptr ds:[eax+42C] ; 又得到刚才的结果数据
00402825 . D80D>fmul dword ptr ds:[4029CC] ; 乘以1000
0040282B . E8 E>call pmjszj.00492118 ; 将结果转化为16进制放到EAX中
00402830 . 8945>mov dword ptr ss:[ebp-2C],eax ; 存储此处一定要为0
00402833 . 8B45>mov eax,dword ptr ss:[ebp+C]
00402836 . E8 6>call pmjszj.00479FA4
0040283B . 8BD0 mov edx,eax
0040283D . 8B0D>mov ecx,dword ptr ds:[_MainForm]
00402843 . 33C0 xor eax,eax
00402845 . 8A81>mov al,byte ptr ds:[ecx+414]
0040284B . 0FAF>imul eax,dword ptr ss:[ebp-2C] ; 上面的结果乘以0
0040284F . 03D0 add edx,eax
00402851 . 8B45>mov eax,dword ptr ss:[ebp+C]
00402854 . E8 5>call pmjszj.00479FB4
00402859 . 8B55>mov edx,dword ptr ss:[ebp+8]
0040285C . 8B4A>mov ecx,dword ptr ds:[edx+14]
0040285F . 8B41>mov eax,dword ptr ds:[ecx+8]
00402862 . 8945>mov dword ptr ss:[ebp-2C],eax
……………………………………………………………………………………………………………………………………………………
进入00402723 . E8 7>call pmjszj.00402AA0 ; 这里要得到全局变量(注册码)进行转化后计算
…………………………………………………………………………………………………………………………………………………………
00402AA0 $ 55 push ebp
00402AA1 . 8BEC mov ebp,esp
00402AA3 . 83C4>add esp,-48
00402AA6 . 53 push ebx
00402AA7 . 56 push esi
00402AA8 . 57 push edi
00402AA9 . B8 F>mov eax,pmjszj.0049DAFC
00402AAE . E8 0>call pmjszj.0048EDB8
00402AB3 . 66:C>mov word ptr ss:[ebp-1C],8
00402AB9 . 8D45>lea eax,dword ptr ss:[ebp-4]
00402ABC . E8 E>call pmjszj.004035AC
00402AC1 . FF45>inc dword ptr ss:[ebp-10]
00402AC4 . 66:C>mov word ptr ss:[ebp-1C],14
00402ACA . 33D2 xor edx,edx
00402ACC . 8955>mov dword ptr ss:[ebp-30],edx
00402ACF > B9 0>mov ecx,0F
00402AD4 . 2B4D>sub ecx,dword ptr ss:[ebp-30]
00402AD7 . 8B45>mov eax,dword ptr ss:[ebp+8]
00402ADA . 8A94>mov dl,byte ptr ds:[eax+ecx+445] ; 这里取值了第二次取值。(全局变量)!!(是下内存访问断点首先来到这里的)
00402AE1 . 80C2>add dl,0EC ; 从后面向前面取值(第16位到第10位)分别加上EC
00402AE4 . 8B4D>mov ecx,dword ptr ss:[ebp-30]
00402AE7 . 8854>mov byte ptr ss:[ebp+ecx-48],dl ; 存储了
00402AEB . FF45>inc dword ptr ss:[ebp-30]
00402AEE . 837D>cmp dword ptr ss:[ebp-30],6
00402AF2 .^ 7C D>jl short pmjszj.00402ACF
00402AF4 . C645>mov byte ptr ss:[ebp-42],0
00402AF8 . 66:C>mov word ptr ss:[ebp-1C],20
00402AFE . 8D55>lea edx,dword ptr ss:[ebp-48] ; 取从第16位开始的6位向前是个小数
00402B01 . 8D45>lea eax,dword ptr ss:[ebp-8]
00402B04 . E8 9>call pmjszj.00498FA0
00402B09 . FF45>inc dword ptr ss:[ebp-10]
00402B0C . 8D55>lea edx,dword ptr ss:[ebp-8]
00402B0F . 8D45>lea eax,dword ptr ss:[ebp-4]
00402B12 . E8 C>call pmjszj.004991DC
00402B17 . FF4D>dec dword ptr ss:[ebp-10]
00402B1A . 8D45>lea eax,dword ptr ss:[ebp-8]
00402B1D . BA 0>mov edx,2
00402B22 . E8 8>call pmjszj.004991AC
00402B27 . 66:C>mov word ptr ss:[ebp-1C],2C
00402B2D . 8D45>lea eax,dword ptr ss:[ebp-4]
00402B30 . E8 A>call pmjszj.004994E0 ; 把上面根据注册码转变来的小数转化为实数
00402B35 . 8B55>mov edx,dword ptr ss:[ebp+8]
00402B38 . D99A>fstp dword ptr ds:[edx+428]
00402B3E . 66:C>mov word ptr ss:[ebp-1C],14
00402B44 . EB 1>jmp short pmjszj.00402B5C
00402B46 . 8B4D>mov ecx,dword ptr ss:[ebp+8]
00402B49 . 33C0 xor eax,eax
00402B4B . 8981>mov dword ptr ds:[ecx+428],eax
00402B51 . 66:C>mov word ptr ss:[ebp-1C],34
00402B57 . E8 3>call pmjszj.00496092
00402B5C > 8B55>mov edx,dword ptr ss:[ebp+8]
00402B5F . D982>fld dword ptr ds:[edx+428]
00402B65 . 83C4>add esp,-8 ; /
00402B68 . DD1C>fstp qword ptr ss:[esp] ; |Arg1 (8-byte)
00402B6B . E8 5>call pmjszj.004934C4 ; \将转化后的值进行取SIN值(计算器中的弧度值)
00402B70 . 83C4>add esp,8
00402B73 . DC0D>fmul qword ptr ds:[402BAC] ; SIN后的值与固定值进行相乘0.88891
00402B79 . 8B4D>mov ecx,dword ptr ss:[ebp+8]
00402B7C . D8A9>fsubr dword ptr ds:[ecx+428] ; 再次用注册码转化来的小数减去上面得到的结果值
00402B82 . 8B45>mov eax,dword ptr ss:[ebp+8]
00402B85 . D998>fstp dword ptr ds:[eax+428] ; 结果存储起来
00402B8B . FF4D>dec dword ptr ss:[ebp-10]
00402B8E . 8D45>lea eax,dword ptr ss:[ebp-4]
00402B91 . BA 0>mov edx,2
00402B96 . E8 1>call pmjszj.004991AC
00402B9B . 8B4D>mov ecx,dword ptr ss:[ebp-2C]
00402B9E . 64:8>mov dword ptr fs:[0],ecx
00402BA5 . 5F pop edi
00402BA6 . 5E pop esi
00402BA7 . 5B pop ebx
00402BA8 . 8BE5 mov esp,ebp
00402BAA . 5D pop ebp
00402BAB . C3 retn
………………………………………………………………………………………………………………………………………………
这里是:将注册码的第16位开始向前取6位每一位加上EC变成ASCII其实是个小数,(转化为实数)结果为B再进行运算B-0.88891*SINB
这个值然后与机器码计算出来的值比较看是否相等。
…………………………………………………………………………………………………………………………………………………………
004027C5 . E8 E>call pmjszj.00402BB4 ; 这里两个结果相减了一定要保证等于0(其实是前6相减的绝对值小于10-6)
……………………………………………………………………………………………………………………………………………………………………
00402BB4 /$ 55 push ebp ; 呵呵
00402BB5 |. 8BEC mov ebp,esp
00402BB7 |. 8B45>mov eax,dword ptr ss:[ebp+8]
00402BBA |. D980>fld dword ptr ds:[eax+428] ; 得到刚才的值
00402BC0 |. 8B55>mov edx,dword ptr ss:[ebp+8]
00402BC3 |. D8A2>fsub dword ptr ds:[edx+424] ; 减去由机器码计算出来的值
00402BC9 |. 83C4>add esp,-8 ; /
00402BCC |. DD1C>fstp qword ptr ss:[esp] ; |Arg1 (8-byte)
00402BCF |. E8 1>call pmjszj.004920F0 ; \将负数变位正数
00402BD4 |. 83C4>add esp,8
00402BD7 |. 8B4D>mov ecx,dword ptr ss:[ebp+8]
00402BDA |. D999>fstp dword ptr ds:[ecx+42C] ; 存储
00402BE0 |. 5D pop ebp
……………………………………………………………………………………………………………………………………
上面就是与机器码计算出来的值进行比较
……………………………………………………………………………………………………………………………………
这里就是进行处理机器码的地方:004026EC . E8 D>call pmjszj.004029D0
…………………………………………………………………………………………………………………………
004029D0 /$ 55 push ebp ; 处理机器码的地方
004029D1 |. 8BEC mov ebp,esp
004029D3 |. 83C4>add esp,-2C
004029D6 |. 33C0 xor eax,eax
004029D8 |. 8945>mov dword ptr ss:[ebp-C],eax
004029DB |> 8B55>/mov edx,dword ptr ss:[ebp+8]
004029DE |. 8B4D>|mov ecx,dword ptr ss:[ebp-C]
004029E1 |. 8A84>|mov al,byte ptr ds:[edx+ecx+46F] ; 依次得到每一位机器码
004029E8 |. 8B55>|mov edx,dword ptr ss:[ebp+8]
004029EB |. 8B4D>|mov ecx,dword ptr ss:[ebp-C]
004029EE |. 0A84>|or al,byte ptr ds:[edx+ecx+430] ; 依次得到每一位机器码与用户名进行OR运算
004029F5 |. 8B55>|mov edx,dword ptr ss:[ebp-C]
004029F8 |. 8844>|mov byte ptr ss:[ebp+edx-24],al ; 保存
004029FC |. FF45>|inc dword ptr ss:[ebp-C]
004029FF |. 837D>|cmp dword ptr ss:[ebp-C],14
00402A03 |.^ 7C D>\jl short pmjszj.004029DB ; 这一段就是就机器码与用户名对应位进行OR运算最后结果保存
00402A05 |. 33C0 xor eax,eax ; 这里处理机器码了
00402A07 |. 8945>mov dword ptr ss:[ebp-8],eax
00402A0A |. 33C9 xor ecx,ecx
00402A0C |. 894D>mov dword ptr ss:[ebp-C],ecx
00402A0F |> 8B45>/mov eax,dword ptr ss:[ebp-C]
00402A12 |. 0FBE>|movsx edx,byte ptr ss:[ebp+eax-24] ; 得到刚才计算出来的每一位
00402A17 |. 8955>|mov dword ptr ss:[ebp-28],edx
00402A1A |. DB45>|fild dword ptr ss:[ebp-28] ; 将每一位机器码转化为实数
00402A1D |. 83C4>|add esp,-8 ; /
00402A20 |. DD1C>|fstp qword ptr ss:[esp] ; |存储
00402A23 |. E8 C>|call pmjszj.004920F0 ; \负数转化为正数
00402A28 |. 83C4>|add esp,8
00402A2B |. B9 1>|mov ecx,14
00402A30 |. 2B4D>|sub ecx,dword ptr ss:[ebp-C]
00402A33 |. 894D>|mov dword ptr ss:[ebp-2C],ecx
00402A36 |. DB45>|fild dword ptr ss:[ebp-2C]
00402A39 |. DEC9 |fmulp st(1),st ; 将刚才计算出来的每一位机器码转化10进制后乘以(20减去位数)
00402A3B |. DB45>|fild dword ptr ss:[ebp-8] ; 装入前一次的结果
00402A3E |. DEC1 |faddp st(1),st ; 将每一次结果加起来
00402A40 |. E8 D>|call pmjszj.00492118 ; 结果转化位16进制放到EAX中
00402A45 |. 8945>|mov dword ptr ss:[ebp-8],eax
00402A48 |. FF45>|inc dword ptr ss:[ebp-C] ; 下一位
00402A4B |. 837D>|cmp dword ptr ss:[ebp-C],14
00402A4F |.^ 7C B>\jl short pmjszj.00402A0F
00402A51 |. 8B45>mov eax,dword ptr ss:[ebp-8]
00402A54 |. B9 A>mov ecx,186A0 ; 固定值100000
00402A59 |. 99 cdq
00402A5A |. F7F9 idiv ecx ; 上面的结果除以100000
00402A5C |. 8955>mov dword ptr ss:[ebp-4],edx ; 余数存储
00402A5F |. 8B45>mov eax,dword ptr ss:[ebp-8] ; 取上面相加的值
00402A62 |. 05 3>add eax,3039 ; 将上面相加的值加上12345
00402A67 |. 25 0>and eax,80000007 ; 结果与80000007进行与运算
00402A6C |. 79 0>jns short pmjszj.00402A73 ; 如果是E数
00402A6E |. 48 dec eax
00402A6F |. 83C8>or eax,FFFFFFF8
00402A72 |. 40 inc eax
00402A73 |> 8945>mov dword ptr ss:[ebp-8],eax ; 存储
00402A76 |. DB45>fild dword ptr ss:[ebp-8] ; 装入这个值
00402A79 |. DB45>fild dword ptr ss:[ebp-4] ; 在装入前面除以100000的余数值
00402A7C |. DB2D>fld tbyte ptr ds:[402A94] ; 装入固定值1.5283002229637196370E-06
00402A82 |. DEC9 fmulp st(1),st ; 余数乘以固定值1.5283002229637196370E-06
00402A84 |. DEC1 faddp st(1),st ; 再加上2
00402A86 |. 8B55>mov edx,dword ptr ss:[ebp+8]
00402A89 |. D99A>fstp dword ptr ds:[edx+424] ; 结果存储了
00402A8F |. 8BE5 mov esp,ebp
00402A91 |. 5D pop ebp
00402A92 \. C3 retn
……………………………………………………………………………………………………………………………………………………
第三部分;注意来到这里是随机的
…………………………………………………………………………………………………………………………………………………………
00406A10 /$ 55 push ebp ; 这里就是计算正确第三组数据的地方
00406A11 |. 8BEC mov ebp,esp
00406A13 |. 83C4>add esp,-8
00406A16 |. 8B45>mov eax,dword ptr ss:[ebp+8]
00406A19 |. 8B90>mov edx,dword ptr ds:[eax+418] ; 取出第一次计算计算出来的数据(是根据在EAX+418下内存访问断点知道是第一次计算中的结果)
00406A1F |. 8955>mov dword ptr ss:[ebp-4],edx
00406A22 |. 8B4D>mov ecx,dword ptr ss:[ebp-4]
00406A25 |. 81C1>add ecx,4D44 ; 取出的结果加上4D44
00406A2B |. 894D>mov dword ptr ss:[ebp-8],ecx
00406A2E |. DB45>fild dword ptr ss:[ebp-8]
00406A31 |. DC0D>fmul qword ptr ds:[406A68] ; 结果乘以3.14
00406A37 |. DB2D>fld tbyte ptr ds:[406A70]
00406A3D |. DEC9 fmulp st(1),st ; 结果再乘以0.1594896331738437110
00406A3F |. E8 D>call pmjszj.00492118
00406A44 |. 8945>mov dword ptr ss:[ebp-4],eax
00406A47 |. 8B45>mov eax,dword ptr ss:[ebp-4]
00406A4A |. B9 A>mov ecx,186A0
00406A4F |. 99 cdq
00406A50 |. F7F9 idiv ecx
00406A52 |. 8955>mov dword ptr ss:[ebp-4],edx
00406A55 |. 8B45>mov eax,dword ptr ss:[ebp-4]
00406A58 |. 8B55>mov edx,dword ptr ss:[ebp+8]
00406A5B |. 8982>mov dword ptr ds:[edx+41C],eax ; 写入了(就是根据这里的地址(EDX+41C)下内存访问断点来到这里的)
00406A61 |. 59 pop ecx
00406A62 |. 59 pop ecx
00406A63 |. 5D pop ebp
00406A64 \. C3 retn
……………………………………………………………………………………………………………………………………………………………………
用第一次计算出来的值A在加上4D44再乘以3.14再乘以0.1594896331738437110
……………………………………………………………………………………………………………………………………………………………………
00406E50 /$ 55 push ebp ; 注意来到这里是随机的!!这里是第三次比较判断:计算第三部分注册码的地方
00406E51 |. 8BEC mov ebp,esp
00406E53 |. 83C4>add esp,-34
00406E56 |. 33C0 xor eax,eax
00406E58 |. 8945>mov dword ptr ss:[ebp-4],eax
00406E5B |> 8B55>/mov edx,dword ptr ss:[ebp-4]
00406E5E |. 8B4D>|mov ecx,dword ptr ss:[ebp+8]
00406E61 |. 0FBE>|movsx eax,byte ptr ds:[ecx+edx+46F]
00406E69 |. 25 0>|and eax,80000001
00406E6E |. 79 0>|jns short pmjszj.00406E75
00406E70 |. 48 |dec eax
00406E71 |. 83C8>|or eax,FFFFFFFE
00406E74 |. 40 |inc eax
00406E75 |> 85C0 |test eax,eax
00406E77 |. 75 2>|jnz short pmjszj.00406EA8
00406E79 |. 8B55>|mov edx,dword ptr ss:[ebp-4]
00406E7C |. 8B4D>|mov ecx,dword ptr ss:[ebp+8]
00406E7F |. 8A84>|mov al,byte ptr ds:[ecx+edx*2+44A]
00406E86 |. 04 E>|add al,0E7
00406E88 |. 8B55>|mov edx,dword ptr ss:[ebp-4]
00406E8B |. 8844>|mov byte ptr ss:[ebp+edx*2-1C],al
00406E8F |. 8B4D>|mov ecx,dword ptr ss:[ebp-4]
00406E92 |. 8B45>|mov eax,dword ptr ss:[ebp+8]
00406E95 |. 8A94>|mov dl,byte ptr ds:[eax+ecx*2+44B]
00406E9C |. 80C2>|add dl,0E7
00406E9F |. 8B4D>|mov ecx,dword ptr ss:[ebp-4]
00406EA2 |. 8854>|mov byte ptr ss:[ebp+ecx*2-1B],dl
00406EA6 |. EB 2>|jmp short pmjszj.00406ED5
00406EA8 |> 8B45>|mov eax,dword ptr ss:[ebp-4]
00406EAB |. 8B55>|mov edx,dword ptr ss:[ebp+8]
00406EAE |. 8A8C>|mov cl,byte ptr ds:[edx+eax*2+44B] ; 取第6位开始这一组的输入码(在全局变量〔可以在保存时候可以看到我这里00e72511看到,[edx+eax*2+44B]下内存断点)
00406EB5 |. 80C1>|add cl,0E7
00406EB8 |. 8B45>|mov eax,dword ptr ss:[ebp-4]
00406EBB |. 884C>|mov byte ptr ss:[ebp+eax*2-1C],cl
00406EBF |. 8B55>|mov edx,dword ptr ss:[ebp-4]
00406EC2 |. 8B4D>|mov ecx,dword ptr ss:[ebp+8]
00406EC5 |. 8A84>|mov al,byte ptr ds:[ecx+edx*2+44A]
00406ECC |. 04 E>|add al,0E7
00406ECE |. 8B55>|mov edx,dword ptr ss:[ebp-4]
00406ED1 |. 8844>|mov byte ptr ss:[ebp+edx*2-1B],al
00406ED5 |> FF45>|inc dword ptr ss:[ebp-4]
00406ED8 |. 837D>|cmp dword ptr ss:[ebp-4],2
00406EDC |.^ 0F8C>\jl pmjszj.00406E5B ; 这个循环取出四组数据
00406EE2 |. 8B4D>mov ecx,dword ptr ss:[ebp+8]
00406EE5 |. FFB1>push dword ptr ds:[ecx+41C] ; /取出ECX+41C地址的数据(根据这里地址ECX+41C下内存访问断点去上一层找怎么样计算出来的数据的)
00406EEB |. 68 2>push pmjszj.0049BB2E ; |Arg2 = 0049BB2E ASCII "%d"
00406EF0 |. 8D45>lea eax,dword ptr ss:[ebp-34] ; |
00406EF3 |. 50 push eax ; |Arg1
00406EF4 |. E8 2>call pmjszj.00490628 ; \将前面计算出来的用于比较的值转化为十进制
00406EF9 |. 83C4>add esp,0C
00406EFC |. 8B55>mov edx,dword ptr ss:[ebp+8]
00406EFF |. 8A8A>mov cl,byte ptr ds:[edx+44E] ; 第5组了
00406F05 |. 80C1>add cl,0E7
00406F08 |. 884D>mov byte ptr ss:[ebp-18],cl
00406F0B |. C645>mov byte ptr ss:[ebp-17],0
00406F0F |. 33C0 xor eax,eax
00406F11 |. 8945>mov dword ptr ss:[ebp-4],eax
00406F14 |> 8B55>/mov edx,dword ptr ss:[ebp-4]
00406F17 |. 0FBE>|movsx ecx,byte ptr ss:[ebp+edx-1C]
00406F1C |. 83F9>|cmp ecx,28
00406F1F |. 75 0>|jnz short pmjszj.00406F29
00406F21 |. 8B45>|mov eax,dword ptr ss:[ebp-4]
00406F24 |. C644>|mov byte ptr ss:[ebp+eax-1C],0
00406F29 |> FF45>|inc dword ptr ss:[ebp-4]
00406F2C |. 837D>|cmp dword ptr ss:[ebp-4],4
00406F30 |.^ 7C E>\jl short pmjszj.00406F14
00406F32 |. 8D55>lea edx,dword ptr ss:[ebp-1C]
00406F35 |. 52 push edx
00406F36 |. 8D4D>lea ecx,dword ptr ss:[ebp-34]
00406F39 |. 51 push ecx
00406F3A |. E8 C>call pmjszj.0048EB00 ; 取第6到10位与计算出来的进行比较
00406F3F |. 83C4>add esp,8
00406F42 |. 8B55>mov edx,dword ptr ss:[ebp+8]
00406F45 |. 8982>mov dword ptr ds:[edx+420],eax
00406F4B |. 8BE5 mov esp,ebp
00406F4D |. 5D pop ebp
00406F4E \. C3 retn
………………………………………………………………………………………………………………………………………………
第三次:
将用第一次计算出来的值A在加上4D44再乘以3.14再乘以0.1594896331738437110的结果取其整数部分与
输入码的第6、7、8、9、10位分别加上E7后的数比较
………………………………………………………………………………………………………………………………………………
总结:注册分三步:
第一步:(看上去成功,其实…………
把用户名与机器码对应的ASCII XOR运算得到20位结果,得到的结果用20位,每一位的ASCII分别乘以它自己的
位数全部相加起来最后结果加上D431(16进制)位数从0开始的;结果分别除以A得到余数在加上30得到一串字符串
必定在0~9之间用这个字符串一共有5字符,用这5个字符的ASCII加上16进制19,即得到输入码的前5位字符
输入码一共有20位字符,第20位有要求:
第20位的注册码的ASCII减去41得到的结果
一定要等于前19位的输入码的ASCII相加的和除以20得到的余数
其中:把用户名与机器码对应的ASCII XOR运算得到20位结果,得到的结果用20位,每一位的ASCII分别乘以它自己的
位数全部相加起来最后结果加上D431(16进制)位数从0开始的用到第三次。结果为A。
第二步:
将注册码的第16位开始向前取6位每一位加上EC变成ASCII其实是个小数,(转化为实数)结果为B再进行运算B-0.88891*SINB
这个值然后与机器码计算出来的值比较看是否相等。(当然要写注册机的会要反过来哦-解方程吧)
第三步:
第三次:
将用第一次计算出来的值A在加上4D44再乘以3.14再乘以0.1594896331738437110的结果取其整数部分与
输入码的第6、7、8、9、10位分别加上E7后的数比较
………………………………………………………………………………………………………………………………………………
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课