首页
社区
课程
招聘
[原创]EsperCrackMe1的不完全破解
发表于: 2007-6-19 15:14 11805

[原创]EsperCrackMe1的不完全破解

2007-6-19 15:14
11805

【文章标题】: EsperCrackMe1的不完全破解
【文章作者】: scndebuger
【作者邮箱】: seya1@163.com
【软件名称】: EsperCrackMe1
【下载地址】: http://bbs1.pediy.com/showthread.php?t=46216
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  
      od加载:停在入口  
  00402860 >/$  FF15 00044000 call    dword ptr [<&COMCTL32.#17>]      ; [(initial cpu selection)
  00402866  |.  6A 00         push    0                                ; /lParam = NULL
  00402868  |.  68 F0234000   push    004023F0                         ; |DlgProc = EsperCra.004023F0
  0040286D  |.  6A 00         push    0                                ; |hOwner = NULL
  0040286F  |.  6A 65         push    65                               ; |pTemplate = 65
  00402871  |.  6A 00         push    0                                ; |hInst = NULL
  00402873  |.  FF15 74044000 call    dword ptr [<&USER32.DialogBoxPar>; \DialogBoxParamA
  00402879  |.  6A 00         push    0                                ; /ExitCode = 0
  0040287B  |.  FF15 70044000 call    dword ptr [<&USER32.PostQuitMess>; \PostQuitMessage
  00402881  |.  33C0          xor     eax, eax
  00402883  \.  C3            retn
  
      60秒后自动关闭,所以首先把时间限制搞掉:
      超级字串搜索
  Address    Disassembly                               Text String
  004023F5   push    00402990                          感)@
  00402783   mov     esi, 004004E4                     g-r-e-a-t j-o-b!!!!\nu are so pppppowerful!!!!
  004027F4   push    004004A8                          you have %d seconds to enter your name and serial...
  00402860   call    dword ptr [<&COMCTL32.#17>]       (initial cpu selection)
  
      在“you have %d seconds to enter your name and serial...”这一行上双击来到004027F4:
  
  004027EA   > \A1 002E4000   mov     eax, dword ptr [402E00]          ;  Case 113 (WM_TIMER) of switch 0040240E
  004027EF   .  85C0          test    eax, eax
  004027F1   .  74 40         je      short 00402833
  004027F3   .  50            push    eax                              ; /<%d> => 3C (60.)
  004027F4   .  68 A8044000   push    004004A8                         ; |you have %d seconds to enter your name and serial...
  004027F9   .  68 E8354000   push    004035E8                         ; |you have 44 seconds to enter your name and serial...
  004027FE   .  FF15 4C044000 call    dword ptr [<&USER32.wsprintfA>]  ; \wsprintfA
  00402804   .  8B45 08       mov     eax, dword ptr [ebp+8]
  00402807   .  83C4 0C       add     esp, 0C
  0040280A   .  68 E8354000   push    004035E8                         ; /you have 44 seconds to enter your name and serial...
  0040280F   .  6A 66         push    66                               ; |ControlID = 66 (102.)
  00402811   .  50            push    eax                              ; |hWnd
  00402812   .  FF15 50044000 call    dword ptr [<&USER32.SetDlgItemTe>; \SetDlgItemTextA
  00402818   .  FF0D 002E4000 dec     dword ptr [402E00]
  0040281E   >  33C0          xor     eax, eax
  00402820   .  8B4D F4       mov     ecx, dword ptr [ebp-C]
  00402823   .  64:890D 00000>mov     dword ptr fs:[0], ecx
  0040282A   .  5F            pop     edi
  0040282B   .  5E            pop     esi
  0040282C   .  5B            pop     ebx
  0040282D   .  8BE5          mov     esp, ebp
  0040282F   .  5D            pop     ebp
  00402830   .  C2 1000       retn    10
  
      往上看:
  004027EA   > \A1 002E4000   mov     eax, dword ptr [402E00]
      这一句就是取当前还剩余的时间,改掉:
   mov     eax, 64                  
      哈哈,这样就永远都有100秒可以用了,你还可以改成好几亿:)
      保存新可执行文件  EsperCrackMe1_New.exe,这样我们以后分析就很方便了。
      好了,现在开始进入正题:
      首先分析一下这个CM的界面:没有CHECK按钮,就是说,每次输入都要检查,直到你输入正确了就可以提示你:g-r-e-a-t j-o-b!!!!\nu are so pppppowerful!!!!,那么怎么下断呢?
      我就GetDlgItemTextA好了,在查找-当前模块的标签里找到这个(确认他用的是这个函数),然后下断bp GetDlgItemTextA;f9运行,断下后禁止断点,点图表M在代码段400400下断,f9运行,然后断下后就来到了:
  00402525    FF15 54044000   call    dword ptr [<&USER32.GetDlgItemTe>; USER32.GetDlgItemTextA这里
      现在开始跟踪分析:
  004024FA   \8B45 10         mov     eax, dword ptr [ebp+10]          ; Case 111 (WM_COMMAND) of switch 0040240E
  004024FD    66:3D E803      cmp     ax, 3E8
  00402501    0F85 DA000000   jnz     004025E1
  00402507    C1E8 10         shr     eax, 10
  0040250A    3D 00030000     cmp     eax, 300
  0040250F    0F85 09030000   jnz     0040281E
  00402515    8B45 08         mov     eax, dword ptr [ebp+8]
  00402518    6A 40           push    40
  0040251A    68 98354000     push    00403598
  0040251F    68 E8030000     push    3E8
  00402524    50              push    eax
  00402525    FF15 54044000   call    dword ptr [<&USER32.GetDlgItemTe>; USER32.GetDlgItemTextA
  0040252B    B8 98354000     mov     eax, 00403598                    ; 用户名
  00402530    8D50 01         lea     edx, dword ptr [eax+1]
  00402533    8A08            mov     cl, byte ptr [eax]
  00402535    40              inc     eax
  00402536    84C9            test    cl, cl
  00402538  ^ 75 F9           jnz     short 00402533
  0040253A    2BC2            sub     eax, edx                         ; 计算名字长度
  0040253C    83F8 02         cmp     eax, 2                           ; 名字长度必须不少于2位
  0040253F    0F82 D9020000   jb      0040281E
  00402545    A1 68364000     mov     eax, dword ptr [403668]
  0040254A    85C0            test    eax, eax
  0040254C    0F85 CC020000   jnz     0040281E
  00402552    B8 28364000     mov     eax, 00403628
  00402557    8D50 01         lea     edx, dword ptr [eax+1]
  0040255A    8D9B 00000000   lea     ebx, dword ptr [ebx]
  00402560    8A08            mov     cl, byte ptr [eax]
  00402562    40              inc     eax
  00402563    84C9            test    cl, cl
  00402565  ^ 75 F9           jnz     short 00402560
  00402567    2BC2            sub     eax, edx                         ; 计算注册码长度
  00402569    83F8 10         cmp     eax, 10                          ; 序列号长度必须不少于16位
  0040256C    0F82 AC020000   jb      0040281E
  00402572    C705 68364000 0>mov     dword ptr [403668], 4
  0040257C    33DB            xor     ebx, ebx
  0040257E    BE 88354000     mov     esi, 00403588
  00402583    6A 48           push    48
  00402585    E8 EE030000     call    <jmp.&MSVCR71.operator new>      ; 分配空间
  0040258A    8B4D 08         mov     ecx, dword ptr [ebp+8]
  0040258D    8908            mov     dword ptr [eax], ecx
  0040258F    B9 98354000     mov     ecx, 00403598
  00402594    8BD0            mov     edx, eax
  00402596    83C4 04         add     esp, 4
  00402599    2BD1            sub     edx, ecx                         ; 名字所在地址-新空间地址
  0040259B    8D7A 04         lea     edi, dword ptr [edx+4]
  0040259E    8BFF            mov     edi, edi
  004025A0    8A11            mov     dl, byte ptr [ecx]               ; 取名字
  004025A2    88140F          mov     byte ptr [edi+ecx], dl           ; 放到新空间
  004025A5    41              inc     ecx                              ; 这个应该是为下面要创建的线程准备要传递的参数
  004025A6    84D2            test    dl, dl
  004025A8  ^ 75 F6           jnz     short 004025A0
  004025AA    56              push    esi
  004025AB    6A 00           push    0
  004025AD    50              push    eax
  004025AE    68 A0224000     push    004022A0
  004025B3    6A 00           push    0
  004025B5    6A 00           push    0
  004025B7    8958 44         mov     dword ptr [eax+44], ebx          ; 注意 4022A0 这个函数是处理用户名的关键
  004025BA    FF15 10044000   call    dword ptr [<&KERNEL32.CreateThre>; kernel32.CreateThread
  004025C0    83C6 04         add     esi, 4
  004025C3    43              inc     ebx
  004025C4    81FE 98354000   cmp     esi, 00403598
  004025CA  ^ 7C B7           jl      short 00402583                   ; 弄出4个新线程来,哎,头痛
  004025CC    33C0            xor     eax, eax
  004025CE    8B4D F4         mov     ecx, dword ptr [ebp-C]
  004025D1    64:890D 0000000>mov     dword ptr fs:[0], ecx
  004025D8    5F              pop     edi
  004025D9    5E              pop     esi
  004025DA    5B              pop     ebx
  004025DB    8BE5            mov     esp, ebp
  004025DD    5D              pop     ebp
  004025DE    C2 1000         retn    10
  004025E1    66:3D E903      cmp     ax, 3E9
  004025E5    75 23           jnz     short 0040260A
  004025E7    C1E8 10         shr     eax, 10
  004025EA    3D 00030000     cmp     eax, 300
  004025EF    0F85 29020000   jnz     0040281E
  004025F5    8B55 08         mov     edx, dword ptr [ebp+8]
  004025F8    6A 40           push    40
  004025FA    68 28364000     push    00403628
  004025FF    68 E9030000     push    3E9
  00402604    52              push    edx
  00402605  ^ E9 1BFFFFFF     jmp     00402525                         ; 上去取注册码去
  0040260A    66:3D 0200      cmp     ax, 2
  0040260E    0F85 0A020000   jnz     0040281E
  00402614    8B45 08         mov     eax, dword ptr [ebp+8]
  00402617    6A 02           push    2
  00402619    50              push    eax
  0040261A    E9 1D020000     jmp     0040283C
  0040261F    3D 13010000     cmp     eax, 113
  00402624    0F84 C0010000   je      004027EA
  0040262A    0FB70D 98354000 movzx   ecx, word ptr [403598]           ; Default case of switch 0040240E
  00402631    81C1 00140000   add     ecx, 1400
  00402637    3BC1            cmp     eax, ecx
  00402639    0F85 DF010000   jnz     0040281E
  0040263F    8B7D 14         mov     edi, dword ptr [ebp+14]
  00402642    0FB7D7          movzx   edx, di
  00402645    8955 0C         mov     dword ptr [ebp+C], edx
  00402648    A1 68364000     mov     eax, dword ptr [403668]
  0040264D    DB45 0C         fild    dword ptr [ebp+C]                ; 装入用户名生成的4组数据
  00402650    8B5D 10         mov     ebx, dword ptr [ebp+10]
  00402653    33F6            xor     esi, esi
  00402655    3BC6            cmp     eax, esi
  00402657    D95D 0C         fstp    dword ptr [ebp+C]
  0040265A    8975 FC         mov     dword ptr [ebp-4], esi
  0040265D    D945 0C         fld     dword ptr [ebp+C]
  00402660    D835 30054000   fdiv    dword ptr [400530]               ; /65535
  00402666    D835 2C054000   fdiv    dword ptr [40052C]               ; /2
  0040266C    D805 28054000   fadd    dword ptr [400528]               ; +0.5
  00402672    D91C9D D8354000 fstp    dword ptr [ebx*4+4035D8]         ; y(i);依次放入4035d8开始的空间里
  00402679    0F85 9F010000   jnz     0040281E
  0040267F    B8 28364000     mov     eax, 00403628                    ; 注册码指针
  00402684    8D50 01         lea     edx, dword ptr [eax+1]
  00402687    8A08            mov     cl, byte ptr [eax]
  00402689    40              inc     eax
  0040268A    84C9            test    cl, cl
  0040268C  ^ 75 F9           jnz     short 00402687                   ; 小小循环,计算注册码长度
  0040268E    2BC2            sub     eax, edx
  00402690    83F8 10         cmp     eax, 10                          ; 是16位么?
  00402693    0F82 85010000   jb      0040281E                         ; 不是他就闪了
  00402699    A1 20054000     mov     eax, dword ptr [400520]          ; 66667830
  0040269E    66:8B0D 2405400>mov     cx, word ptr [400524]            ; 6666
  004026A5    8A15 26054000   mov     dl, byte ptr [400526]            ; 00
  004026AB    8945 E8         mov     dword ptr [ebp-18], eax
  004026AE    66:894D EC      mov     word ptr [ebp-14], cx
  004026B2    8855 EE         mov     byte ptr [ebp-12], dl
  004026B5    83FE 04         cmp     esi, 4                           ; 4次;现在是0
  004026B8    7D 62           jge     short 0040271C                   ; 4次后去下一步骤
  004026BA    8A0CB5 29364000 mov     cl, byte ptr [esi*4+403629]      ; 取注册码第si*4+2位
  004026C1    8A14B5 2A364000 mov     dl, byte ptr [esi*4+40362A]      ; 取注册码第si*4+3位
  004026C8    8A04B5 28364000 mov     al, byte ptr [esi*4+403628]      ; 取注册码第si*4+1位
  004026CF    884D EB         mov     byte ptr [ebp-15], cl
  004026D2    6A 10           push    10
  004026D4    8D4D 0C         lea     ecx, dword ptr [ebp+C]
  004026D7    8855 EC         mov     byte ptr [ebp-14], dl
  004026DA    8845 EA         mov     byte ptr [ebp-16], al
  004026DD    8A04B5 2B364000 mov     al, byte ptr [esi*4+40362B]      ; 取注册码第si*4+4位
  004026E4    51              push    ecx
  004026E5    8D55 E8         lea     edx, dword ptr [ebp-18]
  004026E8    52              push    edx
  004026E9    8845 ED         mov     byte ptr [ebp-13], al            ; 12fc4e-51/1-4
  004026EC    E8 81020000     call    <jmp.&MSVCR71.strtol>            ; 组合注册码si*4+1到si*4+4位为x(i);16进制数
  004026F1    8945 10         mov     dword ptr [ebp+10], eax
  004026F4    DB45 10         fild    dword ptr [ebp+10]               ; 装入x(i),
  004026F7    83C4 0C         add     esp, 0C                          ; 以下在浮点运算中,为方便,数值用10进制表示,下同
  004026FA    46              inc     esi
  004026FB    D95D 10         fstp    dword ptr [ebp+10]
  004026FE    D945 10         fld     dword ptr [ebp+10]
  00402701    D835 30054000   fdiv    dword ptr [400530]               ; /65536
  00402707    D835 2C054000   fdiv    dword ptr [40052C]               ; /2
  0040270D    DC05 18054000   fadd    qword ptr [400518]               ; +0.5
  00402713    D91CB5 5C354000 fstp    dword ptr [esi*4+40355C]         ; q(i)=o(i)/65536/2+0.5;保存在403560开始的4*4
  0040271A  ^ EB 99           jmp     short 004026B5
  0040271C    33F6            xor     esi, esi                         ; 开始关键运算了;esi=0
  0040271E    8BFF            mov     edi, edi
  00402720    83FE 04         cmp     esi, 4                           ; 4次
  00402723    0F8D 8B000000   jge     004027B4                         ; 都通过就通向幸福
  00402729    D904B5 D8354000 fld     dword ptr [esi*4+4035D8]         ; 装入y(i)
  00402730    51              push    ecx
  00402731    D80CB5 60354000 fmul    dword ptr [esi*4+403560]         ; z(i)=y(i)*q(i)
  00402738    D91C24          fstp    dword ptr [esp]                  ; 保存z(i)
  0040273B    E8 50010000     call    00402890                         ; 关键,必须去看看
  00402740    D95D 10         fstp    dword ptr [ebp+10]               ; s(i)
  00402743    83C4 04         add     esp, 4
  00402746    D945 10         fld     dword ptr [ebp+10]
  00402749    83EC 08         sub     esp, 8
  0040274C    D824B5 60354000 fsub    dword ptr [esi*4+403560]         ; s(i)-q(i)
  00402753    D95D 10         fstp    dword ptr [ebp+10]
  00402756    D945 10         fld     dword ptr [ebp+10]
  00402759    DD1C24          fstp    qword ptr [esp]
  0040275C    E8 F5010000     call    <jmp.&MSVCR71.fabs>              ; 取绝对值
  00402761    D95D 10         fstp    dword ptr [ebp+10]
  00402764    83C4 08         add     esp, 8
  00402767    D945 10         fld     dword ptr [ebp+10]
  0040276A    D81D 14054000   fcomp   dword ptr [400514]               ; 和1.5258e-5比较;0.00001525879
  00402770    DFE0            fstsw   ax                               ; 标志位出栈
  00402772    F6C4 01         test    ah, 1                            ; 看看刚才比较的结果
  00402775    0F84 A3000000   je      0040281E                         ; 跳了就完
  0040277B    46              inc     esi
  0040277C  ^ EB A2           jmp     short 00402720                   ; 下一次
  0040277E    B9 0B000000     mov     ecx, 0B
  00402783    BE E4044000     mov     esi, 004004E4                    ; g-r-e-a-t j-o-b!!!!\nu are so pppppowerful!!!!
  00402788    BF E8354000     mov     edi, 004035E8                    ; you have 100 seconds to enter your name and serial...
  0040278D    F3:A5           rep     movs dword ptr es:[edi], dword p>
  0040278F    68 E8354000     push    004035E8                         ; you have 100 seconds to enter your name and serial...
  00402794    66:A5           movs    word ptr es:[edi], word ptr [esi>
  00402796    8B75 08         mov     esi, dword ptr [ebp+8]
  00402799    6A 66           push    66
  0040279B    56              push    esi
  0040279C    FF15 50044000   call    dword ptr [<&USER32.SetDlgItemTe>; USER32.SetDlgItemTextA
  004027A2    68 EA030000     push    3EA
  004027A7    56              push    esi
  004027A8    FF15 58044000   call    dword ptr [<&USER32.KillTimer>]  ; USER32.KillTimer
  004027AE    B8 1E284000     mov     eax, 0040281E
  004027B3    C3              retn
  004027B4    33D2            xor     edx, edx
  004027B6    8BC7            mov     eax, edi
  004027B8    F735 68364000   div     dword ptr [403668]
  004027BE    85C0            test    eax, eax
  004027C0    8945 08         mov     dword ptr [ebp+8], eax
  004027C3    DB45 08         fild    dword ptr [ebp+8]
  004027C6    7D 06           jge     short 004027CE
  004027C8    D805 E0044000   fadd    dword ptr [4004E0]
  004027CE    D91C9D D8354000 fstp    dword ptr [ebx*4+4035D8]
  004027D5    33C0            xor     eax, eax
  004027D7    8B4D F4         mov     ecx, dword ptr [ebp-C]
  004027DA    64:890D 0000000>mov     dword ptr fs:[0], ecx
  004027E1    5F              pop     edi
  004027E2    5E              pop     esi
  004027E3    5B              pop     ebx
  004027E4    8BE5            mov     esp, ebp
  004027E6    5D              pop     ebp
  004027E7    C2 1000         retn    10
  
     0040273B    的  call    00402890在这里:
  
  00402890    55              push    ebp
  00402891    8BEC            mov     ebp, esp
  00402893    51              push    ecx
  00402894    F3:0F1045 08    movss   xmm0, dword ptr [ebp+8]          ; z(i)
  00402899    F3:0F100D 70054>movss   xmm1, dword ptr [400570]         ; 7fffffff
  004028A1    0F54C1          andps   xmm0, xmm1                       ; z(i) and 7fffffff
  004028A4    F3:0F5805 50054>addss   xmm0, dword ptr [400550]         ; +1.570796(常数d)
  004028AC    F3:0F5905 60054>mulss   xmm0, dword ptr [400560]         ; *0.6366197(常数e);r(i)=((z(i) and 0x7fffffff)+d)*e
  004028B4    F3:0F2CC8       cvttss2si ecx, xmm0                      ; 取整1;h(i)=int(r(i))
  004028B8    F3:0F102D 40054>movss   xmm5, dword ptr [400540]         ; 1.000000;常数1
  004028C0    8BD1            mov     edx, ecx
  004028C2    C1E2 1E         shl     edx, 1E
  004028C5    F3:0F2AC9       cvtsi2ss xmm1, ecx                       ; ECX=h(i);转换为浮点数送XMM1
  004028C9    81E2 00000080   and     edx, 80000000
  004028CF    83E1 01         and     ecx, 1                           ; ecx=1
  004028D2    F3:0F5CC1       subss   xmm0, xmm1                       ; j(i)=r(i)-int(r(i))
  004028D6    F3:0F10348D C00>movss   xmm6, dword ptr [ecx*4+4005C0]   ; cx一般总为1,所以,xx6=ffffffff
  004028DF    F3:0F5DC5       minss   xmm0, xmm5                       ; min(j(i),1)
  004028E3    F3:0F100D B0054>movss   xmm1, dword ptr [4005B0]         ; 0.004681754常数a
  004028EB    F3:0F5CE8       subss   xmm5, xmm0                       ; 1-(min(j(i),1))
  004028EF    0F54EE          andps   xmm5, xmm6                       ; n= 1-(min(j(i),1)) and ffffffff
  004028F2    F3:0F103D A0054>movss   xmm7, dword ptr [4005A0]         ; 0.07969262;常数b
  004028FA    0F55F0          andnps  xmm6, xmm0                       ; not(ffffffff) and min(j(i),1)=0
  004028FD    8955 FC         mov     dword ptr [ebp-4], edx           ; 0
  00402900    0F56EE          orps    xmm5, xmm6                       ; n or 0x0 ; 不变
  00402903    F3:0F10C5       movss   xmm0, xmm5                       ; n
  00402907    F3:0F59ED       mulss   xmm5, xmm5                       ; m=n^2
  0040290B    F3:0F1025 90054>movss   xmm4, dword ptr [400590]         ; -0.6459641;常数c
  00402913    F3:0F10D5       movss   xmm2, xmm5                       ; m
  00402917    F3:0F59E9       mulss   xmm5, xmm1                       ; a*m
  0040291B    F3:0F100D 80054>movss   xmm1, dword ptr [400580]         ; 1.570796;常数d
  00402923    F3:0F58EF       addss   xmm5, xmm7                       ; a*m+b
  00402927    F3:0F59EA       mulss   xmm5, xmm2                       ; (a*m+b)*m
  0040292B    F3:0F105D FC    movss   xmm3, dword ptr [ebp-4]          ; 0
  00402930    F3:0F58EC       addss   xmm5, xmm4                       ; (a*m+b)*m+c
  00402934    F3:0F59EA       mulss   xmm5, xmm2                       ; ((a*m+b)*m+c)*m
  00402938    0F56C3          orps    xmm0, xmm3                       ; n or 0x0=n
  0040293B    F3:0F58E9       addss   xmm5, xmm1                       ; ((a*m+b)*m+c)*m+d
  0040293F    F3:0F59C5       mulss   xmm0, xmm5                       ; s(i)=(((a*m+b)*m+c)*m+d)*n
  00402943    F3:0F1145 08    movss   dword ptr [ebp+8], xmm0          ; 保存结果
  00402948    D945 08         fld     dword ptr [ebp+8]
  0040294B    8BE5            mov     esp, ebp
  0040294D    5D              pop     ebp
  0040294E    C3              retn
  
  
      分析如下:
      用户名生成的4个双字(以seya为例)
  0000A467 (decimal 42087.)
  00001103 (decimal 4355.)
  0000B2C6 (decimal 45766.)
  00009CF1 (decimal 40177.)
  
      分别/65536/2+0.5,放在4035D8开始的4组空间里
  ds:[004035D8]=0.8210983276367187500
  ds:[004035DC]=0.5332260131835937500
  ds:[004035E0]=0.8491668701171875000
  ds:[004035E4]=0.8065261840820312500
      设为y(i)
  y(1)=0.8210983276367187500
  y(2)=0.5332260131835937500
  y(3)=0.8491668701171875000
  y(4)=0.8065261840820312500
      把16位序列号拆成4个4位16进制数设为x(i)
      则x(i)相对应得10进制数分别为o(i)
  q(i)=o(i)/65536/2+0.5
      存放在403560开始的4组双字空间里
  z(i)=y(i)*q(i)
  r(i)=((z(i) and 0x7fffffff)+d)*e
  h(i)=int(r(i))         (取整数部分)
  j(i)=r(i)-int(r(i))    (取小数部分)
  n= 1-(min(j(i),1)) and ffffffff
  j(i)总是小于1,所以可以认为
  n=1-j(i) and ffffffff
  m=n^2   (n的平方哦,不是异或。下同)
  
  a-e为常数
  e=0.6366197
  d=1.570796
  c=-0.6459641
  b=0.07969262
  a=-0.004681754
  
  s(i)=(((a*m+b)*m+c)*m+d)*n
  
  判断:
  |s(i)-q(i)|<=0.000015288
  的话,就通过,进行下一组.
  
  那么逆运算可以如下进行:
      由于进行XOR操作后操作数皆无变化(经验,未验证),所以忽略,int(r(i))=1(经验,未验证),可以进行如下变换:
  z=r/e-d
  j=1-n
  r=j+int(r(i))=j+1
  z=(j+1)/e-d=(1-n+1)/e-d=(2-n)/e-d
  q=z/y=((2-n)/e-d)/y
  将m=n^2以及q=((2-n)/e-d)/y带入如上不等式可得到
  |(((a*n^2+b)*n^2+c)*n^2+d)*n-((2-n)/e-d)/y|<=0.000015288
      整理得:
  |a*n^7+b*n^5+c*n^3+(d+(1/(e*y)))*n+d/y-2/(e*y)|<=0.000015288
      即
  a*n^7+b*n^5+c*n^3+(d+(1/(e*y)))*n+d/y-2/(e*y)<=0.000015288
  a*n^7+b*n^5+c*n^3+(d+(1/(e*y)))*n+d/y-2/(e*y)>=-0.000015288
  a*n^7+b*n^5+c*n^3+(d+(1/(e*y)))*n+d/y-2/(e*y)-0.000015288<=0
  a*n^7+b*n^5+c*n^3+(d+(1/(e*y)))*n+d/y-2/(e*y)+0.000015288>=0
      解集为两不等式解集的交集
      不等式我不会解
      不过可以通过解下列方程确定解集的边界:
  a*n^7+b*n^5+c*n^3+(d+(1/(e*y)))*n+d/y-2/(e*y)-0.000015288=0
  a*n^7+b*n^5+c*n^3+(d+(1/(e*y)))*n+d/y-2/(e*y)+0.000015288=0
      解这两个方程可用迭代法取近似值.
      把a b c d e y带入上述方程可解得n
      然后
  q=((2-n)/e-d)/y
  o=(q-0.5)*2*65536
      ps:当然你也可以先把o=(((2-n)/e-d)/y-0.5)*2*65536带入上述方程得到一个关于o的方程,直接解o   :)
      把得到的o(i)四舍五入然后转换成16进制数,依序排列即可得到注册码!
      可惜,直到现在也没跟出y的算法,因此这个CM的破解还不算完成。
      昨天发的方程有问题!
      为了计算简便,舍了项,结果不精确!
      好了,跟踪这个CM花了我2天,注册码分析那一部分一个晚上就搞定了,SSE和浮点以前没搞过,都是边上网查资料,边单步跟,在这里我想起台湾有个crack先驱似乎说过,如果SICE能边上网边听音乐边破解(如果有那个闲心的话)就好了,大意如此,现在OD已经把这个变成了现实,这真的是很不错!
      由于用户名这里始终没搞定,本来想完全搞定了一次发,现在看来我已经没办法做到这点了,所以先把弄好的部分发出来,其余部分期待高手们继续!
      这一篇还是面向和我一样的新手的,写的尽可能详细了,尤其关于SSE和浮点那部分,因为很多人跟我一样对SSE和浮点接触的比较少,所以希望写的这个东西有一点点参考价值,我就很开心了:)
      最后祝大家端午节快乐!
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年06月19日 14:49:22


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (20)
雪    币: 47147
活跃值: (20460)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
2
分析的太详细了,端午节快乐!
2007-6-19 15:19
0
雪    币: 1969
活跃值: (46)
能力值: (RANK:550 )
在线值:
发帖
回帖
粉丝
3
前天看了下 没搞定 现在有楼主的文章了
2007-6-19 15:54
0
雪    币: 244
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
学习下,
端午节快乐!
2007-6-19 16:31
0
雪    币: 405
活跃值: (10)
能力值: ( LV9,RANK:1130 )
在线值:
发帖
回帖
粉丝
5
看得我眼花缭乱。
粽子节快乐
2007-6-19 19:07
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
太强了,支持一下!拿分,走人!~~~~~`
2007-6-19 19:09
0
雪    币: 328
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
7
  最新补充,作者本人交待,0040273B   call    00402890 这里相当于cosf,所以整个计算过程可简化为|cos(y(i)*q(i))-q(i)|=0.00001525879求此方程的解得问题,y已知,求q。这个方程就相当容易了,我原来的解法显就很麻烦、繁琐。看来掌握一些常用的算法例程非常必要。
  下面我将会找时间攻攻这个crack me里的VM,如果成功我会发个补完版,不过本人很菜,大家别太期待哦。
2007-6-19 19:39
0
雪    币: 328
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
8
发重了,编辑掉
2007-6-19 19:39
0
雪    币: 328
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
9
大家看:
  00400DC4  |> /FF248D 901D40>/jmp     dword ptr [ecx*4+401D90]
  。
  。
  。
  00401BC6    8B45 00         |mov     eax, dword ptr [ebp]            ; 查表;
  00401BC9    8D48 FF         |lea     ecx, dword ptr [eax-1]
  00401BCC    83C5 04         |add     ebp, 4
  00401BCF    81F9 9C000000   |cmp     ecx, 9C
  00401BD5  ^ 0F86 E9F1FFFF   \jbe     00400DC4                        ;这里跳去上面那个jmp
  
      一个类似于通过查表决定跳转位置的东东,而那个表。。。非常的复杂:
  
      跟到这里我终于没耐心继续了,作者还说没混淆指令,看来是对高手说的,我的水平不高,这个机关已经把我搞混乱了:)期待哪位牛人帮忙搞定吧!
      哪位高人可以指点下,这个部分到底是什么啊?
2007-6-19 19:40
0
雪    币: 254
活跃值: (126)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
注意看作者的说明:
第1次写, 应该是个蛮有难度的CM
无壳无anti无垃圾干扰代码, 有vm
欢迎尝试~~
2007-6-19 19:53
0
雪    币: 461
活跃值: (93)
能力值: ( LV9,RANK:1170 )
在线值:
发帖
回帖
粉丝
11
端午节快乐!支持牛人!
2007-6-19 20:54
0
雪    币: 328
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
12
这就是传说中的VM?长见识。。跟想象的完全不一样,OK,这几天就研究一下,希望能有成果
本来都想放弃了说。
2007-6-19 22:04
0
雪    币: 1946
活跃值: (248)
能力值: (RANK:330 )
在线值:
发帖
回帖
粉丝
13
太邪恶了,hexer叔叔就这样误导人家走进了深渊.
2007-6-19 22:06
0
雪    币: 4441
活跃值: (805)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
太好了,谢谢楼主分享
2007-6-20 15:32
0
雪    币: 328
活跃值: (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
15
第二部分决定另起一贴,如果版主觉得有必要,请帮我合在一起
2007-6-21 00:55
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
完全不懂,完全支持你的好文,不过这种 CM 很费劲的,但也很长功力的,有空我自己根一次
你的破文我已保存好了,不懂的时候拿来看看,支持
2007-6-21 01:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
学习下
2007-6-21 10:36
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
牛~~~~~~~~~~`
2007-6-22 16:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
学习学习!!!
2007-6-22 16:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
这样我就能看明白了呵呵
2007-6-22 19:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
真是不错!支持一下!
2007-6-23 10:40
0
游客
登录 | 注册 方可回帖
返回
//