能力值:
( LV3,RANK:20 )
|
-
-
2 楼
怎么代码随注册码不一样还变
不会玩了
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
玩了一下第4个,呵呵,还算简单,明码比较,技术不咋好,破文写不出来,简单地说几个关键部位吧。
总体上,这个CM有4处Anti OD的代码,启动的时候有2处
0040109E E8 28010000 call 004011CB
00401154 E8 72000000 call 004011CB
这2处NOP掉就可以在OD中运行起来了。
验证注册码时有2处。
0040129D E8 2F010000 call 004013D1
00401362 E8 6A000000 call 004013D1
注册算法在
00401185 |> \E8 0A010000 call 00401294
在注册算法中反复
004012D3 |. E8 6DFFFFFF |call 00401245
应该是调用00401245来生成每组注册码,偶功力不行,还搞不出来算法,牛人自己玩吧。
关键比较
0040118A |. 68 F4344000 push 004034F4 ; /String2 = "77777777"
0040118F |. 68 18354000 push 00403518 ; |String1 = "LBFBJ34-K6AW0YZ-FS8OMNI-PQCABUM"
00401194 |. E8 A9020000 call <jmp.&kernel32.lstrcmpiA> ; \lstrcmpiA
在0040118F就可以看到明码的注册码,上面是我在调试的时候的,呵呵。
注册算法中主要用到的函数:
lstrcatA(字符串连接),lstrcmpiA(字符串比较,忽略大小写)
我认为要点就这些了,总体这个CM还算简单,明码比较,提供我玩出来的2组注册信息:
jiyangtx
LBFBJ34-K6AW0YZ-FS8OMNI-PQCABUM
QFly
5GJN74S-JQRDKUV-KUAW672-XY5LDWI
|
能力值:
( LV3,RANK:20 )
|
-
-
4 楼
JiYangTX
大哥你注册名在哪里输入的?
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
|
能力值:
( LV15,RANK:340 )
|
-
-
6 楼
arteam_Crackme_3_by_Enforcer.rar 的Key, 解压缩附件的 Key*.rar 到同一目录即可。
>>> Key: r1nipoqp9qe7i5hcbr3
>>> Key: r1nipoqp9qe8i5hdbr3
>>> Key: r1nipoqp9qe9i5hebr3
>>> Key: r1nipoqq9qe3i5hfbr3
...
(用附件里的cr3穷举出的一组Key,字符集只有小写字母和数字,理论上任何字符都是可以算出来的)
这个比较短,整个CM的主体一目了然。由于作者不让爆破,只好用随机数给整了组注册码 。下面是过程:
首先判断是否改过循环效验值 0xAAE23242,然后读同一目录下的Key.file文件,判断文件是否是19字节(0x13)。这说明Key是19字节的,然后是判断函数:
0040107E |. 6A 13 PUSH 13 00401080 |. 68 EC304000 PUSH crackme0.004030EC ; ASCII "1234567890123456789" 00401085 |. E8 6C000000 CALL crackme0.004010F6
0040108A |. 3B05 DD304000 CMP EAX,DWORD PTR DS:[004030DD] ; DS:[004030DD] = AAE23242
// CALL crackme0.004010F6 int __stdcall check_key_file(char *key, int len) { int result; char *tmpKey; int sum;
result = 0; tmpKey = key; while ( tmpKey != &key[len] ) { sum = __ROR__(*tmpKey + result, 8); result = sum ^ 0x7B; ++tmpKey; }
// result = AAE23242, OK! return result; } 判断函数很简单。另外ROR 8导致Key可以拆出来算,例如影响结果高8位 0xAA 的是Key的2/6/10/14/18字节(Key数组从0开始算)。
于是取巧拿随机数填入Key,丢出了 AAE2XXXX 和 XXXX32XX 两组注册码,合并了一下就是Key了。
(为了有多组Key,最后的0x42是穷举出来的,具体见附件的源码 cr3_src.rar)
ps: 这个注册成功后显示CM2,另外那个压缩包里的ARTeam.esfv实在没看出来有什么用...
|
能力值:
( LV4,RANK:50 )
|
-
-
7 楼
先去看看吧!刚刚学习,估计还是有难度啊!
|
能力值:
( LV4,RANK:50 )
|
-
-
8 楼
看了一下,第一个比较简单,(serial的asii码累加和+serial的位数)xor 0X12EE=0X6A就可以了
给一组:zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzA
|
能力值:
( LV4,RANK:50 )
|
-
-
9 楼
把6楼的cr3_src里面的源码翻译成c++
#include <iostream.h>
#include <conio.h>
unsigned long sum=0;
int index=0;
void check_key(char* key)
{
sum=0;
index=0;
for(;index<19;index++)
{
sum+=key[index];
__asm
{
push eax
mov eax,sum
ror eax,8
xor eax,7Bh
mov sum,eax
pop eax
}
}
if(sum==0xAAE23242)
cout<<"key: "<<key<<endl;
}
int main(int argc, char* argv[])
{
char key[]={"r1nZpoqZ9qe1i5hdbr3"};
int len=19;
int i=0,j=0,k=0,l=0;
char alp[]={"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
for(i=0;i<62;i++)
{
for(j=0;j<62;j++)
{
for(k=0;k<62;k++)
{
for(l=0;l<62;l++)
{
key[3]=alp[i];
key[7]=alp[j];
key[11]=alp[k];
key[15]=alp[l];
check_key(key);
}
}
}
}
getch();
return 0;
}
但是key的 初始值不好设,自己弄了几个(里面包括数字和字母)都失败,用6楼的jj产生的一组解去初始,就可以正常产生很多正确解,麻烦路过的大侠给小弟指点一下,这个初始化有怎么技巧,谢谢
|
能力值:
( LV15,RANK:340 )
|
-
-
10 楼
由于Key长度有19字节,所以直接穷举是不可行的。由于空间太大,初始值随便猜很难算出有效的注册码,需要做点优化。
你先把他的效验值 0xAAE23242 根据check_key_file()的代码展开,可以从函数中看出,由于ROR_8导致Key可以分成4个部分 分别穷举:
影响 0xAA 的是 Key[2], Key[6], Key[10], Key[14], Key[18] (这就是为什么代码里把这几字节一起赋值)
0xE2 -- Key[1], Key[5], Key[9], Key[13], Key[17]
0x32 -- ...
0x42 -- Key[3], Key[7], Key[11], Key[15]
这样,首先穷举key的2,6,10,14,18字节使最后计算结果是0xAAXXXXXX,接着再凑出结果是0xXXE2XXXX的... 全部拼起来就是Key了。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
第四个还是不错的,自己学习了查找和去掉反OD的地方,注册码是很好找,按下后,直接查找字符串就可以找到!
附上已经去掉反OD的CM和内存注册机
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
反OD 还不会,拿来练习下
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
今天都没人发CM,就来这里把第二个做了一下!!
|
|
|