【文章标题】: 王子的第一次
【文章作者】: 铁面王子
【作者QQ号】: 173991904
【软件名称】: KeyGenMe_01.exe
【软件大小】: 24k
【下载地址】: http://bbs.pediy.com/showthread.php?t=33853
【加壳方式】: 无
【编写语言】: VB
【使用工具】: OD+计算器
【操作平台】: xpsp2
【软件介绍】: happytown的CRACK入门系列第一题
【作者声明】: 第一次写破文,希望大家能看得明白,在个,有不足之处望手指点
--------------------------------------------------------------------------------
【详细过程】
【分析过程】
打开程序试着注册了下,没提示错误。对__vbaStrMove函数下断点
输入注册名:123456
注册码:456789
代码:
004023F9 . FF15 20104000 call dword ptr [<&MSVBVM60.__vbaHres>; MSVBVM60.__vbaHresultCheckObj
004023FF 8B55 C8 mov edx, dword ptr [ebp-38] ; 此处注册名传入EDX
00402402 . 895D C8 mov dword ptr [ebp-38], ebx
00402405 . 8D4D CC lea ecx, dword ptr [ebp-34]
00402408 . 8B3D A0104000 mov edi, dword ptr [<&MSVBVM60.__vb>; 断在此处
0040240E . FFD7 call edi ; <&MSVBVM60.__vbaStrMove>
00402410 . 8D4D C4 lea ecx, dword ptr [ebp-3C]
00402413 . FF15 B0104000 call dword ptr [<&MSVBVM60.__vbaFree>; MSVBVM60.__vbaFreeObj
00402419 . 8B45 CC mov eax, dword ptr [ebp-34] ; 注册名传入EAX
0040241C . 50 push eax ; 保存用户名
0040241D . FF15 08104000 call dword ptr [<&MSVBVM60.__vbaLenB>; 取注册名长度
00402423 . 8BC8 mov ecx, eax ; 注册名长度传到ECX
00402425 . FF15 50104000 call dword ptr [<&MSVBVM60.__vbaI2I4>; MSVBVM60.__vbaI2I4
0040242B . 8945 D0 mov dword ptr [ebp-30], eax
0040242E . 66:3D 0300 cmp ax, 3 ; 查看注册名位数是否大于3位
00402432 . 0F8C CD010000 jl 00402605 ; 小于3位,结束
00402438 . 8B0E mov ecx, dword ptr [esi]
0040243A . 56 push esi
0040243B . FF91 0C030000 call dword ptr [ecx+30C]
00402441 . 50 push eax
00402442 . 8D55 C4 lea edx, dword ptr [ebp-3C]
00402445 . 52 push edx
00402446 . FF15 30104000 call dword ptr [<&MSVBVM60.__vbaObjS>; MSVBVM60.__vbaObjSet
0040244C . 8BF0 mov esi, eax
0040244E . 8B06 mov eax, dword ptr [esi]
00402450 . 8D4D C8 lea ecx, dword ptr [ebp-38]
00402453 . 51 push ecx
00402454 . 56 push esi
00402455 . FF90 A0000000 call dword ptr [eax+A0]
0040245B . DBE2 fclex
0040245D . 3BC3 cmp eax, ebx
0040245F . 7D 12 jge short 00402473
00402461 . 68 A0000000 push 0A0
00402466 . 68 401C4000 push 00401C40
0040246B . 56 push esi
0040246C . 50 push eax
0040246D . FF15 20104000 call dword ptr [<&MSVBVM60.__vbaHres>; MSVBVM60.__vbaHresultCheckObj
00402473 > 8B55 C8 mov edx, dword ptr [ebp-38]
00402476 . 895D C8 mov dword ptr [ebp-38], ebx
00402479 . 8D4D DC lea ecx, dword ptr [ebp-24]
0040247C . FFD7 call edi
0040247E . 8D4D C4 lea ecx, dword ptr [ebp-3C]
00402481 . FF15 B0104000 call dword ptr [<&MSVBVM60.__vbaFree>; MSVBVM60.__vbaFreeObj
00402487 . 8B55 DC mov edx, dword ptr [ebp-24] ; 假注册码传到EDX
0040248A . 52 push edx ; 保存假码
0040248B . FF15 08104000 call dword ptr [<&MSVBVM60.__vbaLenB>; 取假码长度
00402491 . 8BC8 mov ecx, eax ; 假码长度传到ECX
00402493 . FF15 50104000 call dword ptr [<&MSVBVM60.__vbaI2I4>; MSVBVM60.__vbaI2I4
00402499 . 66:3BC3 cmp ax, bx ; 注册码为空,退出
0040249C . 0F84 63010000 je 00402605
004024A2 . BF 01000000 mov edi, 1 ; 初始化循环变量
004024A7 . 8BF7 mov esi, edi
004024A9 . 8B1D 0C104000 mov ebx, dword ptr [<&MSVBVM60.__vb>; MSVBVM60.__vbaFreeVarList
004024AF > 66:3B75 D0 cmp si, word ptr [ebp-30] ; 循环是否结束?
004024B3 . 0F8F 93000000 jg 0040254C
004024B9 . C745 BC 01000>mov dword ptr [ebp-44], 1 ; 此处到.....
004024C0 . C745 B4 02000>mov dword ptr [ebp-4C], 2 ; .....
004024C7 . 8D45 CC lea eax, dword ptr [ebp-34] ; ....
004024CA . 8985 7CFFFFFF mov dword ptr [ebp-84], eax ; .....
004024D0 . C785 74FFFFFF>mov dword ptr [ebp-8C], 4008 ; .....
004024DA . 8D4D B4 lea ecx, dword ptr [ebp-4C] ; ....
004024DD . 51 push ecx ; ....
004024DE . 0FBFD6 movsx edx, si ; .....
004024E1 . 52 push edx ; ....
004024E2 . 8D85 74FFFFFF lea eax, dword ptr [ebp-8C] ; ....
004024E8 . 50 push eax ; .....
004024E9 . 8D4D A4 lea ecx, dword ptr [ebp-5C] ; ....
004024EC . 51 push ecx ; ....
004024ED . FF15 44104000 call dword ptr [<&MSVBVM60.#632>] ; .....
004024F3 . 8D55 A4 lea edx, dword ptr [ebp-5C] ; ....
004024F6 . 52 push edx ; ....
004024F7 . 8D45 C8 lea eax, dword ptr [ebp-38] ; ....
004024FA . 50 push eax ; 以上这段代码不知道起什么作用,请高手指出
004024FB . FF15 74104000 call dword ptr [<&MSVBVM60.__vbaStrV>; 转换成16进制的ASSICC码
00402501 . 50 push eax ; 保存ASSICC码
00402502 . FF15 18104000 call dword ptr [<&MSVBVM60.#516>] ; MSVBVM60.rtcAnsiValueBstr
00402508 . 66:0FAFC6 imul ax, si ; ASSICC码*循环变量,得出的值保存在AX中
0040250C . 0F80 5F010000 jo 00402671 ; 查看是否溢出
00402512 . 0FBFC8 movsx ecx, ax ; ax值传ECX
00402515 . 03CF add ecx, edi ; ECX=ECX+EDI
00402517 . 0F80 54010000 jo 00402671 ; 是否溢出?
0040251D . 8BF9 mov edi, ecx ; EDI保存计算出的新值
0040251F . 8D4D C8 lea ecx, dword ptr [ebp-38]
00402522 . FF15 B4104000 call dword ptr [<&MSVBVM60.__vbaFree>; MSVBVM60.__vbaFreeStr
00402528 . 8D55 A4 lea edx, dword ptr [ebp-5C]
0040252B . 52 push edx
0040252C . 8D45 B4 lea eax, dword ptr [ebp-4C]
0040252F . 50 push eax
00402530 . 6A 02 push 2
00402532 . FFD3 call ebx
00402534 . 83C4 0C add esp, 0C
00402537 . B8 01000000 mov eax, 1
0040253C . 66:03C6 add ax, si ; 循环变量递增
0040253F . 0F80 2C010000 jo 00402671
00402545 . 8BF0 mov esi, eax
00402547 .^ E9 63FFFFFF jmp 004024AF ; 跟据注册名,循环计算注册码
0040254C > 69FF 96740100 imul edi, edi, 17496 ; edi=计算出的注册码*95382(17496转换后的10进制数)
00402552 . 0F80 19010000 jo 00402671
00402558 . 897D D8 mov dword ptr [ebp-28], edi
0040255B . DB45 D8 fild dword ptr [ebp-28] ; 装入整数,推入隐含的ST中 ,这是真注册码
0040255E . DD9D 14FFFFFF fstp qword ptr [ebp-EC] ; 此处用浮点运算,计算出真正的注册码
00402564 . 8B4D DC mov ecx, dword ptr [ebp-24] ; 假码传入ECX
00402567 . 51 push ecx ; 保存假码
00402568 . FF15 80104000 call dword ptr [<&MSVBVM60.__vbaR8St>; vbaR8Str:将数值型字串转为数值
0040256E . DC9D 14FFFFFF fcomp qword ptr [ebp-EC] ; 浮点数比较函数
00402574 . DFE0 fstsw ax ; 把状态字存入AX中
00402576 . F6C4 40 test ah, 40 ; 测试
00402579 0F84 86000000 je 00402605 ; 关键跳,可暴破
由上看出,解密算法为:
m=username每一位转换16进制的ASSICC码(此处和alpsdew分析的有点出入,请高手指出)
password=m*i(循环变量)+password
password=password*95382
再经过fild(password)转换成10制码,得出真正的注册码
可用的注册码
注册名:123456
注册码:104920200
以上分析有错误的地方,请高手指出.
--------------------------------------------------------------------------------
【经验总结】
算法比较简单,明码比较.非常适合新手练习
http://www.yhlive.com/simple/index.php?t63656.html,此网站介绍了VB程序几个常用 函数断点,里面就有提到VBASTRMOVE函数,用于移动字符串.http://bbs.pediy.com/showthread.php?t=60499这里是高手对浮点运算指令的解释
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2008年03月06日 11:49:53
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)