好友
阅读权限20
听众
最后登录1970-1-1
|
本帖最后由 葫芦娃很厉害 于 2019-2-2 09:47 编辑
【流程】
我这两天在搞新手教程,发现CrackMe005似乎都是半破状态,虽然这个CrackMe确实有点故意恶搞,但是还是接招吧!当作来吾爱破解的第一篇文章吧!
先说如何按照CrackMe作者的要求,完全通过逆向分析来注册成功的办法
【对原程序的改动说明】
1.脱了壳(手脱或peid脱,492K大小的那个版本,感觉脱的不好,很多内容稍微有点错位,有高人知道为啥的请指点)
2.用upx专用脱壳脱后,448K大小的版本,反汇编分析的比较准确
3.改动了要求的X盘盘符为C,为了方便
4.其他均为改动,均为作者原意
【注册成功动图】
【注册步骤】
1.复制目录下ok.txt,到C:\ajj.126.c0m\j\o\j\o\ok.txt,这里我给原版的X盘改成C盘了,不然就改分区。
2.这时就应该可以显示出Edit2文本框,但是是禁用状态。
3.右键点击5次注册按钮(注意是右键)。
4.左键双击图框区空白处(不能点着图),Edit2文本框禁用解除。
5.用户名输入ajj
6.Edit2文本框内输入1_345,78后左键双击Edit2输入框中任何位置。
7.在图片是“性相近”的时候,鼠标从软件框右下脚移入软件框内。
8.在图片是“性本善”的时候,鼠标从软件框左下角移入软件框内。
9.这时候应该label3显示出数字,是0,1,2,3这四个当中的其中一个。
10.将数字输入我写的注册机,点击生成最后一步的点击方案。
11.按照方案点击图案,注册成功
【说明】
破文,逆向过程有空了补发,先发方法和注册机和源码,喜欢的玩把
源码中,我求的是点击次数总和最小的方法,因为其实有很多组合,只求效率最高的方法,源码写的比较臃肿,为的是新手好读懂
【源码】
[C++] 纯文本查看 复制代码 void CCM005Dlg::OnOK()
{
// TODO: Add extra validation here
//CDialog::OnOK();
char szKey[1024]={0};
int n = 0;
GetDlgItemText(IDC_EDIT1,szKey,1024);
if(!strlen(szKey))
{
MessageBox("请按照【前期步骤】获取正确数值后再生成方案!","友情提示");
return;
}
n = GetDlgItemInt(IDC_EDIT1);
switch(n){
case 1 :
n=0x3D;
break;
case 2 :
n=0x34;
break;
case 3 :
n=0xDF;
break;
default : // 可选的
n=0x41;
}
//sprintf(szKey,"%d",n);
//SetDlgItemText(IDC_EDIT2,szKey);
struct image
{
char szname[7];
int nNumber ;
int nLef;
int nRight;
};
image aImage[4]={0};
sprintf(aImage[0].szname,"人之初");
aImage[0].nNumber = 1;
aImage[0].nLef = 0x2;
aImage[0].nRight = 0x11;
sprintf(aImage[1].szname,"性本善");
aImage[1].nNumber = 2;
aImage[1].nLef = 0x3;
aImage[1].nRight = 0x13;
sprintf(aImage[2].szname,"性相近");
aImage[2].nNumber = 3;
aImage[2].nLef = 0x5;
aImage[2].nRight = 0x17;
sprintf(aImage[3].szname,"习相远");
aImage[3].nNumber = 4;
aImage[3].nLef = 0x7;
aImage[3].nRight = 0x1B;
/************************************************************************/
/* 设计原则,选择出点击次数最少的方案
/* iR作为大数数组下标,iL作为小数数组下标,j大数商,k小数商,求i+j最小值
/************************************************************************/
int nRes = 112;
int nIL = 0;
int nIR = 0;
int nJ = 0;
int nK =0 ;
for (int iL=0;iL<4;iL++)
{
for (int iR=0;iR < 4;iR++)
{
for (int j=1;j<=14;j++)
{
for (int k =0;k<=112;k++)
{
if ((aImage[iR].nRight*j + aImage[iL].nLef*k == n) && (nRes> j+k))
{
nIL = iL;
nIR = iR;
nJ = j;
nK = k;
nRes = j+k ;
}
}
}
}
}
sprintf(szKey,"在“%s”图片时左键点击图片%d次\r\n\r\n在“%s”图片时右键点击图片%d次\r\n\r\n即可注册成功!",aImage[nIL].szname,nK,aImage[nIR].szname,nJ);
SetDlgItemText(IDC_EDIT2,szKey);
}
【逆向分析过程】
一.DedeDark梳理事件、控件信息
二.动态分析1.根据字符串定位总判断位置字符串“注册了”,“厉害厉害真佩服”入手,定位发现是timer2事件函数,五个判断不停的判断,如图
可以看到判断跟6个值有关,分别是[ebx+304]、[ebx+308]、[ebx+310]、[ebx+318]、[ebx+314]、[ebx+31C],我们下文所有就对其简称做304、308、310、318、314、31C
2.逐个判断层层分析
我们从简单往复杂,并结合他们之间内在的逻辑先后顺序,去逐个分析,顺序分别是31C、304、308、310、314和318,其中最难的是310,方法是常量跟踪法,即在OD中点击 查找→所有常量 ,看看都那些地方对这些值有操作
- 总判断目标:31C值,不能等于0x3E7
- 相关事件函数:Button1Click
- 最终逆向分析结论:Buton1Click事件不能被触发,否则31C就会被赋值0x3E7,即不能点击注册按钮,这里需要注意click事件和mousedown事件,click必须是一个按下和抬起的全过程,而且鼠标位置都在按钮控件范围内,而mousedwon事件按下就是
- 具体逆向分析过程如下
所有常量查找结果,如下
反汇编代码如下
呵呵就一行,确实简单吧
- 总判断目标:304值,不能等于0xC34
- 相关事件函数:FormCreat
- 最终逆向分析结论:FormCreat生成表单的事件函数中,会对一个固定路径检查是否有合规内容的合规文件,有则,显示出隐藏的Edit2控件
- 具体逆向分析过程如下
所有常量查找结果,如下
反汇编代码如下
注意:我这里已经把,CrackMe开发者要求的X盘符改为了C盘符,为的是方便
- 总判断目标:308值,不能等于0x230D
- 相关事件函数:Button1MouseDown、Panel1DblClick
- 最终逆向分析结论:308初始值是由FormCreat函数初始化为0x28E,在Button1MouseDown事件中,右键一次则308值增加0x3,最终目标是0x29D,因为等于0x29D后,Panel1DblClick事件就可以解禁Edit2控件,则0x29D减去0x28E再除以0x3最后结果等于5,即右键点击注册按钮5次,再去双击panel1控件没有图的地方,就可以解禁Edit2控件
- 具体逆向分析过程如下
所有常量查找结果,如下
反汇编代码如下
- 总判断目标:310值,必须等于0xF94
- 相关事件函数:FormMouseMove、Edit2DblClick
- 最终逆向分析结论:310的值要想最终被赋值0xF94,必须完成三重判断,第一个是当控件ID是0xE20时,即是image3"性相近"的时候,FormMouseMove捕捉的XY坐标都足够大,即右下脚,满足则310被赋值0x10,第二个是当控件ID是0x2DC时,即image2"性本善"的时候,FormMouseMove捕捉的X坐标足够小、Y坐标足够大,第三个是,30C不能等于初始值0x9, 30C被赋值的条件是Edit2中的字符串长度是8位,且第二位是"_",第6位是"," ,我们写1_345,78是符合要求的,同时要求用户名长度是3的整数倍,然后左键双击Edit2控件,即可给30C赋值,具体赋值结果又跟你的磁盘剩余空间有关。当上面这一系列嵌套判断都合规后,则完成310赋值0xF94,同时若是用户名是"ajj",则显示隐藏控件ID是0x2FC的Label3,显示值是30C
- 具体逆向分析过程如下
310所有常量查找结果,如下
310反汇编代码如下
发现嵌套30C,那么继续常量查找30C,如下
30C反汇编代码如下
这里其实是这个crackme最难的地方了,其实逻辑并不复杂,需要耐性和记录给理清晰即可
- 总判断目标:314的值等于318的值
- 相关事件函数:image1~4MouseDown
- 最终逆向分析结论:其实314的值在上一个流程中已经赋值完毕,314的值取决于30C的值,30C分别是0、1、2、3的时候,314分别是0x41、0x3D、0x34、0xDF,而318的值,则是点击1~4幅图片,区分左右键,分别自增不同的数值,具体如下方图片,最终要求318的值等于314的值
- 具体逆向分析过程如下
所有常量314查找结果,如下
314反汇编代码如下
318所有常量查找结果,如图
至此,如下图timer2所有的总判断全部过关,所以timer2每次触发,都将走注册成功的流程,是不是感觉很刺激,跃跃欲试的,去网盘中下载,去折磨自己的吧
附件链接
链接: https://pan.baidu.com/s/19exdO4eGSQ6kD7yC8CjsUA 提取码: cf4q |
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|