本帖最后由 LYQingYe 于 2015-8-27 21:58 编辑
我是LYQingYe,今天是算法分析的第二课,第一次课时,疏忽大意,写糟了,这次课会很详细的。希望大家能耐心的看下去,享受分析带来的困境与成就。 不要问我 雪坡姐 是谁。其实是 "学破解" 的同音词,我的输入法有问题。 最后在声明下,我爱雪坡姐。
软件名称: WinNc
编译器: PEID查不出,貌似 VC++ 无关紧要 无壳
WinNc 简体中文汉化版是一款极好的文件管理器,如同DOS时代的NC一样相当的好用,极似Total Commander,除了提供一般的重命名、查看、编辑、复制、删除、移动、新建等功能外,还提供了统计目录大小和压缩解压缩的功能!
软件下载地址 http://www./Soft/14586.html
愉快的开始吧!未注册版本打开就会弹出一个NAG窗口 要你BUY ,他的验证方式是 时时验证 :所谓时时验证就是 当你输入注册码 或者 用户名 或者更改 某个数值他都会触发 验证CALL 如果错误 他会有字符串提示 ,
验证CALL可以通过 右键->中文搜索引擎->搜索错误提示字符串 在这我就不解释了。很简单的。是个重启验证。
此次调试所用到的用户名 "WWW.XUEPOJIE.COM" 长度为 0x10 假码为"888888888" 长度为0x9
那就愉快的开始吧。
- 00D1043C /. 55 push ebp ; CLOCK_PROC
- 00D1043D |. 8BEC mov ebp,esp
- 00D1043F |. 33C9 xor ecx,ecx
- 00D10441 |. 51 push ecx
- 00D10442 |. 51 push ecx
- 00D10443 |. 51 push ecx
- 00D10444 |. 51 push ecx
- 00D10445 |. 51 push ecx
- 00D10446 |. 53 push ebx
- 00D10447 |. 8BD8 mov ebx,eax
- 00D10449 |. 33C0 xor eax,eax
- 00D1044B |. 55 push ebp
- 00D1044C |. 68 4206D100 push WinNc.00D10642
- 00D10451 |. 64:FF30 push dword ptr fs:[eax]
- 00D10454 |. 64:8920 mov dword ptr fs:[eax],esp
- 00D10457 |. 8D55 F0 lea edx,[local.4]
- 00D1045A |. 8B83 AC030000 mov eax,dword ptr ds:[ebx+0x3AC]
- 00D10460 |. E8 877D7AFF call WinNc.004B81EC ; GetText(Void) 系统操作,无需理。
- 00D10465 |. 8B45 F0 mov eax,[local.4] ; EAX -> 用户名 -> WWW.XUEPOJIE.COM -> 表示指针的意思
- 00D10468 |. 8D55 FC lea edx,[local.1] ; 一段空的内存空间地址 -> 给 edx
- 00D1046B |. E8 F84971FF call WinNc.00424E68 ; eax -> *P -> 用户名 二级指针
- 00D10470 |. 8D55 EC lea edx,[local.5] ; 一段空的内存空间地址 -> 给 edx
- 00D10473 |. 8B83 B4030000 mov eax,dword ptr ds:[ebx+0x3B4]
- 00D10479 |. E8 6E7D7AFF call WinNc.004B81EC
- 00D1047E |. 8B45 EC mov eax,[local.5] ; EAX -> key '888888888' 这段假注册码 长度 = 9
- 00D10481 |. 8D55 F8 lea edx,[local.2]
- 00D10484 |. E8 DF4971FF call WinNc.00424E68
- 00D10489 |. 8B45 FC mov eax,[local.1] ; eax -> 用户名 -> WWW.XUEPOJIE.COM
- 00D1048C |. 85C0 test eax,eax ; 判断用户名所在内存地址 是否为0
- 00D1048E |. 74 05 je short WinNc.00D10495
- 00D10490 |. 83E8 04 sub eax,0x4 ; 指向字符串指针 - 0x4 向左移动 4个字节
- 00D10493 |. 8B00 mov eax,dword ptr ds:[eax] ; 获得 移动后指针 指向的内容 4个字节 如果没错 应该是字符串长度
- 00D10495 |> 83F8 04 cmp eax,0x4 ; 就是用户名的长度 和 0x4 对比 如果用户名长度 小于4 则报错
- 00D10498 |. 7D 3C jge short WinNc.00D104D6 ; 这里必须跳走
- 00D1049A |. BA 5C06D100 mov edx,WinNc.00D1065C ; Please enter a valid registration name
- 00D1049F |. 8B83 D4030000 mov eax,dword ptr ds:[ebx+0x3D4]
- 00D104A5 |. E8 9E7D7AFF call WinNc.004B8248
- 00D104AA |. 8B8B EC030000 mov ecx,dword ptr ds:[ebx+0x3EC]
- 00D104B0 |. 33D2 xor edx,edx
- 00D104B2 |. 8B83 9C030000 mov eax,dword ptr ds:[ebx+0x39C]
- 00D104B8 |. E8 1F6687FF call WinNc.00586ADC
- 00D104BD |. 8B83 D8030000 mov eax,dword ptr ds:[ebx+0x3D8]
- 00D104C3 |. 8B80 B8010000 mov eax,dword ptr ds:[eax+0x1B8]
- 00D104C9 |. 8B93 EC030000 mov edx,dword ptr ds:[ebx+0x3EC]
- 00D104CF |. E8 BC0278FF call WinNc.00490790
- 00D104D4 |. EB 3A jmp short WinNc.00D10510
- 00D104D6 |> 33D2 xor edx,edx ; edx 清零
- 00D104D8 |. 8B83 D4030000 mov eax,dword ptr ds:[ebx+0x3D4]
- 00D104DE |. E8 657D7AFF call WinNc.004B8248
- 00D104E3 |. 8B8B EC030000 mov ecx,dword ptr ds:[ebx+0x3EC]
- 00D104E9 |. BA 02000000 mov edx,0x2
- 00D104EE |. 8B83 9C030000 mov eax,dword ptr ds:[ebx+0x39C]
- 00D104F4 |. E8 E36587FF call WinNc.00586ADC
- 00D104F9 |. 8B83 D8030000 mov eax,dword ptr ds:[ebx+0x3D8]
- 00D104FF |. 8B80 B8010000 mov eax,dword ptr ds:[eax+0x1B8]
- 00D10505 |. 8B93 EC030000 mov edx,dword ptr ds:[ebx+0x3EC]
- 00D1050B |. E8 800278FF call WinNc.00490790
- 00D10510 |> E8 D33FC4FF call WinNc.009544E8
- 00D10515 |. 8B4D F8 mov ecx,[local.2] ; ecx -> 假码
- 00D10518 |. 8B55 FC mov edx,[local.1] ; edx = 用户名
- 00D1051B |. E8 204CC4FF call WinNc.00955140 ; 关键CALL 洛 跟进去
- 00D10520 |. 84C0 test al,al
- 00D10522 |. 75 14 jnz short WinNc.00D10538
- 00D10524 |. E8 BF3FC4FF call WinNc.009544E8
- 00D10529 |. 8B4D F8 mov ecx,[local.2]
- 00D1052C |. 8B55 F4 mov edx,[local.3]
- 00D1052F |. E8 0C4CC4FF call WinNc.00955140
- 00D10534 |. 84C0 test al,al
- 00D10536 |. 74 72 je short WinNc.00D105AA ; 如果不跳 走向死亡 所以就要跳 顾名思义 上面就是 关键 CALL
- 00D10538 |> 33D2 xor edx,edx
- 00D1053A |. 8B83 D0030000 mov eax,dword ptr ds:[ebx+0x3D0]
- 00D10540 |. E8 037D7AFF call WinNc.004B8248
- 00D10545 |. B2 01 mov dl,0x1
- 00D10547 |. 8B83 A4030000 mov eax,dword ptr ds:[ebx+0x3A4]
- 00D1054D |. 8B08 mov ecx,dword ptr ds:[eax]
- 00D1054F |. FF91 80000000 call dword ptr ds:[ecx+0x80]
- 00D10555 |. 8B83 A4030000 mov eax,dword ptr ds:[ebx+0x3A4]
- 00D1055B |. E8 4C3893FF call WinNc.00643DAC
- 00D10560 |. 33D2 xor edx,edx
- 00D10562 |. 8B83 C4030000 mov eax,dword ptr ds:[ebx+0x3C4]
- 00D10568 |. 8B08 mov ecx,dword ptr ds:[eax]
- 00D1056A |. FF91 80000000 call dword ptr ds:[ecx+0x80]
- 00D10570 |. 8B83 C4030000 mov eax,dword ptr ds:[ebx+0x3C4]
- 00D10576 |. E8 313893FF call WinNc.00643DAC
- 00D1057B |. 8B8B EC030000 mov ecx,dword ptr ds:[ebx+0x3EC]
- 00D10581 |. BA 02000000 mov edx,0x2
- 00D10586 |. 8B83 9C030000 mov eax,dword ptr ds:[ebx+0x39C]
- 00D1058C |. E8 4B6587FF call WinNc.00586ADC
- 00D10591 |. 8B83 B0030000 mov eax,dword ptr ds:[ebx+0x3B0]
- 00D10597 |. 8B80 B8010000 mov eax,dword ptr ds:[eax+0x1B8]
- 00D1059D |. 8B93 EC030000 mov edx,dword ptr ds:[ebx+0x3EC]
- 00D105A3 |. E8 E80178FF call WinNc.00490790
- 00D105A8 |. EB 70 jmp short WinNc.00D1061A
- 00D105AA |> BA B806D100 mov edx,WinNc.00D106B8 ; Please enter a valid key
- 00D105AF |. 8B83 D0030000 mov eax,dword ptr ds:[ebx+0x3D0]
- 00D105B5 |. E8 8E7C7AFF call WinNc.004B8248
复制代码 算法一开始都是这样的先判断下KEY 或者 USERNAME的 长度。所以说没啥大惊小怪的了,我们继续 进入关键CALL
00955140 这段还是跟开始一样对数据的简单处理。核心的还在里面。
- 00955140 /[ DISCUZ_CODE_73 ]nbsp; 55 push ebp
- 00955141 |. 8BEC mov ebp,esp
- 00955143 |. 83C4 F4 add esp,-0xC
- 00955146 |. 53 push ebx
- 00955147 |. 56 push esi
- 00955148 |. 33DB xor ebx,ebx ; EDX 清零
- 0095514A |. 895D F4 mov [local.3],ebx ; 初始化变量
- 0095514D |. 894D F8 mov [local.2],ecx ; -> 假码 赋值给变量 '888888888'
- 00955150 |. 8955 FC mov [local.1],edx ; -> 用户名 赋值给变量 'WWW.XUEPOJIE.COM'
- 00955153 |. 8BF0 mov esi,eax
- 00955155 |. 8B45 FC mov eax,[local.1] ; EAX -> 用户名 'WWW.XUEPOJIE.COM'
- 00955158 |. E8 9B3CABFF call WinNc.00408DF8 ; 简单 判断用户名所在内存地址 是否合法
- 0095515D |. 8B45 F8 mov eax,[local.2] ; EAX -> 假码 '888888888'
- 00955160 |. E8 933CABFF call WinNc.00408DF8 ; 和上面那个CALL一样 判断 是否合法
- 00955165 |. 33C0 xor eax,eax ; EAX 清零
- 00955167 |. 55 push ebp
- 00955168 |. 68 BC519500 push WinNc.009551BC
- 0095516D |. 64:FF30 push dword ptr fs:[eax]
- 00955170 |. 64:8920 mov dword ptr fs:[eax],esp
- 00955173 |. 33DB xor ebx,ebx ; EBX 清零
- 00955175 |. 8B45 FC mov eax,[local.1] ; EAX -> 用户名 'WWW.XUEPOJIE.COM'
- 00955178 |. 85C0 test eax,eax
- 0095517A |. 74 05 je short WinNc.00955181 ; 地址是否合法
- 0095517C |. 83E8 04 sub eax,0x4 ; 用户名指针 前移 四个字节
- 0095517F |. 8B00 mov eax,dword ptr ds:[eax] ; 前四字节所指向的内容 就是他的长度 某编译器专用 哈哈
- 00955181 |> 85C0 test eax,eax ; 确定长度不为0
- 00955183 |. 74 1C je short WinNc.009551A1 ; 为0则跳
- 00955185 |. 8D4D F4 lea ecx,[local.3]
- 00955188 |. 8B55 FC mov edx,[local.1] ; EDX -> 用户名 'WWW.XUEPOJIE.COM'
- 0095518B |. 8BC6 mov eax,esi
- 0095518D |. E8 1AFEFFFF call WinNc.00954FAC ; 或许这就是关键了,因为 下面没啥东西了 我跟了
- 00955192 |. 8B45 F4 mov eax,[local.3]
- 00955195 |. 8B55 F8 mov edx,[local.2]
- 00955198 |. E8 5750ABFF call WinNc.0040A1F4
- 0095519D |. 75 02 jnz short WinNc.009551A1
- 0095519F |. B3 01 mov bl,0x1
- 009551A1 |> 33C0 xor eax,eax
- 009551A3 |. 5A pop edx
- 009551A4 |. 59 pop ecx
- 009551A5 |. 59 pop ecx
- 009551A6 |. 64:8910 mov dword ptr fs:[eax],edx
- 009551A9 |. 68 C3519500 push WinNc.009551C3
- 009551AE |> 8D45 F4 lea eax,[local.3]
- 009551B1 |. BA 03000000 mov edx,0x3
- 009551B6 |. E8 B93BABFF call WinNc.00408D74
- 009551BB \. C3 retn
复制代码
00954FAC 这一段会获取一个重要固定的字符串,具体往下看。
- 00954FAC /[ DISCUZ_CODE_74 ]nbsp; 55 push ebp
- 00954FAD |. 8BEC mov ebp,esp
- 00954FAF |. 51 push ecx
- 00954FB0 |. 53 push ebx
- 00954FB1 |. 56 push esi
- 00954FB2 |. 8BF1 mov esi,ecx
- 00954FB4 |. 8955 FC mov [local.1],edx ; 将用户名放入变量
- 00954FB7 |. 8BD8 mov ebx,eax
- 00954FB9 |. 8B45 FC mov eax,[local.1]
- 00954FBC |. E8 373EABFF call WinNc.00408DF8 ; EAX -> 用户名 'WWW.XUEPOJIE.COM'
- 00954FC1 |. 33C0 xor eax,eax ; 清零 EAX
- 00954FC3 |. 55 push ebp
- 00954FC4 |. 68 F34F9500 push WinNc.00954FF3
- 00954FC9 |. 64:FF30 push dword ptr fs:[eax]
- 00954FCC |. 64:8920 mov dword ptr fs:[eax],esp
- 00954FCF |. 56 push esi
- 00954FD0 |. 8D4B 60 lea ecx,dword ptr ds:[ebx+0x60] ; 在这里获得一个 固定的字符 '7' 因为上面用到了FS寄存器,SO 敢说他是固定的
- 00954FD3 |. 8B55 FC mov edx,[local.1] ; EDX -> 用户名 'WWW.XUEPOJIE.COM'
- 00954FD6 |. 8BC3 mov eax,ebx
- 00954FD8 |. E8 13FEFFFF call WinNc.00954DF0 ; 接下来的就是迎接死亡吧, 断断续续之间存在密切联系。来探索吧
- 00954FDD |. 33C0 xor eax,eax
- 00954FDF |. 5A pop edx
- 00954FE0 |. 59 pop ecx
- 00954FE1 |. 59 pop ecx
- 00954FE2 |. 64:8910 mov dword ptr fs:[eax],edx
- 00954FE5 |. 68 FA4F9500 push WinNc.00954FFA
- 00954FEA |> 8D45 FC lea eax,[local.1]
- 00954FED |. E8 223DABFF call WinNc.00408D14
- 00954FF2 \. C3 retn
复制代码 00954DF0 下面就是核心部分了,大家集中精神。我会详解 他的两层算法。
- 00954DF0 /[ DISCUZ_CODE_75 ]nbsp; 55 push ebp
- 00954DF1 |. 8BEC mov ebp,esp
- 00954DF3 |. 83C4 BC add esp,-0x44
- 00954DF6 |. 53 push ebx
- 00954DF7 |. 56 push esi
- 00954DF8 |. 57 push edi
- 00954DF9 |. 33DB xor ebx,ebx
- 00954DFB |. 895D BC mov [local.17],ebx
- 00954DFE |. 895D F8 mov [local.2],ebx
- 00954E01 |. 894D F4 mov [local.3],ecx ; 刚才获取的 字符 '7' 放入变量 local.3
- 00954E04 |. 8955 FC mov [local.1],edx ; 用户名 'WWW.XUEPOJIE.COM' 放入变量
- 00954E07 |. 8B45 FC mov eax,[local.1] ; EAX -> 用户名
- 00954E0A |. E8 E93FABFF call WinNc.00408DF8
- 00954E0F |. 33C0 xor eax,eax
- 00954E11 |. 55 push ebp
- 00954E12 |. 68 704F9500 push WinNc.00954F70
- 00954E17 |. 64:FF30 push dword ptr fs:[eax]
- 00954E1A |. 64:8920 mov dword ptr fs:[eax],esp
- 00954E1D |. 8B55 FC mov edx,[local.1] ; EDX - >用户名
- 00954E20 |. 8BC2 mov eax,edx
- 00954E22 |. 85C0 test eax,eax
- 00954E24 |. 74 05 je short WinNc.00954E2B
- 00954E26 |. 83E8 04 sub eax,0x4
- 00954E29 |. 8B00 mov eax,dword ptr ds:[eax]
- 00954E2B |> 83F8 03 cmp eax,0x3 ; 用户名 长度 和 0X3 比较
- 00954E2E |. 7F 12 jg short WinNc.00954E42 ; 已经要过去 否则 就 Invalid
- 00954E30 |. 8B45 08 mov eax,[arg.1]
- 00954E33 |. BA 8C4F9500 mov edx,WinNc.00954F8C ; Invalid
- 00954E38 |. E8 B742ABFF call WinNc.004090F4
- 00954E3D |. E9 0B010000 jmp WinNc.00954F4D
- 00954E42 |> C745 F0 03020>mov [local.4],0x203 ; 将一个常量 放入 变量 LOCAL.4 这里要注意
- 00954E49 |. 8BC2 mov eax,edx ; EAX - >用户名
- 00954E4B |. 85C0 test eax,eax
- 00954E4D |. 74 05 je short WinNc.00954E54
- 00954E4F |. 83E8 04 sub eax,0x4
- 00954E52 |. 8B00 mov eax,dword ptr ds:[eax] ; eax = 长度
- 00954E54 |> 8BF0 mov esi,eax ; 长度给ESI
- 00954E56 |. 85F6 test esi,esi ; 和上面 一样 确定 长度是否合法
- 00954E58 |. 7E 3F jle short WinNc.00954E99 ; 一级算法开始 :
复制代码 第一层算法开始
- 00954E5A |. BB 01000000 mov ebx,0x1 ; 初始化 ebx 循环
- 00954E5F |> 55 /push ebp
- 00954E60 |. 8B45 FC |mov eax,[local.1] ; eax ->用户名
- 00954E63 |. 4B |dec ebx ; ebx -1
- 00954E64 |. 85C0 |test eax,eax
- 00954E66 |. 74 05 |je short WinNc.00954E6D ; 测试 用户名 是否为 空
- 00954E68 |. 3B58 FC |cmp ebx,dword ptr ds:[eax-0x4] ; 判断 长度 是否为 0
- 00954E6B |. 72 05 |jb short WinNc.00954E72
- 00954E6D |> E8 561FABFF |call WinNc.00406DC8
- 00954E72 |> 43 |inc ebx ; ebx ++ 开始 循环 了
- 00954E73 |. 0FB74458 FE |movzx eax,word ptr ds:[eax+ebx*2-0x2>; 第一次循环-取用户名前两个字节 ASCII值给 EAX = 0057
- 00954E78 |. E8 2BFFFFFF |call WinNc.00954DA8 ; 这个CALL要 进去,肯定是计算的
复制代码
第一次循环,取的是用户名前两个字节 的ASCII值 0057 放到EAX ECX初始化为 0XA
第一步 用EAX/ECX = 57 / 0XA 商放在EAX 余数在 EDX 此时 EAX = 8 EDX = 7 同时 ESI = EDX+ESI = 7 + 0 = 7
第二步 又想上面那样,先回复下EAX原有的值,57 然后再计算,最后判断商是否为0 如果为0 跳出循环,显然第一次循环EAX不等于0
第二次循环 EAX = 8 ECX = 0XA EAX/ECX = 8 / 0XA EAX = 0 EDX = 8 ESI = EDX+ESI = 8 + 7 = 0XF 十六进制的 此时EAX = 0
跳出循环 ESI和0X9 比较 不满足 条件 EAX = ESI 继续重复我们上面的 运算 最后得出 ESI = 6 将ESI的值给EAX RETU 返回。别忘记外面还有一层循环,别着急。
我们返回到调用CALL的下一行代码我们继续 。
- 00954E7D |. 59 |pop ecx ; 0012F44C
- 00954E7E |. 0145 F0 |add [local.4],eax ; 还记得这个 LOCAL.4么 上面已经给了 一个常量值 0x203
- 00954E81 |. 71 05 |jno short WinNc.00954E88
- 00954E83 |. E8 481FABFF |call WinNc.00406DD0
- 00954E88 |> 43 |inc ebx
- 00954E89 |. 4E |dec esi
- 00954E8A |.^ 75 D3 \jnz short WinNc.00954E5F ; 注意 local .4 的值
复制代码
LOCAL.4 = LOCAL.4 + ESI 本身LOCAL.4的值是一个常量0X203 第一次循环取得是 用户名前两位字节 并运算 得到 一个数值 6 并且和 LOCAL.4的值 进行运算 同样的 道理将 用户名 所有 值运算 在 和 LOCAL.4的值运算 结果得到 一个数值 LOCAL.4 = 0X250 这个数值很有用。
下面进行第二层算法,就是要对 这个值 进行不一样的处理。 我们继续。
- 00954E8C |. /EB 0B jmp short WinNc.00954E99
- 00954E8E |> |8D45 FC /lea eax,[local.1]
- 00954E91 |. |8B55 FC |mov edx,[local.1]
- 00954E94 |. |E8 6B51ABFF |call WinNc.0040A004
- 00954E99 |> \8B45 FC mov eax,[local.1]
- 00954E9C |. E8 6B43ABFF |call WinNc.0040920C ; 得出 长度
- 00954EA1 |. 83F8 0C |cmp eax,0xC
- 00954EA4 |.^ 7C E8 \jl short WinNc.00954E8E
- 00954EA6 |. BB 01000000 mov ebx,0x1 ; 初始化 ebx
- 00954EAB |. 8B75 F4 mov esi,[local.3] ; esi = 字符 '7' 即住他ESI 指向他
- 00954EAE |. 8D7D C0 lea edi,[local.16] ; 估计 猫腻
- 00954EB1 |> 55 /push ebp
- 00954EB2 |. 8B45 FC |mov eax,[local.1]
- 00954EB5 |. 4B |dec ebx
- 00954EB6 |. 85C0 |test eax,eax
- 00954EB8 |. 74 05 |je short WinNc.00954EBF
- 00954EBA |. 3B58 FC |cmp ebx,dword ptr ds:[eax-0x4]
- 00954EBD |. 72 05 |jb short WinNc.00954EC4 ; 判断是否为 0 罢了
- 00954EBF |> E8 041FABFF |call WinNc.00406DC8
- 00954EC4 |> 43 |inc ebx ; 计数开始
- 00954EC5 |. 0FB74458 FE |movzx eax,word ptr ds:[eax+ebx*2-0x2>; 用户名前两字节ASCII 值给EAX 0057
- 00954ECA |. 0306 |add eax,dword ptr ds:[esi] EAX = EAX + 37 37就是 那个字符‘7’的ASCII 直
- 00954ECC |. 71 05 |jno short WinNc.00954ED3
- 00954ECE |. E8 FD1EABFF |call WinNc.00406DD0
- 00954ED3 |> 0345 F0 |add eax,[local.4] ; 说了注意 local 4 = EAX + LOCAL .4
- 00954ED6 |. 71 05 |jno short WinNc.00954EDD
- 00954ED8 |. E8 F31EABFF |call WinNc.00406DD0
- 00954EDD |> 99 |cdq
- 00954EDE |. 33C2 |xor eax,edx
- 00954EE0 |. 2BC2 |sub eax,edx
- 00954EE2 |. 71 05 |jno short WinNc.00954EE9 ; 判断是否为 0 罢了 另类
- 00954EE4 |. E8 E71EABFF |call WinNc.00406DD0
- 00954EE9 |> E8 BAFEFFFF |call WinNc.00954DA8 ; 是否 跟不跟 跟 感觉这个CALL太 熟悉 了 就是第一层算法用的CALL 下面解析
- 00954EEE |. 59 |pop ecx
- 00954EEF |. 8907 |mov dword ptr ds:[edi],eax
- 00954EF1 |. 43 |inc ebx
- 00954EF2 |. 83C7 04 |add edi,0x4
- 00954EF5 |. 83C6 04 |add esi,0x4
- 00954EF8 |. 83FB 0D |cmp ebx,0xD
- 00954EFB |.^ 75 B4 \jnz short WinNc.00954EB1
复制代码
居然是第一层算法用的CALL 不着急 此时 EAX = LOCAL .4 + EAX = 250 + 57 + 37 = 0X 2DE
第一次循环 EAX / ECX = 2DE / 0XA EAX = 49 EDX = 4 ESI = EDX + ESI = 4 EAX 不为0 继续循环
继续循环 EAX = 49 EAX / ECX = 49/ 0XA EAX = 7 EDX = 3 ESI = EDX + ESI = 7 EAX 不为0继续
EAX = 7 EAX / ECX = 7 / 0XA EAX = 0 EDX = 7 ESI = EDX + ESI = E EAX = 0 跳出循环
ESI 和 0X9 比较 不满足 再次 执行算法 最后得出 ESI= 5 EAX = ESI 返回CALL EAX = 5
用户名 前两个字节运算得出 一个数 = 5 同理 我们在继续 循环 看下 最后得出 一串 数字 572633475727
其实 这串数字 就是 注册码了 ,看下面的 - 就知道 他是要 组装了,我就不分析了。。
- 00954EFD |. 8D45 F8 lea eax,[local.2]
- 00954F00 |. E8 0F3EABFF call WinNc.00408D14
- 00954F05 |. BB 01000000 mov ebx,0x1
- 00954F0A |. 8D75 C0 lea esi,[local.16]
- 00954F0D |> 8D55 BC /lea edx,[local.17]
- 00954F10 |. 8B06 |mov eax,dword ptr ds:[esi]
- 00954F12 |. E8 2509ADFF |call WinNc.0042583C
- 00954F17 |. 8B55 BC |mov edx,[local.17]
- 00954F1A |. 8D45 F8 |lea eax,[local.2]
- 00954F1D |. E8 E250ABFF |call WinNc.0040A004
- 00954F22 |. 83FB 04 |cmp ebx,0x4
- 00954F25 |. 74 05 |je short WinNc.00954F2C
- 00954F27 |. 83FB 08 |cmp ebx,0x8
- 00954F2A |. 75 0D |jnz short WinNc.00954F39
- 00954F2C |> 8D45 F8 |lea eax,[local.2]
- 00954F2F |. BA A84F9500 |mov edx,WinNc.00954FA8 ; -
- 00954F34 |. E8 CB50ABFF |call WinNc.0040A004
- 00954F39 |> 43 |inc ebx
- 00954F3A |. 83C6 04 |add esi,0x4
- 00954F3D |. 83FB 0D |cmp ebx,0xD
- 00954F40 |.^ 75 CB \jnz short WinNc.00954F0D
- 00954F42 |. 8B45 08 mov eax,[arg.1]
- 00954F45 |. 8B55 F8 mov edx,[local.2]
- 00954F48 |. E8 A741ABFF call WinNc.004090F4
- 00954F4D |> 33C0 xor eax,eax
- 00954F4F |. 5A pop edx
- 00954F50 |. 59 pop ecx
- 00954F51 |. 59 pop ecx
- 00954F52 |. 64:8910 mov dword ptr fs:[eax],edx
- 00954F55 |. 68 774F9500 push WinNc.00954F77
- 00954F5A |> 8D45 BC lea eax,[local.17]
- 00954F5D |. E8 B23DABFF call WinNc.00408D14
- 00954F62 |. 8D45 F8 lea eax,[local.2]
- 00954F65 |. BA 02000000 mov edx,0x2
- 00954F6A |. E8 053EABFF call WinNc.00408D74
- 00954F6F \. C3 retn
复制代码
组装后的注册码是这样的 5726-3347-5727 我们输入测试下 。
本次算法教程到此结束。 感谢大家支持。我是 LYQingYe 我爱雪坡姐 。
|