• 标 题: MySQL Manager 2.8.0.1脱壳破解手记破解分析
  • 作 者:springkang[DFCG
  • 时 间:004-11-03,10:30
  • 链 接:http://bbs.pediy.com

【破文标题】 MySQL Manager 2.8.0.1脱壳破解手记破解分析
【破文作者】springkang[DFCG]
【作者主页】www.chinadfcg.com
【作者邮箱】springkang2003@yahoo.com.cn
【所属组织】DFCG
【软件名称】 MySQL Manager 2.8.0.1
【下载地址】http://www.ems-hitech.com/mymanager/
【破解工具】OllyDBG1.10,loadpe,impr,brain and hands
【保护方式】ASProtect 1.2 / 1.2c-> Alexey Solodovnikov
【软件限制】30天试用
【破解难度】中等
【破解时间】始破于二○○四年七月二十九日,脱文作于二○○四年十一月二日
----------------------------------------------------
软件介绍:
    强大的mysql管理工具,允许用户通过图形界面创建或编辑数据库对象,并提供通过sql语句管理用户和权限,通过图形界面建立sql语句,自动生成html格式的数据库文档,导入/导出数据,查看/编辑blob字段等功能
----------------------------------------------------
破解声名:学习和研究壳的脱法!帮助脱壳小菜鸟成功走上脱壳大菜鸟之路系列之一
----------------------------------------------------
【破解分析】
    今年7月在DFCG官方论坛0day区里看到这款软件,不知出于何目的就稀里糊涂的把它下了。查壳是ASProtect 1.2 / 1.2c-> Alexey Solodovnikov,很老的版本了!当时也觉得很奇怪,aspr的壳1.23版的脱文到处都是,已经被人研究得很透彻了,1.3甚至2.0的壳都已经出来了,一个刚出的新软件为何还要用老版壳来保护?现在fly 和loveboom都脱到2.0的了,想必我没有必要再讲脱这个老版本的壳了吧!可是当初大菜鸟我在脱它的时候,遇到了一点麻烦,什么麻烦,先卖个关子,。。。呵呵(晕,谁扔的鸡蛋,%¥^&*@@,要扔就扔点硬币噻:-) )。两个月前,e5v 兄弟曾经向我问过如何破解它,其实我哪里会什么算法破解,只不过这个软件过分依赖壳的保护,才让大菜鸟我得了个便宜。时隔这么久,要不是当初e5v的几次问起,的确不好意思作此脱文!
好吧,费话说了一大通,切入正题吧!
老规矩,忽略除内存异常外的所有异常,载入,
00401000 >  68 01A0C600     PUSH MyManage.00C6A001  //停在这里
00401005    C3              RETN
00401006    AA              STOS BYTE PTR ES:[EDI]
00401007    803446 FA       XOR BYTE PTR DS:[ESI+EAX*2],0FA
0040100B    C9              LEAVE

F9运行,按shift+F9在第十六次时来到第一次硬盘指纹出现的地方:
01280260    3100            XOR DWORD PTR DS:[EAX],EAX  //第十六次时来到这里,我们看看堆栈,然后ALT+M, 下内存访问断点
01280262    EB 01           JMP SHORT 01280265
01280264    68 648F0500     PUSH 58F64
01280269    0000            ADD BYTE PTR DS:[EAX],AL
0128026B    00EB            ADD BL,CH

0012D748   01270000
0012D74C   01250000
0012D750   01280038
0012D754   00000000
0012D758   01351E0C  ASCII "0hUeFQCQUXY="  //第十六次时就会看到它,你的机器可能不是这些字符,差不多是类似的,呵呵
0012D75C   00000000
0012D760   00000000

内存镜像,项目 23
 地址=00401000   //就在这里下内存断点了
 大小=0062F000 (6483968.)
 Owner=MyManage 00400000
 区段=
 包含=code
 类型=Imag 01001002
 访问=R
 初始访问=RWE

下断后按shift+F9,中断,先别取消内存断点;
00A2E37C    55              PUSH EBP   //停在这里,F9。
00A2E37D    8BEC            MOV EBP,ESP
00A2E37F    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
00A2E382    A3 C89AA300     MOV DWORD PTR DS:[A39AC8],EAX  //要注意A39AC8,后面的麻烦就是他引起的,此时eax=0127C784。现在暂时不理它
00A2E387    5D              POP EBP
00A2E388    C2 0400         RETN 4



F9若干次后,来到
00A2E290    55              PUSH EBP    //来到这里
00A2E291    8BEC            MOV EBP,ESP
00A2E293    A1 549DA300     MOV EAX,DWORD PTR DS:[A39D54]
00A2E298    8B55 08         MOV EDX,DWORD PTR SS:[EBP+8]
00A2E29B    8910            MOV DWORD PTR DS:[EAX],EDX
00A2E29D    A1 C8AFA300     MOV EAX,DWORD PTR DS:[A3AFC8]
00A2E2A2    8B55 0C         MOV EDX,DWORD PTR SS:[EBP+C]
00A2E2A5    8910            MOV DWORD PTR DS:[EAX],EDX
00A2E2A7    5D              POP EBP
00A2E2A8    C2 0800         RETN 8   //以上几行用F9小心跟,仔细观察每行的数值和堆栈,这几行代码主要是处理使用的次数和日期的。

