新手破解练习Crackme160之136 - Rith.1

VC++写的程序, 直接载入OD, 按钮事件无提示, 搜索界面看到成功关键词, 定位到00401639, 向上找到入口00401580, 下断点, 输入伪码, F8单步调试分析算法, 0040159E处有一固定串"31415926535897932384", 先记录, 004015BC处取得用户名和长度, 长度得5位以上, 20位以内, 系列号长度与用户一致, 接着便循环对比每一位运算后是否相等~ 这里的用户名不可以随意输入, 因为与固定串对应位置的值mod后值为0的话就会生成不可见字符, 所以写个递归程序自动判断~

#include <stdio.h>
#include <string.h>

int chkCode(char* user);
int getUser(int index, int len, char *user);

int main() {
	char user[21] = {0};
	int rlt = getUser(0, 5, user);
    printf("结束\n");
    
	getchar();getchar();
	return 0;
}

int chkCode(char* user) {
	char code[21] = {0};
	char *str = "31415926535897932384";
	int tmp = 0, s = 1;
	int len = strlen(user); 
	for(int i=0; i<len; i++){
		tmp = user[i] % str[i];
		tmp = tmp << 1;
		if(tmp > 0x7B) { tmp -= 0x1A; }
		if(tmp < 0x41) { tmp = 0x82 - tmp; }
		if((tmp > 0x5B) && (tmp < 0x61)){ tmp = tmp % 0xA + 0x30; }
		if(tmp < 0x20 || tmp > 0x7E){ //保证为可见字符
			s = 0;
			break;
		}
		code[i] = tmp;
	}
	if(s == 1){
		printf("用户名: %s\n系列号: %s\n\n", user, code);
		return 1; 
	}
	return 0;
 }
 
int getUser(int index, int len, char *user){
	int rlt = 0;
	if(index == len){
		rlt = chkCode(user);
		return rlt; // 这里返回0就可以输入所有
	}
	for(int i=0x41; i<0x5B; i++){
		user[index] = (char) i;
		rlt = getUser(index+1, len, user);
		if(rlt == 1) return 1;
	}
	return 0;
}

运行示例:
用户名: AAAAA
系列号: fbhbj

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

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

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

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

posted @ 2024-08-04 17:31  hankerstudio  阅读(13)  评论(0)    收藏  举报