好友
阅读权限30
听众
最后登录1970-1-1
|
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。
本帖最后由 BeneficialWeb 于 2018-5-8 07:30 编辑
新手分析第一稿,如有不足,多多谅解哈!!!!
正文开始:
先提示下算法流程,首先把输入的32位username每8位进行crc16计算,然后得到一个4个元素的数组,再对这个数组进行一些异或,+,-,/,*这些操作最后得到一个16个元素的数组,最后将这个数组每一项值作为索引在一个Table找到对应的字符,拼接起来就是最后的key
运行keygen.exe, 看到字符串,激动;www
搜索字符串来到这里,输入假码走起
F8 单步运行,跟踪 {:1_907:} 排版 也是够水的,还在学习,希望有人能留帖·教教我,谢谢
代码流程图大概也就是这样,此外 需要注意的是 16 个元素的数组,只能成功索引出 前16位注册码
还有其他 的索引值来源,自己分析 或者请看 注册机代码,
[C] 纯文本查看 复制代码 #include<iostream>
#include<string.h>
#include<Windows.h>
int main()
{
//测试了一组username,读者可测试其他的
char serial[] = "QWERTYUIOPQWERTYUIOPQWERTYUIOPQW";
WORD c[5] = { 0 };
int i, j, k;
if (strlen(serial) == 32)
{
for (i = 0; i < 4; i++)
{
WORD temp = 0;
for (j = 0; j < 8; j++)
{
temp ^= (serial[i * 8 + j] << 8);
for (k = 0; k < 8; k++)
{
if (temp & 0x8000)
temp = (2 * temp) ^ 0x1021;
else
temp *= 2;
}
}
c[i] = temp;
}
//数值交换
c[3] ^= c[1];
c[1] ^= c[3];
c[3] ^= c[1];
c[0] ^= c[2];
c[2] ^= c[0];
c[0] ^= c[2];
c[3] ^= c[2];
c[2] ^= c[3];
c[3] ^= c[2];
c[4] = 0x2;
WORD v22[38];
int v23;
v22[0] = 16 * c[1] * c[0];
v22[16] = (WORD)16 * ((c[2] + 1) ^ (c[0] + 1));
v22[1] = (((unsigned __int16)c[0] + 2) % ((unsigned __int16)c[3] + 2) + 1) >> 4;
v22[2] = (signed __int16)((((unsigned __int16)c[0] + 3) / ((unsigned __int16)c[4] + 3)) ^ 5);
v22[4] = 16 * (c[3] ^ c[1]);
v22[3] = ((unsigned __int16)c[1] + 1) % (unsigned __int16)c[0] + 4;
v22[15] = (unsigned int)(((unsigned __int16)c[1] + 2) / ((unsigned __int16)c[1] + 5)) - 1;
v22[13] = (c[1] + 99) ^ (c[1] + 6) ^ 0x79;//FFFF
v22[5] = 16 * c[1];//0084
v22[6] = (unsigned __int16)c[1] / (signed int)(unsigned __int16)c[2];
v22[14] = v22[0];
v22[7] = c[2] + 9;
v22[8] = (c[2] + 8) ^ 5;
v22[9] = 99;
v22[10] = (2 * (unsigned __int16)c[2] - 8) % 10;
v22[12] = c[0] ^ (c[3] + 6);
v22[11] = 99 * (c[3] + 2);
v22[18] = 0x19D1;
v22[20] = 0x0;
v22[22] = 0x4;
v22[24] = 0xFCE4;
v22[26] = 0xFDE1;
v22[28] = 0x9744;
v22[30] = 0xF;
char key[35] = { 0 };
char key1[35] = { 0 };
char box[] = "zwAcG20l1IP=xku^";
for (j = 0; j < 16; ++j)
{
if (j % 2)
{
key[2 * j] = box[(((unsigned __int16)v22[2 * j] ^ 0x14) >> 8) % 16];
key1[2 * j] = box[(unsigned __int16)v22[2 * j] % 16];
printf("%c", key[2 * j]);
printf("%c", key1[2 * j]);
}
else
{
key[2 * j] = box[((signed int)(unsigned __int16)v22[2 * j] >> 8) % 16];
key1[2 * j] = box[(unsigned __int16)v22[2 * j] % 16];
printf("%c", key[2 * j]);
printf("%c", key1[2 * j]);
}
}
//注册码以固定3位结尾
printf("XDD");
}
else
{
printf("长度不对哦!!!\n");
}
system("pause");
return 0;
}
由于水平较差,怕说不清楚,呵呵,就这样吧!
拜拜咯!
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|