已破解 发一个CrackMe
本帖最后由 zbnysjwsnd8 于 2017-10-14 20:14 编辑这个CrackMe还是挺简单的,成功输出Success
注册码:692659380\礱a癴fXJFLXJFLXJFLXJFLXJ 看了半天,,表示不知道怎么搞。。。。。。int __cdecl main(int argc, const char **argv, const char **envp)
{
char str_key; //
char v5; //
char v6; //
char v7; //
char v8; //
char v9; //
char v10; //
char v11; //
char v12; //
unsigned int long_key; //
BOOL v14; //
unsigned int k; //
unsigned int i; //
unsigned int j; //
v14 = IsDebuggerPresent();
v6 = 0;
v7 = 0;
v8 = 0;
v9 = 0;
v10 = 0;
v11 = 0;
v12 = 0;
printf("Key:");
scanf("%s", str_key); // 输入key
if ( v14 ) // 如果是调试 ??????
{
long_key = strtolong(str_key);
srand(long_key); // 置随机数种子
for ( i = 0; i < 0xC; ++i )
{
if ( rand() % 26 != byte_412000 ) // 产生伪随机数据 判断...呃好像和输出结果没啥关系
goto LABEL_15; // 输出失败
}
for ( j = 0; j < 7; ++j )
{
srand((unsigned __int8)v5); // 用 v5 数组的数字 置随机数种子
*(&v6 + j) = rand(); // 给数组V6依次赋值为第一个伪随机数
}
for ( k = 0; k < 7; ++k ) // 输出v6数组前七个字符 估计是Success
printf("%c", *(&v6 + k));
puts(byte_40D1AD); // puts{0,0,0}
}
else if ( !strcmp("{N0rMa1}", str_key) )
{
puts("Success.");
}
else
{
LABEL_15:
puts("Fail.");
}
system("pause");
return 0;
} 本帖最后由 SeriousSnow 于 2017-10-14 19:48 编辑
然后跑出来要符合
srand(long_key); // 置随机数种子
for ( i = 0; i < 0xC; ++i )
{
if ( rand() % 26 != byte_412000 ) // 产生伪随机数据 判断...呃好像和输出结果没啥关系
goto LABEL_15; // 输出失败
}
值是692659380
实际调试。。应为 直接运行或者吾爱OD IsDebuggerPresent这玩意返回值都是0 就去判断 输入是不是 {N0rMa1} 是就是假成功不是就是失败。。。。。
修改跳转。。输出的值也是乱码。。想去改V5发现。。获取是字节获取的,,最大255.。。(─.─||| 真的无力了 明码的- - 736148001 发表于 2017-10-14 16:22
明码的- -
提示信息不对 成功不是Success那个吗? 736148001 发表于 2017-10-14 16:25
成功不是Success那个吗?
仔细对比一下吧 有不一样的地方 小个点 知道了 打开系统好卡 就能知道v5的值,,,但是貌似和输入没啥关系啊。。。。。。int main(int argc, char ** argv)
{
unsigned long v5[] = { 10048,20093,10053,10053,20088,10058,10058 };
int i;
for (i = 0; i < 7; i++)
{
srand(v5);
printf_s("%c", rand());
}
return 0;
}