您的位置:首页 > 其它

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

2018-01-29 22:40 225 查看
这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暂停的,有反汇编跟随,还有分析领空的。。。。这里只是提供其中一种思路,终于写完了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  逆向 crackme