00A2E280    55              PUSH EBP  //然后再来到这
00A2E281    8BEC            MOV EBP,ESP
00A2E283    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
00A2E286    A3 C49AA300     MOV DWORD PTR DS:[A39AC4],EAX  //这里就要注意了,A39AC4里存放的就是注册名。我们在命令行里输入:dd 00a39ac4。看看内存的值,如下:
00A2E28B    5D              POP EBP
00A2E28C    C2 0400         RETN 4

此时内存的值:
00A39AB8  0000001E  
00A39ABC  0000001E  //以上两行是次数和日期的值,把它们修改一下
00A39AC0  00000000
00A39AC4  00A2E18C  MyManage.00A2E18C   //这里放的是注册名,找个空白的地方,改成你的注册名,我找的是00a3b738,把它的值改成springkang[DFCG]
00A39AC8  0127C784     //这里先不管,回头再收拾它。

经修改后的内存值如下:
00A39AB8  FFFFFFFF
00A39ABC  FFFFFFFF   //实践中好像此不改也行,呵呵。但改了总比不改好!
00A39AC0  00000000
00A39AC4  00A3B738  ASCII "springkang[DFCG]"  //不过这里小心,如果在到达最后一次异常时或入口点,可能会变成了其他的值,再把它改回来就是了。另一种方法就是在入口点处,准备dump前来修改,这样也可靠些!
00A39AC8  0127C784

取消内存断点,shift+F9来到最后一次异常处了:
0135F054    FE01            INC BYTE PTR DS:[ECX]  //来到这里
0135F056  ^ EB E8           JMP SHORT 0135F040
0135F058    98              CWDE
0135F059    BB 00000000     MOV EBX,0
0135F05E    64:8F03         POP DWORD PTR FS:[EBX]
0135F061    5B              POP EBX

ALt+M再次下内存断点,中断后,就停在入口处了,
00A2F6CC    55              PUSH EBP   //没有被偷的代码,太好了!
00A2F6CD    8BEC            MOV EBP,ESP
00A2F6CF    83C4 F4         ADD ESP,-0C
00A2F6D2    B8 B4E3A200     MOV EAX,MyManage.00A2E3B4
00A2F6D7    E8 A8A49DFF     CALL MyManage.00409B84
00A2F6DC    A1 84A2A300     MOV EAX,DWORD PTR DS:[A3A284]

loadpe dump后,再用impr追踪层次一和插件修复,全部有效。
运行出错,^%¥¥%^&@!
好吧,载入出脱壳修复后的程序看看,是什么原因:
发现当运行到下面代码时出错:
00A2F730    FF15 C89AA300   CALL DWORD PTR DS:[A39AC8]  //跟进去看看

0127C784    0007            ADD BYTE PTR DS:[EDI],AL  //跟进后是这样的
0127C786    0000            ADD BYTE PTR DS:[EAX],AL
0127C788    0000            ADD BYTE PTR DS:[EAX],AL
0127C78A    0000            ADD BYTE PTR DS:[EAX],AL
0127C78C    0007            ADD BYTE PTR DS:[EDI],AL
0127C78E    0000            ADD BYTE PTR DS:[EAX],AL
0127C790    0013            ADD BYTE PTR DS:[EBX],DL

我们还是载入原程序看看:

0127C784    833D A8352801 0>CMP DWORD PTR DS:[12835A8],0 //原来是引用了壳中代码,运行不错才怪,要想办法搞定!
0127C78B    74 06           JE SHORT 0127C793  //这行没跳转,估计是没什么用
0127C78D    FF15 A8352801   CALL DWORD PTR DS:[12835A8]  ; MyManage.00A2E2AC   //这行有用 ,但也调用了壳中代码,           
0127C793    C3              RETN    //这个也有用


先小结一下:
看来要修复调用的壳中代码才好办,怎么做?其实OD已经为我们做到了,看
0127C78D    FF15 A8352801   CALL DWORD PTR DS:[12835A8]     ; MyManage.00A2E2AC ,它引用壳中代码,但最终引用的是00A2E2AC的数据,呵呵,这下好办了。
我们在找个空地输入如下代码就行了:
call 00A2E2AC
retn

我是在00A2FFBD这行输入的,输入后如下,然后右键->复制到可执行文件保存:
00A2FFBD      E8 EAE2FFFF   CALL dumped_.00A2E2AC
00A2FFC2      C3            RETN

dd 00a2ffbd看看内存区吧:
00A2FFBD  FFE2EAE8
00A2FFC1  0000C3FF  //这两行数据用得上

现在,代码是修复好了,问题是怎样让出错行00A2F730    FF15 C89AA300   CALL DWORD PTR DS:[A39AC8] 调用00A2FFBD的代码呢?

我在第一次脱它的时候用的方法记不起来了,:-(。
还好我今晚又想到了一个方法:
还记得我在上面说的:“0A2E382    A3 C89AA300     MOV DWORD PTR DS:[A39AC8],EAX  //要注意A39AC8,后面的麻烦就是他引起的,此时eax=0127C784。现在暂时不理它”,以及“00A39AC8  0127C784     //这里先不管,回头再收拾它” 这两句话吗?

对了,我们就是要在dump前,把00A39AC8里的数值改成00A2FFBD,然后再把00A2FFBD 里的值改成 FFE2EAE8
00A2FFC1里的值改成  0000C3FF

此时dump后,用impr修复后,就运行正常了!哈哈,一切OK!
----------------------------------------------------
【总结】
几个月没脱壳了,手都生了!
此文献给 e5v 兄弟!同时感谢他为NSSG论坛提供了空间!
也以此文纪念我学习脱壳一周年吧!
----------------------------------------------------
【版权信息】
版权公有,人权私有。如需转载,注明作者!