////////////////////////////////////////////////////////////////////////////////////////////
文件名称:“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”,呵呵成功了。
////////////////////////////////////////////////////////////////////////////////////////////
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
上传的附件: