新手破解练习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
1~160每个破解过程,在吾爱破解论坛都有高手破解过了,也有整理好现成的, 我这边主要就是自己动手操作的过程,与他们的不太一样
附上高手们的连接: 点击前往查看
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载
新人入门教程"玩玩破解,写给新人看" 点击前往查看
我就是从这里开始的,对我这样的小白感觉超级友好~
下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~


浙公网安备 33010602011771号