首页
社区
课程
招聘
[原创]手工快速识别+破解 FLEXLM_ECC关键函数
发表于: 2009-2-11 22:35 28664

[原创]手工快速识别+破解 FLEXLM_ECC关键函数

2009-2-11 22:35
28664
1、  爆破l_pubkey_verify
(1) 在IDA中查找字符串 “lmseed.dat” 和 “Can't open lmseed.dat”的引用,对应的源代码如,再往上很容易确定出函数 sb_end。
  ret = sb_end(global_data);
  if (ret != SB_SUCCESS) 
  {
    fprintf(stderr, "Error 9: ");
    goto exit_seed;
  }
/*此处是关键的识别点,往上可找到sb_end*/
  if (!(fp = fopen("lmseed.dat", "w")))
    fprintf(stderr, "Can't open lmseed.dat");
  else
  {
    fprintf(fp, 
  "\
Once set, the values for LM_SEED1-3 must be kept secret \n\
and *never* change.\n\n\
#define LM_SEED1 0x%08x\n\
#define LM_SEED2 0x%08x\n\
#define LM_SEED3 0x%08x\n", seed1, seed2, seed3);
    fclose(fp);
  }


(2)查找对sb_end的调用,其中有一个应为 mov [addr], sb_end,对面应的源代码如下,此处所在的函数即为l_pubkey_verify

if (!job->L_VERIFY_MEM)
  {
    typedef void (*cleanup)(char *);
    m = (VERIFY_MEM *)(job->L_VERIFY_MEM = 
      (char *)l_malloc(job, sizeof(*m)));
    m->cleanup = (cleanup)sb_end;
    m->strength = strength;
    m->sign_level = sign_level;


(3)在找到的mov [addr], sb_end 继续往上,找到选择分支结构,对应的源代码如下,此处的爆破方法很多,可以直接将strength置为0

  switch(strength)
  {
  case LM_STRENGTH_LICENSE_KEY: return 0;
  case LM_STRENGTH_113BIT: ellipticCurve = 
                &LM_PUBKEY_CURVE113BIT; break;
  case LM_STRENGTH_163BIT: ellipticCurve = 
&LM_PUBKEY_CURVE163BIT; break;
  case LM_STRENGTH_239BIT: ellipticCurve = 
&LM_PUBKEY_CURVE239BIT; break;
  default:
    {
      LM_SET_ERRNO(job, LM_BADPARAM, 531, 0);
      ret = LM_BADPARAM;
      goto exit_verify;
    }
  }


2、  在daemon中寻找seed明文
(1)寻找289BEB8A的引用,应是赋值语句 mov [addr], 289BEB8A,对应的源代码如下

  if ((keylen < 12) || (keylen > MAX_CRYPT_LEN)) // MAX_CRYPT_LEN=20
    return 0;
  if (keylen != 12)
        len = L_SECLEN_LONG; // L_SECLEN_LONG=0x289BEB8A


再往前应有 “ok” “demo” “%02X”。
注意在289BEB8A的引用附近没有66D8B337,根据这一条可以直接确定出关键函数l_string_key。
(2)往下找3D4DA1D6,找到 mov [var_xx], 3D4DA1D6,再沿此往上找到类似mov [var_xx],eax。 进一步往前是call sub_xxxx,这里的sub_xxxx就是产生SEED明文的关键函数,返回值eax中就是SEED的明文。
(3)在l_string_key中找到sub_xxxx的两个调用,在函数调用后下断点即可。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 7
支持
分享
最新回复 (24)
雪    币: 221
活跃值: (2256)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
给个实例,来看看!
2009-2-11 23:49
0
雪    币: 198
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
很好,很清楚
2009-2-12 08:42
0
雪    币: 242
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
有没有实例,搞个实例我们会更清楚一点
2009-2-12 16:44
0
雪    币: 228
活跃值: (60)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
写的很好,有启发。谢谢!
2009-2-12 21:48
0
雪    币: 264
活跃值: (85)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
很方便,谢谢
2009-2-13 12:39
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
0.0  米懂!
2009-2-13 12:52
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
收藏一下,不过没有搞过这个东西
2009-2-13 17:33
0
雪    币: 751
活跃值: (2710)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
分析的不错,
2009-2-14 11:10
0
雪    币: 217
活跃值: (77)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
强,顶一下
2009-2-15 09:53
0
雪    币: 346
活跃值: (1963)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
谢谢分享,收藏
2009-2-15 10:11
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
很有启发 不过还是不如找0x292这样的数字来的方便
2009-2-15 14:30
0
雪    币: 102
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
楼上介绍一下 0x292是怎么做的?
2009-2-16 19:27
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
哦 少敲了一个字母 是 0x292A = 10538
2009-2-16 20:14
0
雪    币: 107
活跃值: (200)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
0x292A是啥?
不要话说到一半,学学楼主,给大家一点详细的说明。
2009-2-16 23:56
0
雪    币: 102
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
我在另外一篇帖子中也看到有人提了一下0x292A的方法,但是具体是如何做的,还不太清楚。

是否静态dasm后查询0x292A?然后这个位置找ecc?
2009-2-17 09:40
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
用IDA吧 patch这个函数就好了 为什么是这个值 找sdk的source看看就知道了 (好久没有研究过flexlm了,手边也没有sdk)
2009-2-17 20:47
0
雪    币: 324
活跃值: (157)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
呵呵,仔细看一下l_prikey.c源代码,你会发现有很多类似的错误代码。
{
l_pubkey_err(job, 10538, returnValue);
ret = LM_PUBKEY_ERR;
goto exit_verify;
}

这些代码是很好的判断方法。

2009-2-18 11:26
0
雪    币: 484
活跃值: (269)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
20
TO: 空手剑客
剑客兄, 下面的软件ECC patch一直搞不定, 能否帮忙分析一下, 谢谢啦!

http://www.fileden.com/getfile.php?file_path=http://www.fileden.com/files/2008/10/26/2160096/v2l.zip
2009-5-1 01:28
0
雪    币: 519
活跃值: (4779)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
你不会不知道吧。。
2009-5-1 16:58
0
雪    币: 324
活跃值: (157)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
话都说的这么清楚了,这说明你根本没有理解flexlm的这段代码。请问你有仔细看过这些代码吗?不要总是让别人直接告诉你结果,那样你永远学不到东西。
2009-5-2 09:45
0
雪    币: 530
活跃值: (542)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
23
想把FLEXLM掌握好,就要对照9.2的source和反汇编代码多钻研几下
多思考就会有新的体会
只听别人讲的经验和技巧,是永远学不会的
身体力行是很有必要的滴。。。
2009-5-29 22:11
0
雪    币: 188
活跃值: (218)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
TO: 空手剑客兄
你写linux下ecc patch文件flep的源代码可以共享一下么?
我想学习一下在linux下面做ecc patch, 谢谢!
2009-6-3 21:51
0
雪    币: 8
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
虽然看过一些有关  Flexnet  的文章,还是一头雾水,问下这些代码是在  SDK  里面找吗?谢谢
2017-9-14 15:51
0
游客
登录 | 注册 方可回帖
返回
//