首页
社区
课程
招聘
[原创]【新年献礼】一招爆掉FlexLM签名验证
发表于: 2018-12-28 15:01 33262

[原创]【新年献礼】一招爆掉FlexLM签名验证

2018-12-28 15:01
33262
收藏
免费 8
支持
分享
最新回复 (70)
雪    币: 174
活跃值: (72)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
请问大家是怎么解决这个问题的,利用huzuyi 修改xor  eax,eax的方法在实际应用时还是会报错误,根据楼主所说的方式也仍然会check error
最后于 2020-2-14 15:04 被phoenixson编辑 ,原因:
2020-2-14 15:03
0
雪    币: 19
活跃值: (143)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
谢谢,高明!楼主可以出一个替换pubkey的教程吗?
最后于 2020-3-29 23:28 被prospect编辑 ,原因:
2020-3-29 22:57
0
雪    币: 191
活跃值: (58)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
28
。。。
最后于 2020-3-29 23:16 被ruyi编辑 ,原因: 发错帖子了。。。
2020-3-29 23:15
0
雪    币: 1184
活跃值: (4772)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
29
楼主,java flexlm需要修改哪里?
2020-4-4 23:32
0
雪    币: 274
活跃值: (393)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30

Windows下License administrator GUI里面 License Test无法通过,但Diagonostics正常识别


Linux下正常使用

2020-5-27 14:20
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
31

大佬,已经按照方法,在11.16上搜索了该字符串,修改了最后的调用的语句“call    @__security_check_cookie@4 " (x86版),模仿旧版license文件修改了其中的过期时间和版本声明,服务能正常启动。但是打开应用软件报错,怎么处理呢?

最后于 2020-6-5 21:20 被whucode编辑 ,原因:
2020-6-5 07:20
0
雪    币: 0
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
用大神这方法成功破解11.16

loc_18080D60C:
mov     rcx, [rbp+500h+var_38]
xor     rcx, rsp
call    sub_1807B29E0
mov     rbx, [rsp+5D0h+arg_18]
add     rsp, 5D0h
pop     r15
pop     r14
pop     r13
pop     r12
pop     rdi
pop     rsi
pop     rbp
retn
sub_18080CEF0 endp
2020-7-1 14:42
0
雪    币: 101
活跃值: (743)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
33
谢谢分享!mark
2020-7-3 20:04
0
雪    币: 6116
活跃值: (6756)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
34
whucode 大佬,已经按照方法,在11.16上搜索了该字符串,修改了最后的调用的语句“call    @__security_check_c ...
应用程序端FlexLM保护的文件也要做相应的Patch
2020-7-17 17:16
1
雪    币: 226
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
35
swphere [em_63][em_63][em_63]用大神这方法成功破解11.16 loc_18080D60C: mov rcx, [rbp+500h+var_38] xor rcx, ...
能请教一下是怎么修改的吗?
2020-7-18 11:20
0
雪    币: 226
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
36
yangmyron 张炜 找到该函数尾部的call语句,这句话不是很明白,该函数尾部的call语句难道不是_security_check_cookie吗? 是的,就 ...

大佬,这样改吗?

