新CrackMe160之016 - fty_crkme3

  1. 脱壳
    使用ESP简单脱壳,过程略

  2. 破解
    OD载入脱壳后程序,搜索界面定位到成功关键词004453D0, 从而得到算法部分为00444B7D ~ 00444DDB,
    如果注册码是9位,其中第3,7位为减号,其它位必须为数字
    00444BEF ~ 00444CFA 将注册码中的数据提取出来转数字, 如1-2-3 => 123
    00444D07 ~ 00444DD7 将每一位数字的位数次方和
    然后将上面两步的结果对比,如果一样就成功了
    如果注册码是10位,其中第3,7位为减号,其它位为数字,也同9位一样,先取出数字与每个数字位数次方和对比
    如果注册码是11位,有点小变化就是第4,8位为减号,其它位为数字,算法也一样转数字与每个数字位数次方和比

7,8,9位数 = 每一位数次方和, 如1234 ?= 1^4 + 2^4 + 3^4 + 4^4, 相等就成功, 是不是只有全0才能满足?
如果不是全0,这个得暴破了吧, 注册机代码如下:

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

  unsigned int addn(char *num);
  unsigned int muln(char *num);
  int getCode(int index, int len, char *code);
  int insertStr(char *code, char chr);
  char crlt[12] = {0};

int main() {
	char code[10] = {0};
	srand((int)time(NULL));
	int rnd = rand() % 3 + 7; //7,8,9
	printf("%d位:\n",rnd);
	int rlt = getCode(0, rnd, code);
	printf("结束"); 
	getchar();
	return 0;
}

  unsigned int addn(char *num){
    unsigned int sum = 0, i;
    for(i=0; i<strlen(num); i++){
      sum = sum * 10;
      sum = sum + num[i]-0x30;
    }
    return sum;
  }

  unsigned int muln(char *num){
    int i, j, len = strlen(num);
    unsigned int sum = 0, tmp;
    for(i=0; i<len; i++){
      if(num[i] == '0') continue;
      tmp = 1;
      for(j=0; j<len; j++){
        tmp = tmp * (num[i] - 0x30);
      }
      sum = sum + tmp;
    }
    return sum;
  }

  int getCode(int index, int len, char *code){
    int i, rlt = 0;
    if(len == index){
      if(addn(code) == muln(code)){
        insertStr(code, '-');
        printf("注册码为: %s\n", crlt);
        return 0;
      }
      return 0;
    }
    char *str = (char *)"0123456789";
    for(i=0; i<10; i++){
      code[index] = str[i];
      rlt = getCode(index+1, len, code);
      if(rlt == 1) return 1;
    }
    return 0;
  }

  int insertStr(char *code, char chr){
    int i, j = 0, len = strlen(code), pos1 = 2, pos2 = 5;
    if(len == 9) { pos1 = 3; pos2 = 6; }
    for(i=0; i<len; i++){
      if((i == pos1) || (i == pos2)) crlt[j++] = chr;
      crlt[j++] = code[i];
    }
    return 0;
  }

7位运行结果:
注册码为: 00-000-00
注册码为: 00-000-01
注册码为: 17-417-25
注册码为: 42-108-18
注册码为: 98-008-17
注册码为: 99-263-15
8位运行结果:
注册码为: 00-000-000
注册码为: 00-000-001
注册码为: 24-678-050
注册码为: 24-678-051
注册码为: 88-593-477
9位运行结果:
注册码为: 000-000-000
注册码为: 000-000-001
注册码为: 146-511-208
注册码为: 472-335-975
注册码为: 534-494-836
注册码为: 912-985-153

 
 
本节高手录制的视频,点击前往查看

 
 
 

使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载

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

posted @ 2024-12-09 17:21  hankerstudio  阅读(1)  评论(0)    收藏  举报