160个crackme(1)----Acid burn

这160个crackme虽然程序都比较老但是也都比较经典。

附上160个crackme链接: https://pan.baidu.com/s/1jJ2rSb0 密码: 6m8i






第一关        Acid burn




第一步就去掉这个nag,nag的释义是困扰和唠叨,估计大家都不喜欢



我nop了好几次,但是可能找到地方不对,好几次都有问题,这次我试着把调用messagebox的call给nop掉了,但是发现程序无法正常运行,我又看到了程序开始的push 0x0,应该把它也给nop掉,因为call被nop掉后不需要压入参数了,即使是压入无参数的push 0x0也不能有


复制到可执行文件


然后保存就可以了!



第二步:serial/name 和serial




先试试serial/Name这个选项,随便输入序列号和name,显示这个serial错误




点击serial选项,随便输入123456,弹出错误





思路一:

用OD先来试探一下,搜索一下关键词serial





发现了有用的信息




点击follow,跟踪这个字符串




来到了这里


上面的jge和call很可疑!!!

A(above)大于,B(below)小于,E(equal)等于,用于比较无符号数
G(great)大于,L(less than)小于, E(equal)等于,用于比较带符号数


PS:cmp指令后用je; test指令后用jz, 这样子上下文看着比较顺!


所以JGE是大于等于的意思,可能是在这里判断然后决定是fail还是success



在这段程序的开头下断点,输入名字和序列号好点check,跳到我们下断点的地方。








name不管多长都只管前4位字符,而且是按1243的顺序,但是如果字符串长度小于4就会直接fail





这段代码生成了最终的正确的serial,并将它与输入的serial比较。正确的serial是取输入的name的第一个字符,乘以0x29,在乘2,转换为10进制,最后插入“CW-XXXX-CRACKED”的xxxx处。


简单的keygen如下:

#include <iostream>
#include <stdio.h>
#include <iomanip>
#include <windows.h>
using namespace std;

int main()
{
    cout << "Please input name(len > 4):";
    char c = getchar();
    int i = c * 0x29 * 2;
    cout << "serial:"<<"CW-" << setw(4) << i << "-CRACKED"<< endl;
    system("pause");
    return 0;
}









最后还剩一个serial,同样通过字符串查找,下断点




运行分析后发现如下:


可以看到,正确serial是以明文存在的,所以这样就很简单了,找到正确serial就结束了


总结:这个可以搜索字符串,不得不说是走了一条捷径!所以我还看了一下其他大神的博客,有用F12暂停的,有反汇编跟随,还有分析领空的。。。。这里只是提供其中一种思路,终于写完了!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值