欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

某软件算法分析

程序员文章站 2022-05-09 20:37:09
【文章标题】: 某软件算法分析 【作者邮箱】: qs#2cto.com 【软件名称】: 《十万个为什么》 【下载地址】: 自己搜索下载 【加壳方式】: aspack 【保护方式】:...
【文章标题】: 某软件算法分析

【作者邮箱】: 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