2020-7-22 17:26
0
雪    币: 42
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
IDA改完了 怎么保存?
2020-7-26 17:53
0
雪    币: 6116
活跃值: (6756)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
38
mb_nxxnhzzc IDA改完了 怎么保存?
File==》Production File==》Create DIF File,存完之后按照文件提供的Raw位置用UltraEdit或CFF-Explorer等二进制修改工作修改原文件并保存即可
2020-7-26 20:02
1
雪    币: 42
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
39
yangmyron File==》Production File==》Create DIF File,存完之后按照文件提供的Raw位置用UltraEdit或CFF-Explorer等二进制修改工作修改原文件并保存即可
感谢大神的回复,关键是插件...... 我弄出来了。改完二进制保存后,守护进程启动不了。大神能否帮忙看看。
2020-7-27 10:20
0
雪    币: 42
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
jackchentw 請問vendor daemon要一起爆破嗎? 我的目標有一個DLL檔跟一個vendor daemon檔,我把vendor dae ...
能否详细说明下,dll 怎么找么?
2020-7-27 10:29
0
雪    币: 6116
活跃值: (6756)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
41
mb_nxxnhzzc 能否详细说明下,dll 怎么找么?
DLL方法也是一样的
2020-7-27 17:18
0
雪    币: 42
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
42
jackchentw 請問vendor daemon要一起爆破嗎? 我的目標有一個DLL檔跟一個vendor daemon檔,我把vendor dae ...
能否详细的说明一下
2020-7-28 09:53
0
雪    币: 42
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
43
yangmyron DLL方法也是一样的
大神 我的问题是怎么找到需要爆破的DLL
2020-7-28 09:54
0
雪    币: 6116
活跃值: (6756)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
44
用“Detect-it-Easy”软件就可以
上传的附件:
2020-7-28 11:37
1
雪    币: 6116
活跃值: (6756)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
45
用“Detect-it-Easy”软件就可以
2020-7-28 11:38
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
46
老大,Linux下有没有类似Detect-it-Easy的软件?
2020-8-2 12:07
0
雪    币: 6116
活跃值: (6756)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
47
Cannyhor 老大,Linux下有没有类似Detect-it-Easy的软件?
这个理论上也支持ELF文件吧?你可以copy到Windows下试试
2020-8-6 16:57
0
雪    币: 6116
活跃值: (6756)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
48

huzuyi linux下面,可以将函数返回前的xor eax, eax指令改成nop,即31 c0改为90 90 修改前: 修改后:另外这里或上的值最好是由8改为1,参考源码中L_CONF_FL_V ...

是的,这个函数的原名就叫“l_good_lic_key”,可以对ECC及常规形式的签名进行比较(不一定是明文比较),返回值为1是签名通过,函数最后强制返回1即为任何签名都可通过验证。早期,大神们已经注意到该函数并有过分析,只是后来ECC的出现大神们焦点转移了。V9.2 SDK源码如下(高版本已经有修改过):


-----------------------------------------------------------------------------------------------------------

/*
 *    return 1 if good, 0 if bad
 */
