新CrackMe160之156 - Olivers - crackme
delphi写的程序,使用IDR查看源码可知按钮入口为00430C58, 下好断点,开始分析算法
00430CF1 ~ 00430D20 将用户名倒序得user1
00430D29 ~ 00430D69 将用户user与倒序用户名user1前5位分别取出来连起来得str1
00430D7A ~ 00430DD2 将str1第2位到倒数第2位的每一位重复一下连起来得到str2
00430DE3 ~ 00430E09 将str2最后一位前所有位字符转数字再转字符连起来得str3
00430E1D ~ 00430E3D 从str3中间隔3位取一位连起来(共取15位)得str4
00430E46 ~ 00430EAB str4与str3的第4位开始每位相减的绝对值连起来得到正确系列号rlt
00430EB3 rlt与输入系列号对比
注册机:
#include <stdio.h>
#include <string.h>
int main() {
int i, lenu, len, lens;
char user[30] = {0};
char user1[30] = {0};
char str1[26] = {0}; //不会超过25位 5个字符+5个数字(每个不超过3位数) <= 5+5*3 <= 25
char str2[51] = {0}; //重复后不会超过50位
char str3[51] = {0}; //只需要前45位
char str4[16] = {0};
char rlt[16] = {0};
printf("用户名: "); scanf("%s", user); getchar();
lenu = strlen(user);
if(lenu < 6) {
printf("用户名6位以上");
getchar();return;
}
for(i=0; i<lenu; i++){ //倒序
user1[i] = user[lenu-1-i];
}
len = 0;
for(i=0; i<5; i++){ //分别取5位连起来
sprintf(str1+len, "%c%d", user[i], user1[i]);
len = strlen(str1);
}
lens = 0;
for(i=1; i<len-1; i++){ //重复每一位
sprintf(str2+lens, "%c%c", str1[i], str1[i]);
lens += 2;
}
len = 0;
for(i=0; i<lens-1; i++){ //转数字
sprintf(str3+len, "%d", str2[i]);
len = strlen(str3);
if(len >= 45) break; //后面的用不上了
}
for(i=0; i<15; i++){
str4[i] = str3[(i+1) * 3 - 1]; //间隔3取15位
len = str4[i] - str3[lenu-2+i]; //两串相减
if(len < 0) len *= -1;
rlt[i] = len + 0x30;
}
printf("系列号: %s\n", rlt);
getchar();
return 0;
}
运行示例:
用户名: ocrackme
系列号: 000050514830011
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载
下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~


浙公网安备 33010602011771号