赞
踩
写在前面:这篇文章主要是从逆向小白的视角来分析,可能(肯定)有点笨,但是会比较详细的记录和分析。
对于一个文件如何去crack,我认为思路是比操作更重要的,至少有个方向,不然看着满屏的代码头疼。。
上面的按钮、输入框和弹出的窗口一般(暂时是这样)都有文字,可以在模块中搜索,快速定位。
以下是搜索字符串的方法
Ollydbg : 鼠标右键
会进入如图所示的页面(很黑客帝国。。)虽然不能查找但是这里似乎是把所有字符串都列出来了
x64bdg :
x64bdg比较好的就是可以在这个界面进行搜索,很省事
当然,最基本的,两款软件在搜索之前都要先进入正确的模块。
这里以x64bdg为例,详细介绍从观察到定位关键跳转的方法。
首先我们在探索完这个软件后发现在输入错误的序列之后会有一个messagebox提示我们输入错误,如图
那么我们就尝试搜索这个sorry
发现有两个,我们先点开第一个看看(双击进入)
在看到代码后要对跳转指令比较敏感,注意找上面有没有跳转指令
0042FA5A这条很明显就是判断是否输入正确,为了绕过下面的0042FA6F,我们这里可以直接修改成jmp强制跳转
修改之后再点击check,似乎没有绕过,我们继续往下面看好了
看到这里,结合右边的字符串可以很容易知道0042FB03是关键跳转指令,这里可以直接填充nop使得跳转失效
再次运行发现已经成功绕过了:)
本来很激动地完成了,但是在点开吾爱论坛的大佬文章一看,好家伙完全方法不一样,一番学习后有了可以说完全不一样的思路,也就是——
我想这种情况主要适用于没有字符串搜索的时候,毕竟麻烦一点(根据我目前的认知来说)
分析调用堆栈目前来看似乎是使用ollydbg更好一些,在x64bdg上的调用堆栈似乎没有调用函数的说明,如图
不过经过反复对比之后发现其实也无关紧要,所以这里还是拿我熟悉的x64dbg来分析:)
首先我们先运行程序,点击check按钮提示sorry后不要关闭,回到x64dbg点击暂停,然后来到调用堆栈
(根据我目前的经验)从地址比较接近00400100的,所属方为用户的,并且注释是运行的模块的,也就是图中这一条来查看会比较好。原因是这个才是我们程序内部的函数,而不是动态链接库(.dll文件)模块
点进0042A1AE后呢,可以看到上一个函数调用很明显是MessageBoxA,也就是窗口创建的API,那么我们分析一下,程序的执行流程应该怎样的呢?
假如自己写代码的话,程序的流程应该是:
输入数据->判断数据是否有效->调用MessageBoxA返回结果
那么在调用函数的顺序(大概)就是:
主函数->调用判断函数->(返回判断函数)->调用MessageBox函数->(返回MessageBox函数)
所以可以推理出,既然下一步是调用MessageBox函数,那么上一步就是调用判断函数
所以上一步0042FB37很有可能就是关键的判断函数调用了,双击进入
熟悉的界面,通过修改指令就可以完成Crack了
就目前来说,我在分析方面花了很多时间,尤其是在思考函数调用上面,只要明确了函数调用的顺序,其实就很好理解
序列生成,其实就是怎么通过不“抹零”的手段,”合法地“通过认证,也就是我们常见的注册机
首先我们要明确思路,既然要通过验证,那么首先就要找到验证的地方,找到序列号的生成方法
第一步是定位到验证的地方,在这里打下断点,这样我们可以看到参数
很明显可以知道edx存的是用户名,而eax存的是序列号,下面这个call是对比函数,肯定不是生成序列号的地方,我们继续往上面找
序列生成的方法(大概是)有两种,一种是在call调用函数的时候产生,一种则是在主流程中产生,这里是两者的结合
当然分辨的方法很简单(也很笨),就是一行行代码往上读,如果没看到有序列生成就继续往上读(确实很笨)
在这里我们省去一行行代码往上读的过程(如果自己操作建议读一下),直接来到关键生成代码
这里先给一张全景图,再针对细节一点一点分析
首先是看到断点处,ss:[ebp-10]也就是堆栈段的一个参数,通过右边的注释栏我们可以看出存放的是我们输入的name的地址
在详细数据窗口、堆栈窗口和转储窗口都可以看到 0232816C 存放的就是"Please enter your name !"
下面一行有个没见过的指令,这里百度了一下
以防你不清楚:EAX是32位,AX是他的低16位,AH,AL分别是AX的高16位和低16位
0042FA8A | 0FB600 | movzx eax,byte ptr ds:[eax] | eax:"Please enter your name !"
那么这行代码的意思就是把EAX的第一个字节,赋值给EAX
根据转储窗口可以知道,P的ASCII码是00000050
然后这里就把这个值再一番操作存入了ds :[0x431750],再在0042FACD转为了10进制,拼接了另外两个字符串最后得到序列号(因为都是比较麻烦地一行行读代码所以不做过多介绍)
0042FACD | E8 466CFDFF | call <acid burn.sub_406718> |转换为10进制
大功告成!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。