首页
社区
课程
招聘
[原创]riijj Crackme (1) 的详解
发表于: 2004-11-26 11:57 218412

[原创]riijj Crackme (1) 的详解

2004-11-26 11:57
218412
收藏
免费 7
支持
分享
最新回复 (267)
雪    币: 222
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
251
直接复制这段汇编,然后压两个值过去 可以计算出来吧。
2011-8-22 16:44
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
252
0040126B  |. 6A 10          PUSH 10
0040126D  |. 52             PUSH EDX                          // <----- 注意这里,可以看出存放序号字符串的地方
0040126E  |. 68 E9030000    PUSH 3E9
00401273  |. 50             PUSH EAX
00401274  |. FFD6           CALL ESI                          // 再用 GetDlgItemTextA ,得到序号
00401276  |. 0FBE4424 08    MOVSX EAX,BYTE PTR SS:[ESP+8]     // 把名字的第一个位,放入 EAX
0040127B  |. 0FBE4C24 09    MOVSX ECX,BYTE PTR SS:[ESP+9]     // 把名字的第二个位,放入 ECX
00401280  |. 99             CDQ                               // 把 EAX 扩展,成为 EDX:EAX 的 QWORD(64 位长)
00401281  |. F7F9           IDIV ECX                          // 把 EDX:EAX 除以 ECX,余数放在 EDX
00401283  |. 8BCA           MOV ECX,EDX                       
00401285  |. 83C8 FF        OR EAX,FFFFFFFF                   // EAX = 0xffffffff
00401288  |. 0FBE5424 0A    MOVSX EDX,BYTE PTR SS:[ESP+A]     // 把名字的第一个位,放入 EDX0040128D  |. 0FAFCA         IMUL ECX,EDX                      // 把刚才的余数乘以 EDX
00401290  |. 41             INC ECX                           // ECX 增加 1

楼主可不可以解释下:明明有4个入栈动作,为什么:[ESP+8]  是把名字的第一个位,放入 EAX
而不是:[ESP+12]  呢
2012-3-6 19:15
0
雪    币: 56
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
253
交作业。。给楼主注册机
上传的附件:
2012-3-13 11:09
0
雪    币: 281
活跃值: (177)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
254
这是我分析出来的注册算法,不知道对不对。

char * name;
char *key;
int g;
//初始化
g = ffffffff/(  (name[0]%name[1])*name[2]+1  );

rand()
{
    g= 0x343fd *g +0x269ec3;
    return (g>>16) & 01111111b;
}

//注册算法

for(int i=0;i< strlen(key); i++)
{
  int64 var = (rand()%0x1a +0x41) -key[i];
  if( var !=0)
    return FAIL;
}

return SUCCESS;
2012-12-27 13:57
0
雪    币: 281
活跃值: (177)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
255
这是我分析出来的注册算法,不知道对不对。

char * name;
char *key;
int g;
//初始化
g = ffffffff/(  (name[0]%name[1])*name[2]+1  );

rand()
{
    g= 0x343fd *g +0x269ec3;
    return (g>>16) & 01111111b;
}

//注册算法

for(int i=0;i< strlen(key); i++)
{
  int64 var = (rand()%0x1a +0x41) -key[i];
  if( var !=0)
    return FAIL;
}

return SUCCESS;
2012-12-27 14:26
0
雪    币: 281
活跃值: (177)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
256
这是注册机:
注册成功!!

#include "stdio.h"
#include "string.h"

unsigned int g ;

unsigned int m_rand(){
        g = 214013 *g + 2531011;
        return (g>>16)& 0x7fff;
}

char * name;

int main()
{
        //name长度要大于3

        name = "wuzhiwen";
        g = 0x0ffffffff/ ( (name[0]%name[1])*name[2] +1);
       
        int i=15;
        while(i){
                m_rand();
                i--;
        }

        for(i=0; i<strlen(name); i++)
        {
                unsigned int count = name[i];
                count = count>>5;
                count = 123*count;
                while(count){
                        m_rand();
                        count --;
                }
                char j = m_rand()%0x1a +0x41;
                printf("%c",j);
        }

        return 0;
}
2012-12-27 14:28
0
雪    币: 58
活跃值: (25)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
257
好帖子不能沉,必须得顶上来.

破解要求的就是熟悉汇编啊.

另外从Kernel态的反汇编代码要想执行到用户态的部分,在OD下可以直接使用快捷键如下: Alt + F9.

这个是在 加密及解密 第三版中看到的.
2013-2-1 11:00
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
258
学习了
谢谢,虽然是老帖子,对我很有帮助
2013-2-28 10:14
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
259
学习!!
2013-5-16 08:57
0
雪    币: 192
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
260
不错。看看!
2013-11-18 18:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
261
写得非常细致~赞一个~
2014-3-10 16:05
0
雪    币: 7
活跃值: (76)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
262
好文,给初学者很大信心,多谢
2014-7-24 21:46
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
263
填入chaoliu,在40130C处断点,记录下每次的DL值,得到注册码XVUXJUC。
第一次玩cm,因楼主写得太好,终于强迫自己认真学了一天,并写出了网页版Javascript注册机。JS的缺点是读取到字符串还要转换成ascii码,中间还要互转,数值过大超过32位时还要手动截断。没有256楼的C语言简短漂亮。
本次学习大有收获,感谢楼主了

把以下代码另存成 *.htm 文件,用浏览器打开,就可以算号了^o^

注册名:<input id="username" value="chaoliu"/></br>
注册码:<input id="sn" value=""/></br>
<input type="button" value="算号" onclick="calc();">

<script language="javascript">
var n=0;
function calc(){
        var username=document.getElementById("username").value;
        var i=0;
        var s1='';var sn='';
        var ax,dx,di;
        if(username.length<3){alert('注册名长度不能小于3!');return;};
        if(username.length>15){username=username.substr(0,15);};//15位以上的用户名忽略超出部分
        n=Math.floor(0xFFFFFFFF/(a(username,0)%a(username,1)*a(username,2)+1));
        for(i=0;i<15;i++){
                ax=f134a();
                //s1+=String.fromCharCode(ax%0x1a+0x41);//不需要
                //ax=Math.floor(ax/0x1a);//不需要
        }
        for(i=0;i<username.length;i++){
                ax=a(username,i)>>5;
                dx=ax+ax*4;ax=ax+dx*8;di=ax+ax*2;
                for(var k=0;k<=di;k++)ax=f134a();
                sn+=String.fromCharCode(ax%0x1a+0x41);
        }
        w(sn);
}
function f134a(){
        n=(n*0x343fd+0x269ec3);
        var ss=n.toString(16);
        if(ss.length>8)n=parseInt('0x'+ss.substring(ss.length-8,ss.length));
        return (n>>16)&0x7fff;
        };
function w(str){document.getElementById("sn").value=str;}
function w16(n){document.getElementById("sn").value=n.toString(16);}
function a(str,pos){return str.substr(pos,1).charCodeAt();}
</script>
2015-5-7 17:58
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
264
不错,适合我们菜鸟学习~~~
2015-7-24 16:06
0
雪    币: 2
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
265
Mark一下
2015-8-26 23:10
0
雪    币: 14
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
266
学习了 刚才 试了 半天 爆破掉的 我在研究下 破文 。。
2015-12-9 23:41
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
267
爆破倒是很快..直接搜字符就出来了...但是这算法,我看了半天了,也只是熟悉了调子 。再研究研究
2016-12-6 17:27
0
雪    币: 199
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
268
下载地址没用了啊
2017-11-10 23:18
0
游客
登录 | 注册 方可回帖
返回
//