新手破解练习Crackme160之047 - DueList.2

程序是通过文件密钥来验证的,

  1. 暴力破解, 跳过文件验证, 直接跳到成功处去, OD搜索成功关键字定位到00401205, 第一行改为jmp 00401205, 保存完成~

  2. 正常破解, 创建文件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, 那就会导致前面分析的步骤中途就异常失败了, 虽然再次异或出来的结果与原输入不一样了, 但程序还是正常运行的, 而且还是小概率事件, 所以这里优先保证程序正常显示错误先忽略, 毕竟只是注册机, 能注册成功即可,

这是160个软件part1
这是160个软件part2

1~160每个破解过程,在吾爱破解论坛都有高手破解过了,也有整理好现成的, 我这边主要就是自己动手操作的过程,与他们的不太一样
附上高手们的连接: 点击前往查看
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载

新人入门教程"玩玩破解,写给新人看" 点击前往查看
我就是从这里开始的,对我这样的小白感觉超级友好~

下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~
OD界面布局

posted @ 2024-05-10 17:10  hankerstudio  阅读(27)  评论(0)    收藏  举报