新CrackMe160之116 - REM - KeyGenME#10

  1. 脱壳
    使用OD的ESP定律轻松可脱壳

  2. 破解
    OD重新载入脱壳后程序, 搜索界面定位成功关键词到004011F3, 向上看到GetDlgItemTextA与GetDlgItemInt现在关键系统函数,可说明用户名是文本,系列号是纯数字
    用户名有长度校验, len * 5 = [1E, FA] => len = [6, 50]
    004011E1是关键算法, 进入分析:

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

int rol(unsigned int num, unsigned char i);

int main() {
  time_t t;
  time(&t);
  struct tm *tm_info;
  tm_info = localtime(&t);
  int year = tm_info->tm_year + 1900;
  char user[51] = {0};
  printf("用户名: ");
  scanf("%s", user); getchar(); //消耗掉多输入的\n 
  int i,len = strlen(user);
  unsigned int sum = 0;
  if(len<6 || len>50){
    printf("用户名6~50位");
    getchar(); return; 
  }
  for(i=0; i<len; i++){
    sum += user[i];
    sum = rol(sum, 8);
  }
  sum = (((sum ^ 2) - 0x50) ^ 0x1337) + year;
  printf("系列号: %d\n", sum);
  getchar(); return 0;
}

int rol(unsigned int num, unsigned char i){
  return (num << i) | (num >> (sizeof(int) * 8 - i));
}

运行示例:
用户名: keygenme
系列号: 3555125149

004012E1 66:8B35 7961400>mov si,word ptr ds:[0x406179]
004012E8 66:03CE add cx,si
004012EB 803D FA124000 C>cmp byte ptr ds:[0x4012FA],0xCC ; 这里有个防调试的判断,没弄明白原理 z=1跳转
004012F2 74 13 je short keygenme.00401307
004012F4 5E pop esi ; 00C01424
004012F5 A1 5F624000 mov eax,dword ptr ds:[0x40625F]
004012FA 3BC1 cmp eax,ecx ; 这里就是关键对比, 所以不用管上面的防调试也可以分析完算法

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

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

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

posted @ 2024-12-30 14:33  hankerstudio  阅读(7)  评论(0)    收藏  举报