#ifndef NO_ENCRYPTION_CHECK
int
l_good_lic_key(
    LM_HANDLE *        job,
    CONFIG *        conf,
    VENDORCODE *    key)
{
    VENDORCODE    vc;
    int            ok = 0;
    char *        code = NULL;
    int            str_res = 0;
    char *        sdate = NULL;
    L_KEY_FILTER *kf = 0;

    if ((!job->flags & LM_FLAG_SLOW_VERIFY)
        && (conf->L_CONF_FLAGS & L_CONF_FL_VERIFIED))
    {
        return 1;
    }
    memcpy(&vc, key, sizeof(vc));
    if (! (job->flags & LM_FLAG_CLEAR_VKEYS))
        l_xorname(job->vendor, &vc);
    l_sg(job, job->vendor, &vc);
#if 1
    if ((job->L_SIGN_LEVEL) && !conf->lc_keylist)
    {
        char context[50];
        char num[2];
        num[1] = 0; /* null terminator */
#ifdef MONTAVISTA
        num[0] = (char)((char)job->L_SIGN_LEVEL + '0');
#else
        num[0] = (char)((char)job->L_SIGN_LEVEL + '0');
#endif /* MONTAVISTA */

        sprintf(context, "SIGN%s=", num);
        LM_SET_ERROR(job, LM_SIGN_REQ, 582, 0, context, LM_ERRMASK_ALL);
        goto  exit_good_lic_key;
    }
#endif
    if (conf->lc_keylist && job->L_SIGN_LEVEL)
    {
        LM_KEYLIST *kl;

        for (kf = (L_KEY_FILTER *)job->key_filters;
            kf && (kf->sign_level != (int)job->L_SIGN_LEVEL);
            kf = kf->next)
            ;
/*
 *        Find the last KEY_FILTER for this job
 */
        if (kf)
        {
            int foundkl = 0;

            for (kl = conf->lc_keylist; kl; kl = kl->next)
            {
                char *    stdate = NULL;

                if ((kf->sign_level != kl->sign_level))
                    continue;
                foundkl = 1;
                job->lc_this_keylist = kl;

                code = l_crypt_private(job, conf, stdate, &vc);
                job->lc_this_keylist = 0;
                if (code && *code)
                {
                    ok = 1;
                    break;
                }
            }
            if (!ok)
            {
                if (!kl && !foundkl)
                {
                    char context[50] = {'\0'};
                    char num[2] = {'\0'};

                    num[1] = 0; /* null terminator */
                    num[0] = kf->sign_level > 1 ?
                        kf->sign_level + '0': 0;
                    sprintf(context, "SIGN%s=", num);
                    LM_SET_ERROR(job, LM_SIGN_REQ, 526, 0,
                        context, LM_ERRMASK_ALL);

                }
                else
                {
                    LM_SET_ERRNO(job, LM_BADCODE, 523, 0);
                }
            }
        }
#if 0
        else
            ok = 1;
#endif
    }
    if (!kf)
    {
        if (!(conf->lc_keylist && job->L_SIGN_LEVEL))
        {
            job->flags |= LM_FLAG_MAKE_OLD_KEY;
        }
        sdate = l_extract_date(job, conf->code);
        code = l_crypt_private(job, conf, sdate, &vc);
        if (!(conf->lc_keylist && job->L_SIGN_LEVEL))
        {
            job->flags &= ~LM_FLAG_MAKE_OLD_KEY;
        }
        if (job->user_crypt_filter)
        {
            if (!code || !*code)
                str_res = 1;
        }
        else
        {
            if (conf->lc_keylist && job->L_SIGN_LEVEL)
            {
                if (!code || !*code || !*conf->code)  /*P5552 */
                    str_res = 1;
                else
                    STRNCMP(code, conf->lc_sign, MAX_CRYPT_LEN,
                    str_res);
            }
            else
            {
                if (!code || !*code || !*conf->code)  /*P5552 */
                    str_res = 1;
                else
                    STRNCMP(code, conf->code, MAX_CRYPT_LEN,
                                str_res);
            }
        }
        if (str_res)
        {
    /*
     *    If user has set alternate encryption seeds,
     *    try those also.
     */
            if (job->options->alt_vendorcode.data[0] ||
                job->options->alt_vendorcode.data[1])
            {
                VENDORCODE altvc;
                VENDORCODE *v = &job->options->alt_vendorcode;
                memcpy((char *)&altvc, (char *)v, sizeof(altvc));
                l_sg(job, job->vendor, &altvc);
                code = l_crypt_private(job, conf, sdate, &altvc);
                ok = 1; /* assume success */
                if (!code || !*code || !*conf->code) /*P5552*/
                    ok = 0;
                else
                {
                    STRNCMP(code, conf->code, MAX_CRYPT_LEN, str_res);
                    if (str_res)
                        ok = 0; /* failed */
                }
            }

            if (!ok)
            {
                if (l_keyword_eq(job, job->vendor, conf->daemon))
                {
                    LM_SET_ERRNO(job, LM_BADCODE, 130, 0);
                }
            }
        }
        else
            ok = 1;
    }

exit_good_lic_key:

    if (!ok && conf->lc_future_minor)
        LM_SET_ERRNO(job, LM_FUTURE_FILE, conf->lc_future_minor, 0);


    if (ok)
        conf->L_CONF_FLAGS |= L_CONF_FL_VERIFIED;
    else
        conf->L_CONF_FLAGS |= L_CONF_FL_REJECT;
    return ok;
}


--------------------------------------------------------------------------------------------------

最后于 2020-8-19 15:05 被yangmyron编辑 ,原因:
2020-8-19 14:57
1
雪    币: 176
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
49
楼主您好!试着用这个方法改了$ynop$y$家的守护神文件和所有执行程序,但是改完后守护神完全启动不起来,exit code 255,即便加载正版license也启动不起来,这是哪里有文件校验还要改吗?
2020-8-24 14:05
0
雪    币: 226
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
50
fawcgzmg 看不懂,能否做个视频

请问该方法使用v11.16吗?按照楼主的方式弄了一下,许可程序能通过,但登录时还是报找不到许可

最后于 2020-8-26 12:02 被wx_ray_724编辑 ,原因:
2020-8-26 12:01
0
游客
登录 | 注册 方可回帖
返回
//