首页
社区
课程
招聘
[分享]发几个国外的CrackMe!
发表于: 2009-9-8 17:40 6863

[分享]发几个国外的CrackMe!

2009-9-8 17:40
6863
原地址:http://www.accessroot.com/arteam/site/download.php?list.11

第4个简单,明码比较的.

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 210
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
怎么代码随注册码不一样还变
不会玩了
2009-9-8 20:47
0
雪    币: 237
活跃值: (31)
能力值: ( 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
2009-9-8 22:17
0
雪    币: 210
活跃值: (56)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
JiYangTX
大哥你注册名在哪里输入的?
2009-9-8 23:38
0
雪    币: 237
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不好意思,粗心了,是第四个,不是第一个
2009-9-9 15:59
0
雪    币: 296
活跃值: (89)
能力值: ( 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实在没看出来有什么用...
上传的附件:
2009-9-9 20:18
0
雪    币: 324
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
先去看看吧!刚刚学习,估计还是有难度啊!
2009-9-10 11:25
0
雪    币: 318
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
看了一下,第一个比较简单,(serial的asii码累加和+serial的位数)xor 0X12EE=0X6A就可以了
给一组:zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzA
2009-9-10 13:36
0
雪    币: 318
活跃值: (10)
能力值: ( 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产生的一组解去初始,就可以正常产生很多正确解,麻烦路过的大侠给小弟指点一下,这个初始化有怎么技巧,谢谢
2009-9-11 14:47
0
雪    币: 296
活跃值: (89)
能力值: ( 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了。
2009-9-11 20:41
0
雪    币: 238
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
第四个还是不错的,自己学习了查找和去掉反OD的地方,注册码是很好找,按下后,直接查找字符串就可以找到!

附上已经去掉反OD的CM和内存注册机
上传的附件:
2009-9-12 09:28
0
雪    币: 232
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
反OD 还不会,拿来练习下
2009-9-12 12:25
0
雪    币: 238
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
今天都没人发CM,就来这里把第二个做了一下!!
上传的附件:
2009-9-16 20:28
0
游客
登录 | 注册 方可回帖
返回
//