某软件算法分析
【作者邮箱】: qs#2cto.com
【软件名称】: 《十万个为什么》
【下载地址】: 自己搜索下载
【加壳方式】: aspack
【保护方式】: 本地验证
【使用工具】: OllyDBG
【操作平台】: Window xp
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
脱壳我就不写了,aspack脱壳很简单。
--------------------------------------------
0047EA88 . 55 push ebp ; 按钮事件开始
0047EA89 . 8BEC mov ebp,esp
0047EA8B . B9 08000000 mov ecx,0x8
0047EA90 > 6A 00 push 0x0
0047EA92 . 6A 00 push 0x0
0047EA94 . 49 dec ecx
0047EA95 .^ 75 F9 jnz Xdumped_.0047EA90
0047EAC3 . E8 E4A3F8FF call dumped_.00408EAC
0047EAC8 . 837D F4 00 cmp dword ptr ss:[ebp-0xC],0x0
0047EACC . 75 19 jnz Xdumped_.0047EAE7
0047EACE . BA 84ED4700 mov edx,dumped_.0047ED84 ; 提示
0047EAD3 . B8 8CED4700 mov eax,dumped_.0047ED8C ; 姓名不能为空!
0047EAD8 . B9 30000000 mov ecx,0x30
0047EADD . E8 E256FFFF call dumped_.004741C4
0047EB02 . E8 A5A3F8FF call dumped_.00408EAC
0047EB07 . 8B45 E8 mov eax,dword ptr ss:[ebp-0x18] ; 取假码“12345678”放入EAX
0047EB0A . B9 0C000000 mov ecx,0xC ; ECX放入“0xC” 即注册码标准长度为12位
0047EB0F . BA 01000000 mov edx,0x1
0047EB3D . 8B45 D8 mov eax,dword ptr ss:[ebp-0x28] ; 读取用户名
0047EB40 . 8D4D DC lea ecx,dword ptr ss:[ebp-0x24]
0047EB43 . BA A8ED4700 mov edx,dumped_.0047EDA8 ; 读取字串“十万个为什么”
0047EB48 . E8 3F57FFFF call dumped_.0047428C ; 算法CALL
进算法CALL看一下
0047428C /$ 55 push ebp ; 算法CALL开始
0047428D |. 8BEC mov ebp,esp
0047428F |. 6A 00 push 0x0
00474291 |. 6A 00 push 0x0
00474293 |. 6A 00 push 0x0
004742BB |. E8 EC4BF9FF call dumped_.00408EAC ; 用户名是否存在
004742C0 |. 837D F0 00 cmp [local.4],0x0
004742C4 |. 75 0F jnz Xdumped_.004742D5
004742C6 |. B8 28444700 mov eax,dumped_.00474428 ; Input String Can't be Empty!
004742CB |. E8 38B1FDFF call dumped_.0044F408
004742D8 |. 50 push eax
004742D9 |. B9 06000000 mov ecx,0x6 ; 取用户名长度6位
004742DE |. BA 01000000 mov edx,0x1
0047433C |. 8B55 E8 mov edx,[local.6] ; 取用户名
0047433F |. 8D45 F4 lea eax,[local.3]
00474342 |. 8B4D F4 mov ecx,[local.3] ; 取“十万个为什么”的前三个字节
00474345 |. E8 C2FBF8FF call dumped_.00403F0C
0047434A |. 8D55 FC lea edx,[local.1]
0047434D |. B8 0C000000 mov eax,0xC ; 增加到12位
00474352 |. E8 F5FEFFFF call dumped_.0047424C
00474357 |. BB 01000000 mov ebx,0x1
0047435C |> 8D45 FC /lea eax,[local.1]
0047435F |. E8 2CFDF8FF |call dumped_.00404090
00474364 |. 8BF3 |mov esi,ebx ; 用字串空格填充
00474366 |. 03F6 |add esi,esi
00474368 |. 8B55 F8 |mov edx,[local.2]
0047436B |. 8A541A FF |mov dl,byte ptr ds:[edx+ebx-0x1]
0047436F |. 885430 FE |mov byte ptr ds:[eax+esi-0x2],dl
00474373 |. 8D45 FC |lea eax,[local.1]
00474376 |. E8 15FDF8FF |call dumped_.00404090
0047437B |. 8B55 F4 |mov edx,[local.3]
0047437E |. 8A541A FF |mov dl,byte ptr ds:[edx+ebx-0x1]
00474382 |. 885430 FF |mov byte ptr ds:[eax+esi-0x1],dl
00474386 |. 43 |inc ebx
00474387 |. 83FB 07 |cmp ebx,0x7 ; 对用户名长度进行处理,不足6位补空格 多余6位减少
0047438A |.^ 75 D0 \jnz Xdumped_.0047435C ; 该段计算就是把用户名和“十万个”字符,进行错位连接处理
计算后为 43 CA 72 AE 61 CD 63 F2 6B B8 5F F6
Crack_ 43 72 61 63 6B 5F
“十万个” CA AE CD F2 B8 F6
004743A9 |> /8B45 FC /mov eax,[local.1]
004743AC |. |8A4418 FF |mov al,byte ptr ds:[eax+ebx-0x1] ; 取第一个字符“C”值为43
004743B0 |. |34 BB |xor al,0xBB ; 和0xBB异或
004743B2 |. |25 FF000000 |and eax,0xFF ; 再和FF运算
004743B7 |. |8D55 E4 |lea edx,[local.7]
004743BA |. |E8 6D4CF9FF |call dumped_.0040902C ; 运算??xor187and255
004743BF |. |8B45 E4 |mov eax,[local.7] ; 得到结果248 之后取结果第一位
004743C2 |. |FF30 |push dword ptr ds:[eax] ; 以此类推
004743C4 |. |8BC7 |mov eax,edi
004743C6 |. |E8 C5FCF8FF |call dumped_.00404090
004743CB |. |5A |pop edx
004743CC |. |885418 FF |mov byte ptr ds:[eax+ebx-0x1],dl
004743D0 |. |43 |inc ebx
004743D1 |. |4E |dec esi
004743D2 |.^\75 D5 \jnz Xdumped_.004743A9
004743D4 |> E8 6FE6F8FF call dumped_.00402A48 ; 得到真注册码
EAX 00C46D3C ASCII "212221272327"
----------------------------------------------------------------------------------------------------------
算法过程记录:
1.用户名限制为6位,多舍少补。
2.导入一个字串“十万个”
3.之后进行错位排列用户名与字串(如:121212)
4.值转换十进制进行计算(??xor187and255),结果取第一位,全部处理完后,第一位取的值即为真注册码。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于Crack_Qs@红黑联盟专家堂, 转载请注明作者并保持文章的完整, 谢谢!
2012年11月30日 12:52:47