初练一个CrackMe,带分析过程
初练一个CM,比较简单,无壳,借以熟悉OllyDBG操作。高手可从此处略过。第一步:查壳,获取编程的语言。
拿到后,首先查壳,查壳方法有多种,这里用PEID。
这里我们看出无壳,且直接识别出来了是GUI程序,并且得到了编写的语言是汇编。
启动OllyDBG论坛专用版,F2载入。如图:
通过观察入口点,如果熟悉Win32窗口程序编程的话,可以一眼看出,图中是在调用一系列的API,目的是注册窗口类,以便创建窗口。没有VC,Delphi等的入口点特征,佐证了PEID的查证结果。
第二步:获取破解的入手点。
F9运行程序,如图:
点击Help->Register按钮,弹出注册窗口,如图:
由于我们不知道名字和序列号,随便输入点,点击OK。此时弹出:
哈哈,Not lucky!失败了。不过这个就是我们的入手点了。这里要说明下,接下来有很多种手段来入手。
第一种:从这几个错误提示信息入手,检索该模块的文字引用,然后找到该错误框提示的位置,观察上下文,爆破。
第二种:由于是汇编代码编写的,没有壳,规模又比较小,可以从反汇编明确看出它调用了MessageBox API,那么给该API下BP断点。然后F2重新载入,运行断下来之后,观察堆栈,确定弹出位置,再观察上下文,爆破。
第三种:在Dump窗口,搜索No luck字符串,如图:
确定搜索后,找到结果位置,如图:
然后下内存访问断点,看看到底哪个代码试图访问该内存区,断下来后,观察上下文,爆破。
第四种:从dll的区段入手,我们知道,MessageBox是user32.dll的导出函数,那么该程序要想调用MessageBox,那么必须访问该dll内存。因此,在该区段的内存区下内存访问断点,如图:
第三步:爆破。
找到入手点后,分析上下代码,如图:
我们可以看到,错误提示框,是在00401362/$6A 00 push 0x0 ; /BeepType = MB_OK
在提示窗口,可以看到本地调用来自 00401245,也就是说起始点为00401245的函数,调用了该错误框,那么爆破的关键点,就在00401245函数里!跟随过去,如图:
可以看到,00401243 /74 07 je short CRACKME.0040124C,这里有一个判断跳转,跳转的目的地是0040124C > \E8 FC000000 call CRACKME.0040134D,
这一句的功能是调用子函数0040134D,我们Enter预览内容,发现其正好是成功提示,如图:
按下减号退出预览。那么分析到这里,爆破就很简单了,直接将00401243 /74 07 je short CRACKME.0040124C的 je修改为相反的jne即可。选中该行指令,按下空格,
点击汇编,确定返回,如图:
右键,复制到可执行文件,将内存中的指令修改,应用的文件的offset中去,使其永久生效。另存成CrackMe_done.exe。
运行,如图,完成!
name = "NNNN" 名字必须是大写
s = 0
for i in name:
s+=ord(i)
print(i^0x5678^0x1234); 前排占楼,顺便问个问题我手上有个软件为什么有时候用bp exitprocess梦段下来,有时候段不下来。现在试一直断不下来了 感谢这么好的资源 教程贴,支持 感谢分享 ASM的程序,爆破就不好玩了,跟一下算法 ^_^,长度不够。 加油。努力 支持一下