首页
社区
课程
招聘
[原创]“hackme”程序的分析破解报告
发表于: 2008-1-6 19:44 4810

[原创]“hackme”程序的分析破解报告

2008-1-6 19:44
4810
////////////////////////////////////////////////////////////////////////////////////////////
文件名称:“hackme”程序的分析破解报告
目标程序:“hackme”破解联系程序
操作环境:Windows XP-SP2
使用工具:Ollydbg 1.10版
编写作者:Coderui
编写时间:2007年04月19日
联系方式:coderui@163.com
作者博客:http://hi.baidu.com/coderui

---------------------------------------------------------------------------------------------
引言:因为是初次分析这样的程序,所以把整个分析过程都记录下来。这篇分析报告对我将来的发展有着重大的意思,保存下来以备今后翻阅回忆。
---------------------------------------------------------------------------------------------

第一步:整体分析

1:用杀毒软件扫一下:可以初步了解是否是恶意程序,是否被捆绑恶意程序。
2:程序名称:hackme.exe。
3:程序大小:8.98KB ,感觉被加压缩壳了,因为程序很小。
4:程序图标:是VC++ MFC编译后默认的图标。
5:使用PeiD查壳:但显示是“Nothing found *”,连接程序版本是:2.0。
6:EP区段:nsp ,首字节: 9C,60,E8,00 。

总结:拿到程序后需要先简单整体分析一下,对后边分析会带来好处。根据上边的6个简单分析结果后推测,程序加了一个PeiD查不到的壳,程序应该是VC++写的,加的是压缩壳,根据EP区段:nsp,首字节: 9C,60,E8,00都是北斗压缩壳的特征。应该就是加的nspack 北斗压缩壳2.0版的壳。

第二步:脱壳过程

打开OD,手脱。
00408ABB >  9C                     pushfd               ;看这里特征很像北斗的壳  F8
00408ABC    60                      pushad               ;F8
00408ABD    E8 00000000         call  hackme.00408AC2 ;两下F8后到了这里 看ESP
                                                 ;命令:hr 0012FFA0   回车
                                                 ;下硬件断点是脱压缩壳的一个定律,再F8

00408AC2    5D                     pop     ebp             ;跳到了这 再F9
00408AC3   83ED 07               sub     ebp, 7

00408D2C    9D                     popfd                  ;F9后到了这里 F8
00408D2D  - E9 F0E2FFFF     JMP hackme.00407022    ;跳到了这里 终于搞定了 再F8大跳
00408D32  8BB5 EDFDFFFF  MOV ESI,DWORD PTR SS:[EBP-213]

总结:按照别人的资料应该到这里脱壳完成,可以抓取内存映像了,用 OLLYDUMP 这个插件脱壳保存文件程序。但是我F8大跳后到这里后,显示汇编代码(如下图1)真奇怪了。来到的是数据段,但经过测试,下边应该是代码段才对,因为里边都是可以执行的代码。使用 OLLYDUMP脱壳保存的文件运行失败,使用ImportREC在当前试着修复输入表,结果提示OEP入口点不对。因为时间紧,不能死专牛角尖,既然目前脱不了就先放放,采用其它简单方法破解程序吧,一会回头再来分析脱壳,可能会有好的效果。

第三步:破解程序

说明:根据经验这个程序可以先运行,然后使用OD加载要破解的程序的进程来分析,这样可以免去脱壳的麻烦,不过这种方法只适合破解,如果用在分析木马和病毒上是不行的。

步骤:

1:首先运行程序hackme.exe,试注册一下得到标题为“Error”内容为“Sorry, just try again”的提示,根据特征可以从这里下手。
2:然后运行OD,从[文件->附加]中选择hackme.exe进行附加,再使用[查看->使用模块]来选择hackme.exe进行打开。
3:在汇编代码中点右键使用OD插件[超级字串参考->查找ASCII码]来获取这个程序中的有用关键字串(如下图2),在“sorry, just try again”上双击来到如下代码段:
00401452    68 20304000     PUSH hackme.00403020             ; sorry, just try again
分析了下这段代码附近的汇编代码,选择在如下代码段下普通断点[ F2]。
004013CA    FF15 A4214000   CALL DWORD PTR DS:[4021A4]   ; msvcrt.sscanf
也可以使用条件断点(当鼠标点下按钮或放开按钮的时候)来进行下断,如“[[ESP+4]+4]==WM_LBUTTONUP&&[[ESP+4]+4]==001E08E2”,其中需要的按钮句柄在OD的窗口查看中可以查找到,注意每启动一次程序句柄都是会变的。
4:下断完成后在DO中F9运行程序(如果程序在DO中先运行了再进行字串参考->查找OD会崩溃,呵呵),随意输入一个注册码,为更好分析使用“11111111111111111111”注册码。点ENTER按钮后OD把程序断下了,单步[F8]+[F7]跟一遍没发现KEY的明文,也没有大跳到正确提示地址的跳转指令,看来只能从逆推算法来下手了。得到了如下的加密算法:

004013C3    50                      PUSH EAX
004013C4    68 64304000     PUSH hackme.00403064                           ; %x
004013C9    51                      PUSH ECX
004013CA    FF15 A4214000   CALL DWORD PTR DS:[4021A4]       ; msvcrt.sscanf
004013D0    8B4C24 14       MOV ECX,DWORD PTR SS:[ESP+14]
004013D4    BF 03000000     MOV EDI,3                                               ; 首先要能整除3
004013D9    8BC1                  MOV EAX,ECX
004013DB    83C4 0C            ADD ESP,0C
004013DE    99                      CDQ                                                           ; cdq指令会把EAX中的符号位扩展到EDX中
004013DF    F7FF                 IDIV EDI                                                     ; IDIV是有符号整除
004013E1    85D2                  TEST EDX,EDX
004013E3    75 66                  JNZ SHORT hackme.0040144B
004013E5    8BC1                 MOV EAX,ECX
004013E7    BF 05000000     MOV EDI,5                                                 ; 第二段是要整除5
004013EC    99                      CDQ
004013ED    F7FF                 IDIV EDI
004013EF    85D2                 TEST EDX,EDX
004013F1    75 58                 JNZ SHORT hackme.0040144B
004013F3    8BC1                 MOV EAX,ECX
004013F5    BF 07000000     MOV EDI,7                                                 ; 第三段是要整除7
004013FA    99                      CDQ
004013FB    F7FF                  IDIV EDI
004013FD    85D2                 TEST EDX,EDX
004013FF    75 4A                 JNZ SHORT hackme.0040144B
00401401    8BC1                  MOV EAX,ECX
00401403    BF 0B000000     MOV EDI,0B                                              ; 第四段是要整除11
00401408    99                       CDQ
00401409    F7FF                   IDIV EDI
0040140B    85D2                  TEST EDX,EDX
0040140D    75 3C                 JNZ SHORT hackme.0040144B
0040140F    8BC1                  MOV EAX,ECX
00401411    BF 0D000000     MOV EDI,0D                                              ; 第五段是要整除13
00401416    99                       CDQ
00401417    F7FF                   IDIV EDI
00401419    85D2                   TEST EDX,EDX
0040141B    75 2E                  JNZ SHORT hackme.0040144B
0040141D    8BC1                  MOV EAX,ECX
0040141F    B9 11000000      MOV ECX,11                                           ; 第六段是要整除17
00401424    99                       CDQ
00401425    F7F9                   IDIV ECX
00401427    85D2                   TEST EDX,EDX
00401429    75 20                  JNZ SHORT hackme.0040144B
0040142B    52                       PUSH EDX
0040142C    68 5C304000     PUSH hackme.0040305C      ; thanks
00401431    68 40304000      PUSH hackme.00403040       ; congratulations, you passed
00401436    52                       PUSH EDX

分析了下这个简单的算法,想得到KEY需要使用逆推的方法去实现,第一步需要做的是将“3、5、7、11、13、17”6个数相成,得到255255这个数,他就可以成功的使上边汇编代码中的所有JNZ失效,从而透过过滤来到正确的提示“congratulations, you passed”处。因为前边程序把我们输入的字符串通过sscanf给格式化了,所以需要我们把十进制“255255”转换为十六进制“3E517”才可以。5:把所有调试程序关闭,重新运行起hackme,输入“3E517”,然后ENTER,提示“Congratulations, you passed”,呵呵成功了。
////////////////////////////////////////////////////////////////////////////////////////////

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
帖子被搬家了,呵呵。
2008-1-7 15:49
0
雪    币: 50161
活跃值: (20625)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
感觉问题不是太深入,放新兵论坛可能合适些。另外,还不太明白你所说的hackme是什么?一个共享软件?
2008-1-7 21:29
0
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
4
hackme程序只是个简单的练习程序,适合新手,呵呵。
确实没深度的,是我刚接触破解时写的文章,目前是刚转载来的,呵呵。
OK,我把例子程序上传上来了,呵呵。
2008-1-8 11:33
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
很通俗易懂。感谢!~~~

麻烦楼主把“一定要转为16进制”处详细点说明好吗?偶思考不得~~
2008-5-29 15:10
0
雪    币: 288
活跃值: (53)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
6
这个是我在刚学破解时写的,写的很菜,将就着看吧,呵呵。

“一定要转为16进制”。因为程序内部是以10进制进行运算的,但程序在运算前要先把您输入的数据转换成10进制。所以为了运算顺利,您就需要把十进制“255255”转换为十六进制“3E517”再输入,这样就验证正确了。

这么老的帖子您也可以挖出来???呵呵,强!谢谢支持哦!
2008-5-29 22:14
0
游客
登录 | 注册 方可回帖
返回
//