rommyjob 发表于 2018-10-23 21:59

初练一个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。

运行,如图,完成!

52lxw 发表于 2018-10-26 21:16


name = "NNNN" 名字必须是大写
s = 0
for i in name:
    s+=ord(i)
print(i^0x5678^0x1234);

zhaoying822 发表于 2018-10-23 22:35

前排占楼,顺便问个问题我手上有个软件为什么有时候用bp exitprocess梦段下来,有时候段不下来。现在试一直断不下来了

dsfdgfdgfhgf 发表于 2018-10-23 23:14

感谢这么好的资源

sosolove 发表于 2018-10-24 09:33

教程贴,支持

破解007 发表于 2018-10-24 10:05

感谢分享

wxjgeorge 发表于 2018-10-24 10:55

ASM的程序,爆破就不好玩了,跟一下算法

wxjgeorge 发表于 2018-10-24 10:56

^_^,长度不够。

xiwangyuanye 发表于 2018-10-24 14:01

Chenbobo 发表于 2018-10-24 14:40

加油。努力

1246369360 发表于 2018-10-24 16:38

支持一下
页: [1] 2 3 4
查看完整版本: 初练一个CrackMe,带分析过程