能力值:
( LV2,RANK:10 )
|
-
-
27 楼
手动脱壳,标志比较明显,不说了
研究了一上午,中午搞明白了其中的一些原因:
1、用户名、密码的限制:
1)UserName长度必须满足400<=107*(700 - 5 * (48 - 72 / len)) - 53100<=8960即3<=len<=9;
2)满足4559 % pszUserPass[0] == 23即pszUserPass[0]*x=4539,然后可以推算出第一位可能的字符,这里取了一个字符T,过了对Pass第一位的检查;
3)用于个人习惯,这里使用了pszUserPass代表序列号字符串
2、注册机代码如下,使用Vc6编写,XP SP3下通过测试:
int main(int argc, char* argv[])
{
if (argc < 2)
{
printf("Usage: aa.exe UserName");
return 0;
}
char *pszUserName = argv[1];
DWORD dwLenOfUserName = lstrlenA(pszUserName);
if (dwLenOfUserName< 3 || dwLenOfUserName > 9)
{
printf("Length of Name in 3 ~9 !\n");
return 0;
}
DWORD v17 = 0;
for (int i = 0; i < dwLenOfUserName; i++)
{
v17 += pszUserName[i];
}
char v15[27] = {0};
memcpy(v15, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", sizeof(v15));
char v16[256] = {0};
for (int k = 0; k < dwLenOfUserName; k++)
{
v16[k] = (pszUserName[k] * (k + 3) * dwLenOfUserName
+ (v15[4 * k - (k + 1)] ^ pszUserName[k])
+ ~(k * v17 - v17)
+ 333)
% 0xA
+ 48;
v16[k] = (k + 2) * (v16[k] ^ 0xADAC) % 10 + 48;
}
CHAR v12[256] = {0};
wsprintfA(v12, "%c%s", 'T', v16);
char pszUserPassCalculated[256] = {0};
wsprintfA(pszUserPassCalculated, "%s-%d", v12, v17 * dwLenOfUserName % 100 + 48);
char pszUserPassCalculated2[256] = {0};
pszUserPassCalculated2[0] = pszUserPassCalculated[0];
for (int j = 1; j < lstrlenA(pszUserPassCalculated); j++)
{
pszUserPassCalculated2[j] = (pszUserPassCalculated[j] ^ 0x20) % 10 + 48;
}
printf("Name: %s\nPass: %s\n", pszUserName, pszUserPassCalculated2);
return 0;
}
输入用户名,直接给出了用户名、Password对,检测了几个帐号都能够成功注册。
程序里面好像有点问题,只比较了Password的前10个字符,后面的字符好像没有比较
|
能力值:
( LV3,RANK:30 )
|
-
-
28 楼
我也在看《crack2007》,弄了很久也做出注册机来了。其实也不太难,只是很麻烦罢了
|
能力值:
( LV2,RANK:10 )
|
-
-
29 楼
帖子老了,也不知道适不适合再回帖,但是本人刚开始学习,也就本着对自己负责的态度说说这其中的问题,好像也没人提出来。
就是
for(i=0;i<name_len;i++)
{
temp=(((((name[i]^table[i*3-1])+((total*i-total)^0xffffffff)+0x14d+(i+3)*name_len*name[i])%10+0x30)^0xadac)*(i+2))%10+0x30;
midserial[i+1]=(char)temp;
}
这段代码中table[i*3-1]的小问题,i从0开始,也就说此时是table[-1],但是此处的思想是对的,因为反汇编的确是这样操作的,我想是编写程序的人的一个失误,我想编写原程序的人应该想的是i从1开始,因为这样i才有可能等于9,这时才能访问"Z",不然"XYZ"就没意义。。。
并且反汇编的这个下标为-1的值总是为0x00;楼主反汇编后也是,但是自己写的注册机是0xCC,估计是此处的0x00是之前有变量赋值在此,于是只好判断i==0的时候让它等于0x00。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
30 楼
注册几年了都没来过,现在还是菜鸟,又开始学了,这个题还算简单,连我等菜鸟都破出了了
666666
8892105358
注册机就没去看了,看得头疼,今天学习了下消息断点,消息断点还是蛮好用的,用消息断点段下来的,没用api
|
能力值:
( LV2,RANK:10 )
|
-
-
31 楼
这个注册码真麻烦.以后有可以的话再也不看算法,
shuguang
T07868844332
|
能力值:
( LV2,RANK:10 )
|
-
-
32 楼
这么难的算法真的适合菜鸟么 T_T
|
能力值:
( LV2,RANK:10 )
|
-
-
33 楼
学习!!!
|
能力值:
( LV2,RANK:10 )
|
-
-
34 楼
2019年最后一天来学习了
|
能力值:
( LV2,RANK:10 )
|
-
-
35 楼
请问连结失效了吗
|
|
|