[逆向学习1]CRACK_ME_ACID_BURN

1.窗口去除
1.1首先通过peid查看目标文件是否加壳,结果显示
image

没有加壳
1.2查看程序尝试获取提示,比如字符串
首先打开文件后有一个NAG弹窗,尝试去除这个弹窗
image

1.3然后将程序拖入ollyDbg
1.4搜索字符串
定位到这个位置
image

发现会在这个位置将这个字符串复制给edx寄存器
然后调用另一个函数,0042a170
进入到对应位置看看对应函数是怎么实现的
1.5可以看到调用了messageBoxA,来弹出窗口
image

所以在开头处设置断点,然后之后F8一步一步调试
观察到这里有getactivewindow和setactivewindow两个函数,查询这两个函数的作用
结合messageBoxA
知道是总共做了三件事
· 获取当前窗口(作为父窗口)
· 弹一个 MessageBox(可能是提示)
· 再把原窗口设回活动窗口(避免焦点丢失)
所以如果只是想要不弹出弹窗的话,我考虑了两个方案
其一,修改42A19F处为jmp 42A1AE,跳过调用messageBoxA
image

其二,考虑使用nop空操作,修改为nop空操作
42A1A9处的操作占用了5个字节,所以需要将五个字节的机器码都修改为NOP的机器码,也就是90,让它不调用函数
image
image

之后运行程序发现确实没有第一个NAG弹窗了

2破解序列号/用户名
2.1点击后随便输入序列号和用户名
image

显示
image

所以打算搜一下这个字符串
2.2回到OllyDbg进行字符串搜索
image

发现在这个位置
2.3然后发现距离之前在1中讨论过的弹窗函数调用很近,说明这时是在往messageBoxA里面压参数
image

2.4所以考虑这个函数调用之前,会对我输入的用户名和序列号进行判断,所以上拉观察
image

发现会对eax中的值和4进行比较,如果eax中的值大于等于4,则跳转到42FA79否则跳转到之后的incorrect弹窗
到这个时候自己猜测,应该是对于用户名的长度有要求,如果大于等于4才进行动态的序列码生成,否则直接走报错弹窗分支
2.5所以看看42F479在干什么
42Fa79
image

观察到之后也是类似的参数赋值操作,所以跟到41AA58,看看这个位置是在干什么。
2.6跟进之后发现还调用了几个函数
image

41AA08和403754和41aa18
2.7然后之后尝试随便输入用户名和序列号
观察到堆栈区这里出![image]
现了四个字符串
image
第一个4018不明所以
第二个和第三个恰好是我输入的内容
而第四个字符串很明显看着就是序列号的格式
所以尝试输入该序列号
2.8成功
image

3.0破解序列号
3.1还是搜索字符串
之前尝试输入序列号,发现弹窗
image

所以搜索字符串,然后往上找判断语句
image

结果如上
3.2一样的,猜测在压入try again这个字符串之前有对于字符串的判断逻辑
所以往上翻
image

发现一个jnz,会对zf标志位进行判断,如果不为0,则报错,否则执行下面的验证成功弹窗。
那么这说明之前调用的4039FC很可能会进行判断修改zf标志位
3.3所以跟进4039FC
发现是一段很长的代码
image

分析这段代码,发现是一个字符串比较函数,结合之前的分支结构,写出伪代码为
if (strcmp(s1, s2) != 0)
失败;
else
成功;
3.4观察之前的汇编代码,发现会比较eax和edx指向的字符串,那么在调用该字符串比较函数之前,eax和edx被赋值为多少呢?
所以回到之前调用4039FC的地方
在那个位置设置断点,之后打算观察寄存器的值
看进行到调用4039FC处字符串判断之前,字符串为多少。
3.5输入用户名
image

3.6发现eax为我输入的内容,edx为一个固定的字符串
image
无论你输入什么字符,都是在和hello dude!进行比较

4编写生成机
4.1
4.2第二个纯序列号生成机
其实就是Hello Dude!

posted @ 2026-04-01 22:27  绅cc  阅读(2)  评论(1)    收藏  举报