新CrackMe160之143 - CrackTHEKey#02
OD载入程序,搜索界面定位到成功关键词00401191,向上直到Enter key:0040112B处, 查看IDA源码:
int __cdecl main(int argc, const char **argv, const char **envp)
{
char v3; // al@1
signed int i; // esi@1
int j; // esi@4
int k; // esi@7
char v7; // al@9
char s2[52]; // [sp+Ch] [bp-68h]@8
char s1[52]; // [sp+40h] [bp-34h]@1
dword_40E774 = (int)fopen(path, mode);
printf(format);
scanf(aS, s1);
v3 = s1[0];
for ( i = 1; s1[i]; ++i ) //累加输入串
v3 += s1[i];
for ( j = 0; s1[j]; ++j ) //每一位又加上累加值
s1[j] += v3;
for ( k = 0; ; ++k ) //生成程序串
{
v7 = unknown_libname_3(dword_40E774);
if ( v7 == -1 )
break;
s2[k] = v7;
}
if ( !strcmp(s1, s2) ) //关键对比 00401185
printf(aRightKey);
else
printf(aInvalidKey);
return getch();
}
在00401185处也下好断点, 输入伪码验证,来到此处,可以看到对比方法入参两个数,一个是输入串运算后的串,一个是程序生成的数存在内存0019FED4处,查看内容如下:
,0xFE,0xFA,0xDD,0xE1,0xE9,0xD5,0xEC,0xE1,0xD9,0xFE,0xFB,0xD5,0xFE,0x01,0xEE,0xF1,0xEA,0xD5,0xF8,0xED,0xF6,0xFE,0xD9,0xD5,0xF0,0xDD,0xF7,0xF5,0xEB
由上面算法可见, 输入串也得跟程序生成串一样长,需要29位, 注册机如下:
#include <stdio.h>
int main() {
unsigned char code[30] = {0}, rlt[30] = {0xFE,0xFA,0xDD,0xE1,0xE9,0xD5,0xEC,0xE1,0xD9,0xFE,0xFB,0xD5,0xFE,0x01,0xEE,0xF1,0xEA,0xD5,0xF8,0xED,0xF6,0xFE,0xD9,0xD5,0xF0,0xDD,0xF7,0xF5,0xEB,0};
int i,j,k,t,s;
for(i=0; i<=0xFF; i++){
s = 0; t = 0;
for(j=0; j<29; j++){
code[j] = (rlt[j] - i) & 0xFF;
t += code[j];
t = t & 0xFF;
}
if(t == i) {
printf("\nt=%X\n系列号: %s\n", t, code);
printf("系列号(16): ");
for(j=0; j<29; j++){
printf("%02X ", code[j]);
}
//break;
}
}
printf("\n结束");
getchar(); return 0;
}
运行结果:
t=28
系列号: 忠倒镰墓敝迎仲粕颅信沃杯鹊贤?
系列号(16): D6 D2 B5 B9 C1 AD C4 B9 B1 D6 D3 AD D6 D9 C6 C9 C2 AD D0 C5 CE D6 B1 AD C8 B5 CF CD C3
t=A8
系列号: VR59A-D91VS-VYFIB-PENV1-H5OMC
系列号(16): 56 52 35 39 41 2D 44 39 31 56 53 2D 56 59 46 49 42 2D 50 45 4E 56 31 2D 48 35 4F 4D 43
两组答案都是正确的,但第一组最后一位是乱码,无法直接复制过去验证,所以只有第二组才能正常使用, 如果需要验证第一组,可以在OD中修正最后一位的值后继续验证即可
使用的工具连接(工具有点多有点大,可以先下OD,其它的后面慢慢下) 点击前往下载
下面是我的OD的界面布局,我觉得这4个是最常用的界面,其它的我基本上没用到~


浙公网安备 33010602011771号