对于160个CrackMe之23的分析
2016-05-06 08:36
267 查看
对于此文件夹中的CrackMe的分析,程序使用masm所写,无壳,使用f(用户名,注册码)=0的方式检验
因为其中主要用的的操作是加法和异或操作,故可以由用户名逆推注册码
注册算法如下:
第一步:程序对于输入的用户名进行检验,如果大于等于20位,不操作,小于20位,用0填充到20位
第二步:程序将注册码转换为十进制数temp,
第三步:这是一个执行16次的大循环,初始值temp为上一步的结果,对于每一次循环有用户名的四个字符参与操作(如用户名的为“goodjob”的话,则第一次参与的操作数就为0x646F6F67(doog),第二次参与的操作数为0x6A646F6F(jdoo))与temp进行加1后的结果进行异或操作后赋值给temp,一直执行16次,得到最后的temp。
第四步:temp加上0x9112478等于0时,则注册成功,不相等失败
逆向算法如下:
见下面代码*/
因为其中主要用的的操作是加法和异或操作,故可以由用户名逆推注册码
注册算法如下:
第一步:程序对于输入的用户名进行检验,如果大于等于20位,不操作,小于20位,用0填充到20位
第二步:程序将注册码转换为十进制数temp,
第三步:这是一个执行16次的大循环,初始值temp为上一步的结果,对于每一次循环有用户名的四个字符参与操作(如用户名的为“goodjob”的话,则第一次参与的操作数就为0x646F6F67(doog),第二次参与的操作数为0x6A646F6F(jdoo))与temp进行加1后的结果进行异或操作后赋值给temp,一直执行16次,得到最后的temp。
第四步:temp加上0x9112478等于0时,则注册成功,不相等失败
逆向算法如下:
见下面代码*/
#include<stdio.h> #include<string.h> int main() { char name[128] = {0}; unsigned long temp = 0x9112478; temp = 0 - temp; printf("输入用户名:"); scanf("%s", name); for(int i=15; i>=0; i--) { unsigned long a=0; for(int j=3+i; j>=i; j--) { a = a << 8; a += name[j]; } temp = temp ^ a; temp = temp - 1; } printf("注册码为:%lu", temp); return 0; }
相关文章推荐
- OD破解Crackme1.exe密码
- 硬编码序列号追踪-CrackMe系列1
- 菜鸟逆袭 CrackMe第一弹
- OD断点分类
- PEDIY Crackme 竞赛 2007---第一回
- Easy_CrackMe练习
- 逆向入门--简单win32CK逆向手记
- 160个练手CrackMe-052
- 160个练手CrackMe-051
- 160个练手CrackMe-050
- 160个练手CrackMe-049
- 160个练手CrackMe-048
- 160个练手CrackMe-047
- 160个练手CrackMe-046
- 160个练手CrackMe-045
- 160个练手CrackMe-044
- 160个练手CrackMe-043
- 160个练手CrackMe-042
- 160个练手CrackMe-041
- 160个练手CrackMe-040