新CrackMe160之116 - REM - KeyGenME#10
-
脱壳
使用OD的ESP定律轻松可脱壳 -
破解
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个是最常用的界面,其它的我基本上没用到~


浙公网安备 33010602011771号