【文章标题】: 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
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!