[软件名称] : EditPlus - 用过的都知道,有点强大的文本编辑器。不多介绍
[编译类型] : VC++ 9.0
[是否有壳] : 无壳
[注册类型] : 用户输入用户名和注册码,按照计算后的值进行规则匹配,追不出真码.
[作者信息] : LYQingYe
[附加信息] : 这也许是我最后一篇帖子吧,来这论坛也有一段时间了。学到了许多,再次先感谢以前给予我帮助的人。祝吾爱汇编论坛越来越强大。
//算法CALL 可以从按钮事件找到 , 在此不做演示 算法CALL地址 - Algorithm_0x004D6CB0
//本次算法用到的 用户名 "XUEPOJIE" 假码 "0123456789" 到后面会有改变
- 004D6CB0 83EC 08 sub esp,0x8
- 004D6CB3 56 push esi
- 004D6CB4 8D4424 04 lea eax,dword ptr ss:[esp+0x4]
- 004D6CB8 50 push eax
- 004D6CB9 8BF1 mov esi,ecx
- 004D6CBB C74424 08 00000000 mov dword ptr ss:[esp+0x8],0x0
- 004D6CC3 E8 58FDFFFF call editplus.004D6A20 ; 第一层算法
- 004D6CC8 85C0 test eax,eax
- 004D6CCA 75 3D jnz short editplus.004D6D09
- 004D6CCC 8D4C24 08 lea ecx,dword ptr ss:[esp+0x8]
- 004D6CD0 51 push ecx
- 004D6CD1 8BCE mov ecx,esi
- 004D6CD3 894424 0C mov dword ptr ss:[esp+0xC],eax
- 004D6CD7 E8 84FEFFFF call editplus.004D6B60 ; 第二层算法
- 004D6CDC 8B4C24 08 mov ecx,dword ptr ss:[esp+0x8]
- 004D6CE0 8B5424 04 mov edx,dword ptr ss:[esp+0x4]
- 004D6CE4 85C9 test ecx,ecx
- 004D6CE6 76 0A jbe short editplus.004D6CF2
- 004D6CE8 81FA 7F4E0000 cmp edx,0x4E7F
- 004D6CEE 74 02 je short editplus.004D6CF2
- 004D6CF0 8BD1 mov edx,ecx
- 004D6CF2 85C0 test eax,eax
- 004D6CF4 75 13 jnz short editplus.004D6D09
- 004D6CF6 85D2 test edx,edx
- 004D6CF8 74 0A je short editplus.004D6D04
- 004D6CFA 6A FF push -0x1
- 004D6CFC 6A 10 push 0x10
- 004D6CFE 52 push edx
- 004D6CFF E8 B33D0400 call editplus.0051AAB7 ; 错误提示
- 004D6D04 5E pop esi
- 004D6D05 83C4 08 add esp,0x8
- 004D6D08 C3 retn
复制代码 //先进入第一层算法
- 004D6A20 81EC 5C040000 sub esp,0x45C
- 004D6A26 A1 7C9D5C00 mov eax,dword ptr ds:[0x5C9D7C]
- 004D6A2B 33C4 xor eax,esp
- 004D6A2D 898424 58040000 mov dword ptr ss:[esp+0x458],eax
- 004D6A34 8B8424 60040000 mov eax,dword ptr ss:[esp+0x460]
- 004D6A3B 53 push ebx
- 004D6A3C 55 push ebp
- 004D6A3D 8BE9 mov ebp,ecx
- 004D6A3F 8D4C24 08 lea ecx,dword ptr ss:[esp+0x8]
- 004D6A43 51 push ecx
- 004D6A44 68 F4010000 push 0x1F4
- 004D6A49 8D9424 80000000 lea edx,dword ptr ss:[esp+0x80]
- 004D6A50 894424 14 mov dword ptr ss:[esp+0x14],eax
- 004D6A54 52 push edx
- 004D6A55 8D85 C8000000 lea eax,dword ptr ss:[ebp+0xC8]
- 004D6A5B 50 push eax
- 004D6A5C E8 4FFDFFFF call editplus.004D67B0 ; GetText 取出用户名
- 004D6A61 83C4 10 add esp,0x10 ; EAX -> 用户名 XUEPOJIE
- 004D6A64 837C24 08 00 cmp dword ptr ss:[esp+0x8],0x0 ; 判断用户名长度是否为 0
- 004D6A69 8BD8 mov ebx,eax
- 004D6A6B 895C24 10 mov dword ptr ss:[esp+0x10],ebx ; 用户名压栈
- 004D6A6F 75 07 jnz short editplus.004D6A78 ; 用户名长度为 0则走向死亡
- 004D6A71 33C0 xor eax,eax
- 004D6A73 E9 CF000000 jmp editplus.004D6B47
- 004D6A78 57 push edi
- 004D6A79 8D4C24 0C lea ecx,dword ptr ss:[esp+0xC]
- 004D6A7D 51 push ecx
- 004D6A7E 6A 32 push 0x32
- 004D6A80 8D5424 20 lea edx,dword ptr ss:[esp+0x20]
- 004D6A84 52 push edx
- 004D6A85 8D45 74 lea eax,dword ptr ss:[ebp+0x74]
- 004D6A88 50 push eax
- 004D6A89 E8 22FDFFFF call editplus.004D67B0 ; GetText 取出假码
- 004D6A8E 8BF8 mov edi,eax ; edi -> 假码 0123456789
- 004D6A90 8B4424 1C mov eax,dword ptr ss:[esp+0x1C] ; eax = 假码长度
- 004D6A94 83C4 10 add esp,0x10
- 004D6A97 85C0 test eax,eax ; 判断假码长度是否为0
- 004D6A99 74 7E je short editplus.004D6B19
- 004D6A9B 56 push esi
- 004D6A9C 33F6 xor esi,esi
- 004D6A9E 85C0 test eax,eax
- 004D6AA0 7E 44 jle short editplus.004D6AE6
- 004D6AA2 0FB71C77 movzx ebx,word ptr ds:[edi+esi*2]
- 004D6AA6 B9 00010000 mov ecx,0x100
- 004D6AAB 66:3BD9 cmp bx,cx
- 004D6AAE 73 0D jnb short editplus.004D6ABD
- 004D6AB0 0FB6D3 movzx edx,bl
- 004D6AB3 0FB70455 30F75E00 movzx eax,word ptr ds:[edx*2+0x5EF730>
- 004D6ABB EB 1A jmp short editplus.004D6AD7
- 004D6ABD 0FB7C3 movzx eax,bx
- 004D6AC0 50 push eax
- 004D6AC1 FF15 5CD75700 call dword ptr ds:[<&USER32.CharUpper>; user32.CharUpperW
- 004D6AC7 0FB7C0 movzx eax,ax
- 004D6ACA 66:85C0 test ax,ax
- 004D6ACD 75 05 jnz short editplus.004D6AD4
- 004D6ACF 0FB7C3 movzx eax,bx
- 004D6AD2 EB 03 jmp short editplus.004D6AD7
- 004D6AD4 0FB7C0 movzx eax,ax
- 004D6AD7 66:890477 mov word ptr ds:[edi+esi*2],ax
- 004D6ADB 46 inc esi
- 004D6ADC 3B7424 10 cmp esi,dword ptr ss:[esp+0x10]
- 004D6AE0 ^ 7C C0 jl short editplus.004D6AA2
- 004D6AE2 8B5C24 18 mov ebx,dword ptr ss:[esp+0x18]
- 004D6AE6 57 push edi ; edi -> 假码
- 004D6AE7 53 push ebx ; ebx ->用户名
- 004D6AE8 E8 93F6FFFF call editplus.004D6180 ; 第一层算法-push 用户名 和 假码
- 004D6AED 83C4 08 add esp,0x8
- 004D6AF0 5E pop esi
- 004D6AF1 85C0 test eax,eax ; 下面没什么重要的,直接返回
- 004D6AF3 75 0C jnz short editplus.004D6B01
复制代码 //// Sub_004D6180
- 004D6180 81EC D00B0000 sub esp,0xBD0
- 004D6186 A1 7C9D5C00 mov eax,dword ptr ds:[0x5C9D7C]
- 004D618B 33C4 xor eax,esp
- 004D618D 898424 CC0B0000 mov dword ptr ss:[esp+0xBCC],eax
- 004D6194 53 push ebx
- 004D6195 55 push ebp
- 004D6196 8BAC24 DC0B0000 mov ebp,dword ptr ss:[esp+0xBDC]
- 004D619D 56 push esi
- 004D619E 8BB424 E40B0000 mov esi,dword ptr ss:[esp+0xBE4]
- 004D61A5 8BC5 mov eax,ebp
- 004D61A7 57 push edi
- 004D61A8 8D50 02 lea edx,dword ptr ds:[eax+0x2]
- 004D61AB EB 03 jmp short editplus.004D61B0
- 004D61AD 8D49 00 lea ecx,dword ptr ds:[ecx]
- 004D61B0 66:8B08 mov cx,word ptr ds:[eax]
- 004D61B3 83C0 02 add eax,0x2
- 004D61B6 66:85C9 test cx,cx
- 004D61B9 ^ 75 F5 jnz short editplus.004D61B0 ; 简单的计算用户名的长度
- 004D61BB 2BC2 sub eax,edx
- 004D61BD D1F8 sar eax,1
- 004D61BF 8BD8 mov ebx,eax
- 004D61C1 8BC6 mov eax,esi
- 004D61C3 8D50 02 lea edx,dword ptr ds:[eax+0x2]
- 004D61C6 66:8B08 mov cx,word ptr ds:[eax]
- 004D61C9 83C0 02 add eax,0x2
- 004D61CC 66:85C9 test cx,cx
- 004D61CF ^ 75 F5 jnz short editplus.004D61C6 ; 简单计算假码的长度
- 004D61D1 2BC2 sub eax,edx
- 004D61D3 D1F8 sar eax,1
- 004D61D5 8BF8 mov edi,eax
- 004D61D7 E8 94F2FFFF call editplus.004D5470
- 004D61DC 68 B80B0000 push 0xBB8
- 004D61E1 8D4424 28 lea eax,dword ptr ss:[esp+0x28]
- 004D61E5 50 push eax
- 004D61E6 53 push ebx
- 004D61E7 55 push ebp ; ebp -> 用户名
- 004D61E8 E8 23F3FFFF call editplus.004D5510 ; 将字符串转换为十六进制文本
- 004D61ED 50 push eax
- 004D61EE 8D4C24 38 lea ecx,dword ptr ss:[esp+0x38]
- 004D61F2 51 push ecx ; ecx ->用户名转化成的十六进制文本
- 004D61F3 6A 00 push 0x0
- 004D61F5 E8 D6F2FFFF call editplus.004D54D0 ; 全局通用算法
- 004D61FA 0FB7D0 movzx edx,ax ; eax = 计算后的值 是一个整数值
- 004D61FD 52 push edx
- 004D61FE 8D4424 30 lea eax,dword ptr ss:[esp+0x30]
- 004D6202 68 80FC5800 push editplus.0058FC80 ; UNICODE "%04X"
- 004D6207 50 push eax
- 004D6208 E8 D33AF3FF call editplus.00409CE0 ; 将计算后的值 转换为 ASCII 码
- 004D620D 66:8B4E 04 mov cx,word ptr ds:[esi+0x4] ; 假码的第三位 给CX
- 004D6211 8D46 04 lea eax,dword ptr ds:[esi+0x4]
- 004D6214 83C4 28 add esp,0x28
- 004D6217 66:3B4C24 10 cmp cx,word ptr ss:[esp+0x10] ; 假码的第三位和计算值字符串的第一位比较
- 004D621C 74 04 je short editplus.004D6222 ; 一定要相等,否则后面的算法没法研究
- 004D621E 33C0 xor eax,eax
- 004D6220 EB 5A jmp short editplus.004D627C
- 004D6222 66:8B56 06 mov dx,word ptr ds:[esi+0x6] ; 假码的第四位给DX
- 004D6226 66:3B5424 12 cmp dx,word ptr ss:[esp+0x12] ; 计算值字符串的第二位 和 假码的第三位比较
- 004D622B ^ 75 F1 jnz short editplus.004D621E ; 同样的要相等
- 004D622D 68 B80B0000 push 0xBB8
- 004D6232 8D4C24 28 lea ecx,dword ptr ss:[esp+0x28]
- 004D6236 51 push ecx
- 004D6237 83C7 FE add edi,-0x2
- 004D623A 57 push edi
- 004D623B 50 push eax ; 将假码指针移动两位 指向 "23456789"也就是取后几位
- 004D623C E8 CFF2FFFF call editplus.004D5510 ; 将假码后几位 转换为 十六进制文本
- 004D6241 50 push eax
- 004D6242 8D5424 38 lea edx,dword ptr ss:[esp+0x38]
- 004D6246 52 push edx
- 004D6247 6A 00 push 0x0
- 004D6249 E8 82F2FFFF call editplus.004D54D0 ; 假码后几位 十六进制文本进行计算 跟上面一样
- 004D624E 0FB7C0 movzx eax,ax
- 004D6251 50 push eax
- 004D6252 8D4C24 30 lea ecx,dword ptr ss:[esp+0x30]
- 004D6256 68 80FC5800 push editplus.0058FC80 ; UNICODE "%04X"
- 004D625B 51 push ecx
- 004D625C E8 7F3AF3FF call editplus.00409CE0 ; 将计算后的值 转换为字符串
- 004D6261 66:8B16 mov dx,word ptr ds:[esi]
- 004D6264 83C4 28 add esp,0x28
- 004D6267 33C0 xor eax,eax
- 004D6269 66:3B5424 10 cmp dx,word ptr ss:[esp+0x10] ; 假码第一位 和 计算字符第一位比较
- 004D626E 75 0C jnz short editplus.004D627C
- 004D6270 66:8B4E 02 mov cx,word ptr ds:[esi+0x2]
- 004D6274 66:3B4C24 12 cmp cx,word ptr ss:[esp+0x12] ; 假码的第二位 和 计算字符第二位比较
- 004D6279 0F94C0 sete al
- 004D627C 8B8C24 DC0B0000 mov ecx,dword ptr ss:[esp+0xBDC]
- 004D6283 5F pop edi
- 004D6284 5E pop esi
- 004D6285 5D pop ebp
- 004D6286 5B pop ebx
- 004D6287 33CC xor ecx,esp
- 004D6289 E8 487D0700 call editplus.0054DFD6
- 004D628E 81C4 D00B0000 add esp,0xBD0
- 004D6294 C3 retn
复制代码 //第一层算法总结
将用户名 "XUEPOJIE" 转换为 十六进制文本字符串 ASCII "0058005500450050004F004A00490045"
然后利用全局的通用算法CALL 进行计算得到一个 整数值,然后将 这个整数值转换为 字符串, 我们将它命名为 str , 随即 我们将 我们输入的假码命名为 key
要求 key 的 第三位要和 str的第一位要相等 , key的 第四位要和 str的第二位要相等.
又将假码 "0123456789" 去除前两位 "123456789" 将这个字符串转换为 十六进制文本字符串 然后利用全局通用算法CALL 计算得一个值 然后将这个值转换为字符串 , 我们将它 str2
要求 key 的 第一位 要和 str2的 第一位相等 , key的 第二位要和 str2 的 第二位相等 否则是看不到往后的算法。我们继续
//进入第二层算法
- 004D6B60 81EC 38020000 sub esp,0x238
- 004D6B66 A1 7C9D5C00 mov eax,dword ptr ds:[0x5C9D7C]
- 004D6B6B 33C4 xor eax,esp
- 004D6B6D 898424 34020000 mov dword ptr ss:[esp+0x234],eax
- 004D6B74 8B8424 3C020000 mov eax,dword ptr ss:[esp+0x23C]
- 004D6B7B 53 push ebx
- 004D6B7C 55 push ebp
- 004D6B7D 8BE9 mov ebp,ecx
- 004D6B7F 8D4C24 08 lea ecx,dword ptr ss:[esp+0x8]
- 004D6B83 51 push ecx
- 004D6B84 68 F4010000 push 0x1F4
- 004D6B89 8D5424 50 lea edx,dword ptr ss:[esp+0x50]
- 004D6B8D 894424 14 mov dword ptr ss:[esp+0x14],eax
- 004D6B91 52 push edx
- 004D6B92 8D85 C8000000 lea eax,dword ptr ss:[ebp+0xC8]
- 004D6B98 50 push eax
- 004D6B99 E8 52FDFFFF call editplus.004D68F0 ; 同样的取出用户名
- 004D6B9E 83C4 10 add esp,0x10
- 004D6BA1 837C24 08 00 cmp dword ptr ss:[esp+0x8],0x0 ; 比较用户名长度
- 004D6BA6 8BD8 mov ebx,eax
- 004D6BA8 895C24 10 mov dword ptr ss:[esp+0x10],ebx ; 用户名压入栈
- 004D6BAC 75 07 jnz short editplus.004D6BB5
- 004D6BAE 33C0 xor eax,eax
- 004D6BB0 E9 D6000000 jmp editplus.004D6C8B
- 004D6BB5 57 push edi
- 004D6BB6 8D4C24 0C lea ecx,dword ptr ss:[esp+0xC]
- 004D6BBA 51 push ecx
- 004D6BBB 6A 32 push 0x32
- 004D6BBD 8D5424 20 lea edx,dword ptr ss:[esp+0x20]
- 004D6BC1 52 push edx
- 004D6BC2 8D45 74 lea eax,dword ptr ss:[ebp+0x74]
- 004D6BC5 50 push eax
- 004D6BC6 E8 25FDFFFF call editplus.004D68F0 ; 取出假码
- 004D6BCB 8BF8 mov edi,eax
- 004D6BCD 8B4424 1C mov eax,dword ptr ss:[esp+0x1C]
- 004D6BD1 83C4 10 add esp,0x10
- 004D6BD4 85C0 test eax,eax ; 比较长度是否为 0
- 004D6BD6 0F84 81000000 je editplus.004D6C5D
- 004D6BDC 56 push esi
- 004D6BDD 33F6 xor esi,esi
- 004D6BDF 85C0 test eax,eax
- 004D6BE1 7E 47 jle short editplus.004D6C2A
- 004D6BE3 66:0FB60C3E movzx cx,byte ptr ds:[esi+edi]
- 004D6BE8 0FB7D9 movzx ebx,cx
- 004D6BEB BA 00010000 mov edx,0x100
- 004D6BF0 66:3BDA cmp bx,dx
- 004D6BF3 73 0D jnb short editplus.004D6C02
- 004D6BF5 0FB6C3 movzx eax,bl
- 004D6BF8 0FB70445 30F75E00 movzx eax,word ptr ds:[eax*2+0x5EF730>
- 004D6C00 EB 1A jmp short editplus.004D6C1C
- 004D6C02 0FB7CB movzx ecx,bx
- 004D6C05 51 push ecx
- 004D6C06 FF15 5CD75700 call dword ptr ds:[<&USER32.CharUpper>; user32.CharUpperW
- 004D6C0C 0FB7C0 movzx eax,ax
- 004D6C0F 66:85C0 test ax,ax
- 004D6C12 75 05 jnz short editplus.004D6C19
- 004D6C14 0FB7C3 movzx eax,bx
- 004D6C17 EB 03 jmp short editplus.004D6C1C
- 004D6C19 0FB7C0 movzx eax,ax
- 004D6C1C 88043E mov byte ptr ds:[esi+edi],al
- 004D6C1F 46 inc esi
- 004D6C20 3B7424 10 cmp esi,dword ptr ss:[esp+0x10]
- 004D6C24 ^ 7C BD jl short editplus.004D6BE3
- 004D6C26 8B5C24 18 mov ebx,dword ptr ss:[esp+0x18]
- 004D6C2A 57 push edi ; 压入 假码
- 004D6C2B 53 push ebx ; 压入用户名
- 004D6C2C E8 6FF6FFFF call editplus.004D62A0 ; 最后一个算法
- 004D6C31 83C4 08 add esp,0x8
- 004D6C34 5E pop esi
- 004D6C35 85C0 test eax,eax
- 004D6C37 75 0C jnz short editplus.004D6C45
复制代码 //Sub_004D62A0
- 004D62A0 83EC 10 sub esp,0x10
- 004D62A3 A1 7C9D5C00 mov eax,dword ptr ds:[0x5C9D7C]
- 004D62A8 33C4 xor eax,esp
- 004D62AA 894424 0C mov dword ptr ss:[esp+0xC],eax
- 004D62AE 53 push ebx
- 004D62AF 55 push ebp
- 004D62B0 8B6C24 1C mov ebp,dword ptr ss:[esp+0x1C]
- 004D62B4 56 push esi
- 004D62B5 8B7424 24 mov esi,dword ptr ss:[esp+0x24]
- 004D62B9 8BC5 mov eax,ebp
- 004D62BB 57 push edi
- 004D62BC 8D50 01 lea edx,dword ptr ds:[eax+0x1]
- 004D62BF 90 nop
- 004D62C0 8A08 mov cl,byte ptr ds:[eax]
- 004D62C2 40 inc eax
- 004D62C3 84C9 test cl,cl
- 004D62C5 ^ 75 F9 jnz short editplus.004D62C0 ; 简单计算用户名长度
- 004D62C7 2BC2 sub eax,edx
- 004D62C9 8BD8 mov ebx,eax
- 004D62CB 8BC6 mov eax,esi
- 004D62CD 8D50 01 lea edx,dword ptr ds:[eax+0x1]
- 004D62D0 8A08 mov cl,byte ptr ds:[eax]
- 004D62D2 40 inc eax
- 004D62D3 84C9 test cl,cl
- 004D62D5 ^ 75 F9 jnz short editplus.004D62D0 ; 简单计算假码长度
- 004D62D7 2BC2 sub eax,edx
- 004D62D9 8BF8 mov edi,eax
- 004D62DB E8 90F1FFFF call editplus.004D5470
- 004D62E0 53 push ebx
- 004D62E1 55 push ebp ; 压入用户名
- 004D62E2 6A 00 push 0x0
- 004D62E4 E8 E7F1FFFF call editplus.004D54D0 ; 利用全局通用算法对用户名进行计算
- 004D62E9 0FB7C0 movzx eax,ax ; 计算值给eax
- 004D62EC 50 push eax
- 004D62ED 8D4C24 20 lea ecx,dword ptr ss:[esp+0x20]
- 004D62F1 68 D8545900 push editplus.005954D8 ; ASCII "%02X"
- 004D62F6 51 push ecx
- 004D62F7 E8 54F4FFFF call editplus.004D5750 ; 将计算值 转换为字符串
- 004D62FC 0FB656 02 movzx edx,byte ptr ds:[esi+0x2] ; 假码的第三位
- 004D6300 0FBE4C24 28 movsx ecx,byte ptr ss:[esp+0x28] ; 计算值的第一位
- 004D6305 8D46 02 lea eax,dword ptr ds:[esi+0x2]
- 004D6308 83C4 18 add esp,0x18
- 004D630B 3BD1 cmp edx,ecx ; 假码的第三位 要和 计算值的第一位 相等 和 刚才第一层算法一样
- 004D630D 74 15 je short editplus.004D6324 ;
- 004D630F 5F pop edi
- 004D6310 5E pop esi
- 004D6311 5D pop ebp
- 004D6312 33C0 xor eax,eax
- 004D6314 5B pop ebx
- 004D6315 8B4C24 0C mov ecx,dword ptr ss:[esp+0xC]
- 004D6319 33CC xor ecx,esp
- 004D631B E8 B67C0700 call editplus.0054DFD6
- 004D6320 83C4 10 add esp,0x10
- 004D6323 C3 retn
- 004D6324 0FB656 03 movzx edx,byte ptr ds:[esi+0x3] ; 假码第四位
- 004D6328 0FBE4C24 11 movsx ecx,byte ptr ss:[esp+0x11] ; 计算值第二位
- 004D632D 3BD1 cmp edx,ecx
- 004D632F ^ 75 DE jnz short editplus.004D630F
- 004D6331 83C7 FE add edi,-0x2
- 004D6334 57 push edi
- 004D6335 50 push eax ; KEYLENG - 2 PUSH
- 004D6336 6A 00 push 0x0 ; 压入的也就是这个字符串"23456789"
- 004D6338 E8 93F1FFFF call editplus.004D54D0 ; 将假码指针 移动0x2 将指向后的字符串计算 上面这个
- 004D633D 0FB7D0 movzx edx,ax
- 004D6340 52 push edx
- 004D6341 8D4424 20 lea eax,dword ptr ss:[esp+0x20]
- 004D6345 68 D8545900 push editplus.005954D8 ; ASCII "%02X"
- 004D634A 50 push eax
- 004D634B E8 00F4FFFF call editplus.004D5750 ; 计算值转换为字符串
- 004D6350 0FB60E movzx ecx,byte ptr ds:[esi]
- 004D6353 0FBE5424 28 movsx edx,byte ptr ss:[esp+0x28]
- 004D6358 83C4 18 add esp,0x18
- 004D635B 3BCA cmp ecx,edx ; 假码的第一位 和 计算值 第一位 要相等
- 004D635D ^ 75 B0 jnz short editplus.004D630F
- 004D635F 0FB646 01 movzx eax,byte ptr ds:[esi+0x1]
- 004D6363 0FBE4C24 11 movsx ecx,byte ptr ss:[esp+0x11]
- 004D6368 33D2 xor edx,edx
- 004D636A 3BC1 cmp eax,ecx ; 假码第二位 和 计算值 第二位 要相等
- 004D636C 8B4C24 1C mov ecx,dword ptr ss:[esp+0x1C]
- 004D6370 5F pop edi
- 004D6371 0F94C2 sete dl
- 004D6374 5E pop esi
- 004D6375 5D pop ebp
- 004D6376 5B pop ebx
- 004D6377 33CC xor ecx,esp
- 004D6379 8BC2 mov eax,edx
- 004D637B E8 567C0700 call editplus.0054DFD6
- 004D6380 83C4 10 add esp,0x10
- 004D6383 C3 retn
复制代码 //细心看,可以看出第二层算法 与 第一层算法相比 有很多类似,思路大多相同,只是数据处理有些不一样.看下面分解
直接将用户名 "XUEPOJIE" 进行计算,然后转换为字符串 我们将它命名为 str3
要求 key第三位 要和 str3 相等, key第四位要和 str3 第二位相等
然后 去掉假码前两位 "23456789" 直接进行计算 然后转换为 字符串 我们将它命名为 str4
要求 key 第一位要和 str4第一位相等 , key 第二位 要和 str4 第二位相等
//深思
用户名直接影响 key去除前两位 后的字符串 也就是 "23456789" 也就是第三第四位 , 然而 这个 字符串 "23456789", 又影响着 前两位 .
所以 我们先 计算用户名 然后 更改 key的 第三第四位 然后 在计算 最后更改 第一第二位 得到一个 完整的 key 算法,请见注册机。
//全局计算算法CALL
- 004D54D0 8B4C24 08 mov ecx,dword ptr ss:[esp+0x8]
- 004D54D4 8B4424 0C mov eax,dword ptr ss:[esp+0xC]
- 004D54D8 8D1401 lea edx,dword ptr ds:[ecx+eax]
- 004D54DB 3BCA cmp ecx,edx
- 004D54DD 73 25 jnb short editplus.004D5504
- 004D54DF 8B4424 04 mov eax,dword ptr ss:[esp+0x4]
- 004D54E3 56 push esi
- 004D54E4 57 push edi
- 004D54E5 0FB639 movzx edi,byte ptr ds:[ecx]
- 004D54E8 0FB6F0 movzx esi,al
- 004D54EB 66:C1E8 08 shr ax,0x8
- 004D54EF 33F7 xor esi,edi
- <font color="#ff0000">004D54F1 66:330475 28075F00 xor ax,word ptr ds:[esi*2+0x5F0728]</font>
- 004D54F9 41 inc ecx
- 004D54FA 0FB7C0 movzx eax,ax
- 004D54FD 3BCA cmp ecx,edx
- 004D54FF ^ 72 E4 jb short editplus.004D54E5
- 004D5501 5F pop edi
- 004D5502 5E pop esi
- 004D5503 C3 retn
- 004D5504 66:8B4424 04 mov ax,word ptr ss:[esp+0x4]
- 004D5509 C3 retn
复制代码
//这个算法CALL没有什么实际意义 , 所以再次不做分析,不过有点值得注意,代码标红的 那句 ,里面引用到 一个 静态的 数组 在这个地址 了 0x5F0728 具体内容请看注册机
//最后注明
注册机编译环境 VS2015
//这是效果图
////这程序有BUG,更可能是暗桩
用户名 XUEPOJIE 注册码 1967456789 这个是注册机算出来的 因为他是重启验证 , 所以 他的注册码 放在文件 和 注册表 是加密后的 ,在启动的时候 发现 他解密后的注册码 和 我们输入的有区别。
导致注册失败,这个BUG 时不时会发生,我怀疑是暗装,再次不做讨论。下面给出注册机下载
Project1.rar
(887.48 KB, 下载次数: 24)
|