【文章标题】: 生活小管家 算法分析
【文章作者】: KAN-LI
【作者邮箱】: TOM8147@HOTMAIL.COM
【软件名称】: 生活小管家 1。0
【软件大小】: 960 KB
【下载地址】: http://www.softreg.com.cn/shareware_view.aspx?id=/9DB89468-EB62-452B-B415-FE5718DFA291/
【编写语言】: Microsoft Visual C++ 7.0
【使用工具】: 0D PEID
【操作平台】: WINXP SP2
【作者声明】: 只是感兴趣,没有其他目的
--------------------------------------------------------------------------------
【详细过程】
昨天在其他论坛,看有人发布这个软件的破解,闲着没事,下载来看看,原来是内存注册机,我们学习破解的人当然想看看它的算法是如何生成
的,于是就用 OD 跟了一下,难度不高,但走的路有点长,第一次发破文,很多不到的地方,大家见谅
―――――――――――――――――――――――――――――――――――――――――――――
OD 载入用万能断点很容易跑道算法的地方:先 F9 启动软件 随意输入 16 个字符,然后在插件里找到 ApiBreak - API 断点-万能断点
把里面的勾打上,从新到注册框 点击 确定,中断 ALT+F9 返回用户代码,F8 跑,当返回系统领空时 也用 ALT + F9 返回,很快到下面
0040EA5E . E8 02130200 CALL 生活小管.0042FD65 ;这里下断点
0040EA63 . 8B46 74 MOV EAX,DWORD PTR DS:[ESI+74] ; 假码
0040EA66 . 8378 F4 10 CMP DWORD PTR DS:[EAX-C],10 ; 注册码必须要 16 个数字
0040EA6A . 8D7E 74 LEA EDI,DWORD PTR DS:[ESI+74]
0040EA6D . 74 24 JE SHORT 生活小管.0040EA93
0040EA6F . 6A 00 PUSH 0
0040EA71 . 68 C8F64300 PUSH 生活小管.0043F6C8
0040EA76 . 68 FC104400 PUSH 生活小管.004410FC
0040EA7B . 8BCE MOV ECX,ESI
0040EA7D . E8 85120200 CALL 生活小管.0042FD07 ; 错误
0040EA82 . 5F POP EDI
0040EA83 . 5E POP ESI
0040EA84 . 8B4C24 0C MOV ECX,DWORD PTR SS:[ESP+C]
0040EA88 . 64:890D 00000>MOV DWORD PTR FS:[0],ECX
0040EA8F . 83C4 18 ADD ESP,18
0040EA92 . C3 RETN
0040EA93 > 55 PUSH EBP
0040EA94 . E8 75030200 CALL 生活小管.0042EE0E
0040EA99 . 8B10 MOV EDX,DWORD PTR DS:[EAX]
0040EA9B . 8BC8 MOV ECX,EAX
0040EA9D . FF52 0C CALL DWORD PTR DS:[EDX+C]
0040EAA0 . 83C0 10 ADD EAX,10
0040EAA3 . 894424 10 MOV DWORD PTR SS:[ESP+10],EAX
0040EAA7 . 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10]
0040EAAB . 50 PUSH EAX
0040EAAC . 8D6E 70 LEA EBP,DWORD PTR DS:[ESI+70]
0040EAAF . 55 PUSH EBP
0040EAB0 . 8D4C24 1C LEA ECX,DWORD PTR SS:[ESP+1C]
0040EAB4 . C74424 28 000>MOV DWORD PTR SS:[ESP+28],0
0040EABC . E8 0F77FFFF CALL 生活小管.004061D0 ; 关键 CALL ,F7 跟进
0040EAC1 . 8B07 MOV EAX,DWORD PTR DS:[EDI] ; 假码
0040EAC3 . 8B4C24 10 MOV ECX,DWORD PTR SS:[ESP+10] ; 注册码
0040EAC7 . 50 PUSH EAX
0040EAC8 . 51 PUSH ECX
0040EAC9 . E8 9CE90000 CALL 生活小管.0041D46A
0040EACE . 83C4 08 ADD ESP,8
0040EAD1 . 85C0 TEST EAX,EAX
0040EAD3 . 74 4B JE SHORT 生活小管.0040EB20
0040EAD5 . 6A 00 PUSH 0
0040EAD7 . 68 C8F64300 PUSH 生活小管.0043F6C8
0040EADC . 68 FC104400 PUSH 生活小管.004410FC ; 注册码不正确,请检查重试!
0040EAE1 . 8BCE MOV ECX,ESI
0040EAE3 . E8 1F120200 CALL 生活小管.0042FD07
0040EAE8 . 6A 00 PUSH 0
0040EAEA . 68 F8FA4300 PUSH 生活小管.0043FAF8
0040EAEF . 8BCF MOV ECX,EDI
0040EAF1 . E8 3A2FFFFF CALL 生活小管.00401A30
0040EAF6 . 6A 00 PUSH 0
0040EAF8 . 8BCE MOV ECX,ESI
0040EAFA . E8 66120200 CALL 生活小管.0042FD65
0040EAFF . 8B4424 10 MOV EAX,DWORD PTR SS:[ESP+10]
0040EB03 . 83C0 F0 ADD EAX,-10
0040EB06 . C74424 20 FFF>MOV DWORD PTR SS:[ESP+20],-1
0040EB0E . 8D50 0C LEA EDX,DWORD PTR DS:[EAX+C]
0040EB11 . 83C9 FF OR ECX,FFFFFFFF
0040EB14 . F0:0FC10A LOCK XADD DWORD PTR DS:[EDX],ECX ; 锁定前缀
0040EB18 . 49 DEC ECX
0040EB19 . 85C9 TEST ECX,ECX
0040EB1B . E9 F5000000 JMP 生活小管.0040EC15
0040EB20 > E8 E9020200 CALL 生活小管.0042EE0E
0040EB25 . 8B10 MOV EDX,DWORD PTR DS:[EAX]
0040EB27 . 8BC8 MOV ECX,EAX
0040EB29 . FF52 0C CALL DWORD PTR DS:[EDX+C]
0040EB2C . 83C0 10 ADD EAX,10
0040EB2F . 894424 0C MOV DWORD PTR SS:[ESP+C],EAX
0040EB33 . 68 F0F84300 PUSH 生活小管.0043F8F0 ; sys_Authorise#
0040EB38 . 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10]
0040EB3C . 68 E8104400 PUSH 生活小管.004410E8 ; delete * from %s
0040EB41 . 50 PUSH EAX
0040EB42 . C64424 2C 01 MOV BYTE PTR SS:[ESP+2C],1
0040EB47 . E8 3435FFFF CALL 生活小管.00402080
0040EB4C . 83C4 0C ADD ESP,0C
0040EB4F . 8D4C24 0C LEA ECX,DWORD PTR SS:[ESP+C]
0040EB53 . 51 PUSH ECX
0040EB54 . B9 80234500 MOV ECX,生活小管.00452380
0040EB59 . E8 7253FFFF CALL 生活小管.00403ED0
0040EB5E . 8B17 MOV EDX,DWORD PTR DS:[EDI]
0040EB60 . 8B45 00 MOV EAX,DWORD PTR SS:[EBP]
0040EB63 . 52 PUSH EDX
0040EB64 . 50 PUSH EAX
0040EB65 . 68 F0F84300 PUSH 生活小管.0043F8F0 ; sys_Authorise#
0040EB6A . 8D4C24 18 LEA ECX,DWORD PTR SS:[ESP+18]
0040EB6E . 68 0CF84300 PUSH 生活小管.0043F80C ; insert into %s values('%s','%s')
0040EB73 . 51 PUSH ECX
0040EB74 . E8 0735FFFF CALL 生活小管.00402080
0040EB79 . 83C4 14 ADD ESP,14
0040EB7C . 8D5424 0C LEA EDX,DWORD PTR SS:[ESP+C]
0040EB80 . 52 PUSH EDX
0040EB81 . B9 80234500 MOV ECX,生活小管.00452380
0040EB86 . E8 4553FFFF CALL 生活小管.00403ED0
0040EB8B . 84C0 TEST AL,AL
0040EB8D . 8BCE MOV ECX,ESI
0040EB8F . 6A 00 PUSH 0
0040EB91 . 75 26 JNZ SHORT 生活小管.0040EBB9
0040EB93 . 68 C8F64300 PUSH 生活小管.0043F6C8 ; 错误
0040EB98 . 68 C8104400 PUSH 生活小管.004410C8 ; 注册信息写入失败,请检查重试!
0040EB9D . E8 65110200 CALL 生活小管.0042FD07
0040EBA2 . 68 F8FA4300 PUSH 生活小管.0043FAF8
0040EBA7 . 8BCF MOV ECX,EDI
0040EBA9 . E8 023DFFFF CALL 生活小管.004028B0
0040EBAE . 6A 00 PUSH 0
0040EBB0 . 8BCE MOV ECX,ESI
0040EBB2 . E8 AE110200 CALL 生活小管.0042FD65
0040EBB7 . EB 1D JMP SHORT 生活小管.0040EBD6
0040EBB9 > 68 CCFE4300 PUSH 生活小管.0043FECC ; 提示
0040EBBE . 68 98104400 PUSH 生活小管.00441098 ; 恭喜您,注册已成功!祝你使用愉快,开开心心每一天!
___________________________________________________________________________
F7 跟进 0040EABC 后,省略 N 多代码来到下面
00406231 . 8B03 MOV EAX,DWORD PTR DS:[EBX] ; 机器码
00406233 . 55 PUSH EBP
00406234 . 50 PUSH EAX
00406235 . 56 PUSH ESI
00406236 . E8 15800100 CALL 生活小管.0041E250
0040623B . 83C4 10 ADD ESP,10
0040623E . 33C9 XOR ECX,ECX
00406240 . 85ED TEST EBP,EBP
00406242 . 7E 1C JLE SHORT 生活小管.00406260
00406244 > 8A0431 MOV AL,BYTE PTR DS:[ECX+ESI] ;第一段 算法 开始 取机器码字符
00406247 . 02C1 ADD AL,CL ;CL 是循环次数
00406249 . 8AD1 MOV DL,CL ;循环次数送入 DL
0040624B . FEC0 INC AL ;AL + 1
0040624D . C0E2 02 SHL DL,2 ;DL * 4
00406250 . 32C2 XOR AL,DL ;AL 和 DL 做异或 运算,结果如 AL
00406252 . 3C 30 CMP AL,30 ;比较 AL 的结果是否 30
00406254 . 75 02 JNZ SHORT 生活小管.00406258
00406256 . B0 65 MOV AL,65 ;是就给 AL 赋值为 65
00406258 > 880431 MOV BYTE PTR DS:[ECX+ESI],AL ;把结果送入内存
0040625B . 41 INC ECX ;cx + 1 用做循环
0040625C . 3BCD CMP ECX,EBP
0040625E .^ 7C E4 JL SHORT 生活小管.00406244 ;跳回上面从新开始计算下一个机器码
;以上结果保存下来,留做下一轮计算
00406260 > \56 PUSH ESI
00406261 . 8D4C24 2C LEA ECX,DWORD PTR SS:[ESP+2C]
00406265 . E8 96C8FFFF CALL 生活小管.00402B00
0040626A . 8D4424 28 LEA EAX,DWORD PTR SS:[ESP+28]
0040626E . 50 PUSH EAX
0040626F . 8D4C24 14 LEA ECX,DWORD PTR SS:[ESP+14]
00406273 . 51 PUSH ECX
00406274 . 8B4C24 1C MOV ECX,DWORD PTR SS:[ESP+1C]
00406278 . C74424 28 000>MOV DWORD PTR SS:[ESP+28],0
00406280 . E8 BBFBFFFF CALL 生活小管.00405E40 ; 产生注册码 F7 跟进
――――――――――――――――――――――――――――――――――――――――――――
F7 跟入 00406280 后,省略 N 多代码来到下面 (按 F8 键一直走)
来到这个 CALL ,郁闷啊 跑完一个有一个 的 CALL
00405F34 . E8 A7FBFFFF CALL 生活小管.00405AE0 ; 跟进
――――――――――――――――――――――――――――――――――――――――――――
进入后 (00405F34),代码长啊,又 省略 部分代码
00405B72 |> /75 0F /JNZ SHORT 生活小管.00405B83 ; 可疑
00405B74 |. |8B4424 10 |MOV EAX,DWORD PTR SS:[ESP+10]
00405B78 |. |99 |CDQ
00405B79 |. |83E2 03 |AND EDX,3
00405B7C |. |03C2 |ADD EAX,EDX
00405B7E |. |8BE8 |MOV EBP,EAX
00405B80 |. |C1FD 02 |SAR EBP,2
00405B83 |> |85ED |TEST EBP,EBP
00405B85 |. |7E 6B |JLE SHORT 生活小管.00405BF2
00405B87 |. |8BD5 |MOV EDX,EBP
00405B89 |. |8DA424 000000>|LEA ESP,DWORD PTR SS:[ESP]
00405B90 |> |0FB60E |/MOVZX ECX,BYTE PTR DS:[ESI] ; 算法开始,第一个字符送入 ECX
00405B93 |. |0FB646 01 ||MOVZX EAX,BYTE PTR DS:[ESI+1] ; 第二个字符入 EAX
00405B97 |. |C1E1 08 ||SHL ECX,8 ; CX * 256
00405B9A |. |0BC8 ||OR ECX,EAX ; 逻辑 或 运算,结果入 ECX
00405B9C |. |46 ||INC ESI ; SI + 1
00405B9D |. |0FB646 01 ||MOVZX EAX,BYTE PTR DS:[ESI+1] ; 第三个字符入 EAX
00405BA1 |. |C1E1 08 ||SHL ECX,8 ; CX * 256
00405BA4 |. |0BC8 ||OR ECX,EAX ; 逻辑 或 运算 ,结果入 ECX
00405BA6 |. |46 ||INC ESI ; SI + 1
00405BA7 |. |C1E1 08 ||SHL ECX,8 ; CX * 256
00405BAA |. |8BC1 ||MOV EAX,ECX ; 把上面计算结果入 EAX
00405BAC |. |C1E8 1A ||SHR EAX,1A ; 除以 47108864
00405BAF |. |8A80 98FA4300 ||MOV AL,BYTE PTR DS:[EAX+43FA98] ; 又一个查表,把上面 AX结果+43FA98(地址)
00405BB5 |. |8807 ||MOV BYTE PTR DS:[EDI],AL ; 产生第一个真码字符
00405BB7 |. |C1E1 06 ||SHL ECX,6 ; CX*64
00405BBA |. |8BC1 ||MOV EAX,ECX ; CX 的值入 AX
00405BBC |. |C1E8 1A ||SHR EAX,1A ; AX 逻辑右移 1A
00405BBF |. |8A80 98FA4300 ||MOV AL,BYTE PTR DS:[EAX+43FA98] ; 从 AX + 地址 43FA98 取出第二个真码入 AL
00405BC5 |. |8847 01 ||MOV BYTE PTR DS:[EDI+1],AL ; 把第二个真码送入指定内存
00405BC8 |. |46 ||INC ESI ; SI + 1
00405BC9 |. |C1E1 06 ||SHL ECX,6 ; CX 左移 6 次
00405BCC |. |47 ||INC EDI ; EDI=(ASCII "Tl")
00405BCD |. |8BC1 ||MOV EAX,ECX ; CX 结果 入 AX
00405BCF |. |C1E8 1A ||SHR EAX,1A ; ax 右移 1A
00405BD2 |. |8A80 98FA4300 ||MOV AL,BYTE PTR DS:[EAX+43FA98] ; 第三个真码 取出
00405BD8 |. |C1E9 14 ||SHR ECX,14 ; CX 右移 14(十进制 20 )
00405BDB |. |47 ||INC EDI
00405BDC |. |8807 ||MOV BYTE PTR DS:[EDI],AL ; 第三个真码送入内存
00405BDE |. |83E1 3F ||AND ECX,3F ; CX 跟 0X3F 做逻辑‘与’运算
00405BE1 |. |8A89 98FA4300 ||MOV CL,BYTE PTR DS:[ECX+43FA98] ; 第四个真码产生
00405BE7 |. |47 ||INC EDI
00405BE8 |. |880F ||MOV BYTE PTR DS:[EDI],CL ; 第四个真码产生
00405BEA |. |47 ||INC EDI
00405BEB |. |4A ||DEC EDX
00405BEC |.^|75 A2 |\JNZ SHORT 生活小管.00405B90
--------------------------------------------------------------------------------
【经验总结】
到此全部计算完毕,但要注意的是上面这个循环有毛病,可能是作者的问题(故意捣乱),它会循环5次,第五次的结果是多余的
如 我的机器码是 :MTNKNzZCMT80PkRG
循环 5 次后结果是:TlJZQ0OUeVd2emsQbU1Zaw==
很明显 :TlJZQ0OUeVd2emsQ bU1Zaw== 这一段是多出来的,也是第五轮循环产生的废物,总结完毕
学了几个月的破解,搞定的软件十来个,算法分析出来的只有 4 个,其他的不是爆破就是 内存注册机,汗。。。。。。。。。。
不过觉的第一次写破文比搞顶这个软件还辛苦,完。
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2006年08月14日 11:40:36
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)