新手破解练习Crackme160之047 - DueList.2
程序是通过文件密钥来验证的,
-
暴力破解, 跳过文件验证, 直接跳到成功处去, OD搜索成功关键字定位到00401205, 第一行改为jmp 00401205, 保存完成~
-
正常破解, 创建文件due-cm2.dat, 运行程序 开始读取文件前70字节
1). 判断是否小于18位
2). 计算字符串中字符是0x1的个数
3). 如果个数小于2个就转到失败
4). 计算字符串中非0x1的个数, 并求和
5). 如果和不等于0x1D5, 跳转失败
6). 从非0x1个数位下一位开始往后比较15位
7). 将每一位非0x1的值 与 第一位开始的值 异或 并存到内存 (这步看似没什么用)
8). 继续下一位 到字符串结束, 如果不是0x1就累加起来,
9). 如果累加值等于0x1b2就成功了
我们就把0x1D5和0x1B2拆成两个字节(多位也是可以的, 只是我们尽量让最终密钥串短一点), 这样, 0x1也最少2位就取2位, 到此, 固定位就去掉6位了, 其中还取了最长15位的异或, 例: 0xEA, 0xEB, 0x01, (1~15位), 0x01, 0xD9, 0xD9 => (觌abcdefghijkl儋), 运行成功了, 看到了注册成功界面中间的用户我是乱码, 应该就是第7).步的了, 说明是有用的, 就是用户名的密文部分, 注册机代码如下: keygen.c
#include <stdio.h>
#include "string.h"
int main(){
while(true){
char user[20] = {20}; //' '
char rlt[22] = {0};
printf("请输入用户名: ");
scanf("%s", user);
int len = strlen(user);
if(len > 15) {
printf("用户名最多15位\n");
continue;
}
rlt[0] = 0xEA;
rlt[1] = 0xEB;
rlt[2] = 0x01;
rlt[18] = 0x01;
rlt[19] = 0xD9;
rlt[20] = 0xD9;
for(int i=0; i<15; i++){
rlt[i+3] = user[i] ^ rlt[i];
if((rlt[i+3] == 0x0) || (rlt[i+3] == 0x1)) { rlt[i+3] = 0x2; } //以免异或后出现0, 1导致算法验证失败
}
printf("系列号为: \n%s => ", rlt);
for(int i=0; i<21; i++){
printf("%X,", rlt[i] & 0xFF);
}
printf("\n");
}
return 0;
}
其中异或部分强制=0x2是为了程序能正常执行, 如果我们输入的用户名密文中出现0, 1, 那就会导致前面分析的步骤中途就异常失败了, 虽然再次异或出来的结果与原输入不一样了, 但程序还是正常运行的, 而且还是小概率事件, 所以这里优先保证程序正常显示错误先忽略, 毕竟只是注册机, 能注册成功即可,
1~160每个破解过程,在吾爱破解论坛都有高手破解过了,也有整理好现成的, 我这边主要就是自己动手操作的过程,与他们的不太一样
附上高手们的连接: 点击前往查看
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载
新人入门教程"玩玩破解,写给新人看" 点击前往查看
我就是从这里开始的,对我这样的小白感觉超级友好~
下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~


浙公网安备 33010602011771号