首页
社区
课程
招聘
[原创]Bjanes Crackme V2.0a算法分析(VB)
发表于: 2006-8-24 23:40 5302

[原创]Bjanes Crackme V2.0a算法分析(VB)

bxm 活跃值
29
2006-8-24 23:40
5302

【文章标题】: Bjanes Crackme V2.0a算法分析(VB)
【文章作者】: bxm
【作者邮箱】: bxm78@163.com
【软件名称】: Bjanes Crackme V2.0a
【保护方式】: serial
【使用工具】: OD
【操作平台】: winxp
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  找断点就不细说了,输入780328051
  004036D9   > \8B45 E4       mov     eax, [ebp-1C]           ;  serial入EAX
  004036DC   .  50            push    eax
  004036DD   .  FF15 08104000 call    [<&MSVBVM60.__vbaLenBst>;  EAX返回serial长度
  004036E3   .  33C9          xor     ecx, ecx
  004036E5   .  83F8 09       cmp     eax, 9                  ;  EAX=9 ?
  004036E8   .  0F95C1        setne   cl                      ;  等,CL置0
  004036EB   .  F7D9          neg     ecx
  004036ED   .  8BF1          mov     esi, ecx
  004036EF   .  8D4D E4       lea     ecx, [ebp-1C]
  004036F2   .  FF15 C0104000 call    [<&MSVBVM60.__vbaFreeSt>;  MSVBVM60.__vbaFreeStr
  004036F8   .  8D4D D4       lea     ecx, [ebp-2C]
  004036FB   .  FF15 C4104000 call    [<&MSVBVM60.__vbaFreeOb>;  MSVBVM60.__vbaFreeObj
  00403701   .  66:3BF3       cmp     si, bx
  00403704   .  0F85 1A030000 jnz     00403A24                ;  如果serial长度不等于9,则跳向失败
  
  ……省略一些代码……
  0040377C   > /66:8B8D 14FFF>mov     cx, [ebp-EC]            ;  serial长度入CX
  00403783   . |66:394D E8    cmp     [ebp-18], cx            ;  [ebp-18]为循环次数
  00403787     |0F8F 17030000 jg      00403AA4                ;  关键跳,只有循环完了,才能跳向成功
  
  ……省略一些代码……
  004038F1   > \66:8B45 E8    mov     ax, [ebp-18]            ;  循环次数入AX
  004038F5   .  8B1D 74104000 mov     ebx, [<&MSVBVM60.#536>] ;  MSVBVM60.rtcStrFromVar
  004038FB   .  66:35 0200    xor     ax, 2                   ;  AX与2异或
  004038FF   .  8D4D A0       lea     ecx, [ebp-60]
  00403902   .  0F80 A4020000 jo      00403BAC
  00403908   .  51            push    ecx
  00403909   .  66:8945 A8    mov     [ebp-58], ax            ;  AX入[ebp-58]
  0040390D   .  C745 A0 02000>mov     dword ptr [ebp-60], 2
  00403914   .  FFD3          call    ebx                     ;  EAX返回[ebp-58]转换成的字符串,结果记为A; <&MSVBVM60.#536>
  00403916   .  8BD0          mov     edx, eax
  00403918   .  8D4D D8       lea     ecx, [ebp-28]
  0040391B   .  FFD6          call    esi
  0040391D   .  8B45 E4       mov     eax, [ebp-1C]
  00403920   .  8D55 C0       lea     edx, [ebp-40]
  00403923   .  52            push    edx
  00403924   .  57            push    edi
  00403925   .  50            push    eax
  00403926   .  C745 C8 01000>mov     dword ptr [ebp-38], 1
  0040392D   .  C745 C0 02000>mov     dword ptr [ebp-40], 2
  00403934   .  FF15 44104000 call    [<&MSVBVM60.#631>]      ;  MSVBVM60.rtcMidCharBstr
  0040393A   .  8BD0          mov     edx, eax
  0040393C   .  8D4D E0       lea     ecx, [ebp-20]
  0040393F   .  FFD6          call    esi
  00403941   .  50            push    eax
  00403942   .  FF15 1C104000 call    [<&MSVBVM60.#516>]      ;  EAX返回serial中的字符,循环第几次就取第几个
  00403948   .  8D4D B0       lea     ecx, [ebp-50]
  0040394B   .  66:8945 B8    mov     [ebp-48], ax
  0040394F   .  51            push    ecx
  00403950   .  C745 B0 02000>mov     dword ptr [ebp-50], 2
  00403957   .  FFD3          call    ebx                     ;  把EAX中的字符转换成十进制的字符串
  00403959   .  8BD0          mov     edx, eax
  0040395B   .  8D4D DC       lea     ecx, [ebp-24]
  0040395E   .  FFD6          call    esi
  00403960   .  50            push    eax
  00403961   .  FF15 84104000 call    [<&MSVBVM60.__vbaR8Str>>;  把字符串转成浮点数放入ST0
  00403967   .  DC25 D8104000 fsub    qword ptr [4010D8]      ;  ST0-48,结果记为B
  0040396D   .  8D55 90       lea     edx, [ebp-70]
  00403970   .  6A 01         push    1
  00403972   .  52            push    edx
  00403973   .  C785 30FFFFFF>mov     dword ptr [ebp-D0], 800>
  0040397D   .  DD9D 38FFFFFF fstp    qword ptr [ebp-C8]      ;  st0存入[0012F548]
  00403983   .  DFE0          fstsw   ax
  00403985   .  A8 0D         test    al, 0D
  00403987   .  0F85 1A020000 jnz     00403BA7
  0040398D   .  8B45 D8       mov     eax, [ebp-28]           ;  结果A入EAX
  00403990   .  C745 D8 00000>mov     dword ptr [ebp-28], 0
  00403997   .  8945 98       mov     [ebp-68], eax
  0040399A   .  8D45 80       lea     eax, [ebp-80]
  0040399D   .  50            push    eax
  0040399E   .  C745 90 08000>mov     dword ptr [ebp-70], 8
  004039A5   .  FF15 B0104000 call    [<&MSVBVM60.#619>]      ;  [EAX+8]地址处为字符串A的最后一个字符,结果记为C
  004039AB   .  8D8D 30FFFFFF lea     ecx, [ebp-D0]           ;  B入ECX
  004039B1   .  8D55 80       lea     edx, [ebp-80]           ;  结果C入EDX
  004039B4   .  51            push    ecx
  004039B5   .  52            push    edx
  004039B6   .  FF15 A0104000 call    [<&MSVBVM60.__vbaVarTst>;  B与C比较,相等,EAX置0
  004039BC   .  8BF8          mov     edi, eax                ;  EAX入EDI
  004039BE   .  8D45 D8       lea     eax, [ebp-28]
  004039C1   .  8D4D DC       lea     ecx, [ebp-24]
  004039C4   .  50            push    eax
  004039C5   .  8D55 E0       lea     edx, [ebp-20]
  004039C8   .  51            push    ecx
  004039C9   .  8D45 E4       lea     eax, [ebp-1C]
  004039CC   .  52            push    edx
  004039CD   .  50            push    eax
  004039CE   .  6A 04         push    4
  004039D0   .  FF15 90104000 call    [<&MSVBVM60.__vbaFreeSt>;  MSVBVM60.__vbaFreeStrList
  004039D6   .  83C4 14       add     esp, 14
  004039D9   .  8D4D D4       lea     ecx, [ebp-2C]
  004039DC   .  FF15 C4104000 call    [<&MSVBVM60.__vbaFreeOb>;  MSVBVM60.__vbaFreeObj
  004039E2   .  8D4D 80       lea     ecx, [ebp-80]
  004039E5   .  8D55 90       lea     edx, [ebp-70]
  004039E8   .  51            push    ecx
  004039E9   .  8D45 A0       lea     eax, [ebp-60]
  004039EC   .  52            push    edx
  004039ED   .  8D4D B0       lea     ecx, [ebp-50]
  004039F0   .  50            push    eax
  004039F1   .  8D55 C0       lea     edx, [ebp-40]
  004039F4   .  51            push    ecx
  004039F5   .  52            push    edx
  004039F6   .  6A 05         push    5
  004039F8   .  FF15 0C104000 call    [<&MSVBVM60.__vbaFreeVa>;  MSVBVM60.__vbaFreeVarList
  004039FE   .  83C4 18       add     esp, 18
  00403A01   .  66:85FF       test    di, di                  ;  DI=0 ?
  00403A04      75 1C         jnz     short 00403A22          ;  不等,跳向失败
  00403A06   .  8B7D 08       mov     edi, [ebp+8]
  00403A09   .  B8 01000000   mov     eax, 1
  00403A0E   .  66:0345 E8    add     ax, [ebp-18]
  00403A12   .  0F80 94010000 jo      00403BAC
  00403A18   .  8945 E8       mov     [ebp-18], eax
  00403A1B   .  33DB          xor     ebx, ebx
  00403A1D   .^ E9 5AFDFFFF   jmp     0040377C                ;  循环
  
  算法分析:
    1、循环次数(从1开始)与2异或,把它转成十进制字符串,取最右边一个字符,记为C。
    2、serial的每个字符-48(十进制),结果记为B。
    3、比较C与B,相等,从第1步开始,直到比较完,否则失败。
  
  与循环次数异或的结果为:
  3  0  1  6  7  4  5  A  B
  把结果转成十进制字符串,取最右边一个字符,分别为:
  3  0  1  6  7  4  5  0  1
  所以,要想得出正确serial,每一位只要再加上48,就得到serial的ASCII了。
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2006年08月24日 下午 11:39:21


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

上传的附件:
收藏
免费 7
支持
分享
最新回复 (1)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不错,学习了.
2006-8-24 23:44
0
游客
登录 | 注册 方可回帖
返回
//