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如下:
最后还剩一个serial,同样通过字符串查找,下断点
运行分析后发现如下:
可以看到,正确serial是以明文存在的,所以这样就很简单了,找到正确serial就结束了
总结:这个可以搜索字符串,不得不说是走了一条捷径!所以我还看了一下其他大神的博客,有用F12暂停的,有反汇编跟随,还有分析领空的。。。。这里只是提供其中一种思路,终于写完了!
附上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暂停的,有反汇编跟随,还有分析领空的。。。。这里只是提供其中一种思路,终于写完了!
相关文章推荐
- 160个crackme 001 Acid burn
- 160个CrackMe 001 Acid burn
- [反汇编练习] 160个CrackMe之009
- [反汇编练习] 160个CrackMe之026
- 160个crackme 008 Andrénalin.1
- 160个练手CrackMe-020
- 160个练手CrackMe-028
- 160个练手CrackMe-041
- 160个crackme(4)----ajj.1(CKme.exe)
- [反汇编练习] 160个CrackMe之010
- [反汇编练习] 160个CrackMe之027
- [反汇编练习] 160个CrackMe之001
- 160个crackme 009 Andrénalin.2
- 160个crackme之009
- 160个练手CrackMe-021
- 160个练手CrackMe-029
- 160个练手CrackMe-042
- 160个crackme(5)----ajj.2(CKme.exe)
- [反汇编练习] 160个CrackMe之011
- [反汇编练习] 160个CrackMe之028