首页
社区
课程
招聘
[原创]OD 自动提取FLEXLM VENDERCODE的插件
发表于: 2008-1-8 22:48 53515

[原创]OD 自动提取FLEXLM VENDERCODE的插件

2008-1-8 22:48
53515

曾经研究过一段时间的FLEXLM,也写了自己的VENDERCODER生成器.
后来因为ECC无法解决停了2年.
    看到Epsylon3 的脚本开发插件,小试一下,编了这个自动提取VENDERCODE的插件.  用V6,V7,V8,V9都试过几个,可以担取. V10因为新的l_n36_buf,不提供样本License,CALL的地址为0,所以没继续试(也许提供一个假的license也可以正常工作,不过本人没试.
    这是本人自己动手写的第一个,写得不好别骂我:).

// Flexlm Vender data refatch  
// by Tylon
// Dec . 30 . 2007

var demo
var avar
var fadd
var stp
var ofile

        lclr
        mov ofile, "c:\data.txt"  // noway to  let you define the out-file name
       
        mov demo, 401000
        find demo, #21436587#                        // use 0x87654321 as 1st ancor
        mov demo, $RESULT
        find demo, #78563412#                        // the next demo Skey,
        mov demo, $RESULT
       
       
        sub demo, 20
        add demo, 6
        bp demo                                                                                // adjust to the call
       
       
        run
        sti                                                                                         // step-into the call
  
  mov stp,eip                                                                //back up the start eip of the subroutingfor later searching
        dm [esp+08], 14, ofile                // get vendor name
       
        mov avar, [esp+0c]                                // v_ata
        mov demo, 0;
vdata:
        itoa [avar];
        wrta ofile, $RESULT
        add avar, 4
        add  demo, 4
        cmp demo, 164
        jb vdata
       
        wrta ofile,"\r\n"
       
//        mov demo, eip+9                        //we don't need thisone
//        itoa [demo]
//        wrta ofile, $RESULT

        findop eip, #ff??#, ff
        mov fadd, $RESULT
       
//  if not do this check, it'll lead to good sub       
//        cmp [avar],0
//        je erra

        bc
        bp $RESULT                                        //set bp on the call [???]
       
        sub fadd, stp;
        findop eip, #2500800000#, fadd                // find cmp eax
        cmp $RESULT,0
        je findother
        mov fadd,$RESULT
//        repl fadd, #2500800000#, #0500800000#,10
        jmp torun
findother:
        findop eip, #81??00800000#,fadd
        mov fadd, $RESULT
//        repl fadd, #81??00800000#, #8B??00800000#,12
       
torun:
  add fadd,4
  repl fadd, #74??#, #9090#, 10
  run
        sti                        //now we are inside the destinely aera
        wrta ofile, "magic_4:  "

        mov demo, eip+9                                                //magic_4
        itoa [demo]
        wrta ofile, $RESULT
       
        wrta ofile, "\r\n"
        wrta ofile, "can't get turns directly,so just dump the asm-code:\r\n"

//        find eip, #0FBE????????0FBE#,2000
//        mov stp, $RESULT
//        find eip, #0FBE??????????0FBE#,2000
//        mov fadd, $RESULT

//        cmp stp, 0
//        je start_2
//        cmp fadd, 0
//        je start_1
//  cmp fadd, stp
//  jb start_2
//start_1:
//  mov fadd, stp
//  jmp here
//start_2:
//  go fadd
  
//here:

        findop eip, #0FBE??D?#,2000
        mov fadd, $RESULT
       
        opcode fadd
        wrta ofile, $RESULT
        wrta ofile, $RESULT_1
        add fadd,$RESULT_2
        opcode fadd
        wrta ofile, $RESULT
        wrta ofile, $RESULT_1
        add fadd,$RESULT_2
        opcode fadd
        wrta ofile, $RESULT
        wrta ofile, $RESULT_1
        add fadd,$RESULT_2
        opcode fadd
        wrta ofile, $RESULT
        wrta ofile, $RESULT_1
        add fadd,$RESULT_2
        opcode fadd
        wrta ofile, $RESULT
        wrta ofile, $RESULT_1
        add fadd,$RESULT_2
        opcode fadd
        wrta ofile, $RESULT
        wrta ofile, $RESULT_1
        add fadd,$RESULT_2
        opcode fadd
        wrta ofile, $RESULT
        wrta ofile, $RESULT_1
        add fadd,$RESULT_2
        opcode fadd
        wrta ofile, $RESULT
        wrta ofile, $RESULT_1
        add fadd,$RESULT_2
        opcode fadd
        wrta ofile, $RESULT
        wrta ofile, $RESULT_1
        add fadd,$RESULT_2
        opcode fadd
        wrta ofile, $RESULT
        wrta ofile, $RESULT_1
        add fadd,$RESULT_2
        opcode fadd
        wrta ofile, $RESULT
        wrta ofile, $RESULT_1
//        add fadd,$RESULT_2
       
msg "Congradulation!\r\n  we've got our vendor data to\r\n "C:\data.txt"\r\n Thanks for using! "       
ret
       
       

data_b:
        msg "yes"
        jmp cont1
ret       
erra:
        ask "Error: ver > 10, continue handly?"
ret

提到的数据可以用key10.exe等工具生成最终的VENDERCODE.

如果真有需要,本人也可以把自己做的生成器发上来.


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

收藏
免费 7
支持
分享
最新回复 (81)
雪    币: 208
活跃值: (321)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
需要啊,把生成器发上来吧
2008-1-9 08:39
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
晕,我不知道有没有上传的权限.

呵呵,还好.原码我就不上传了,写得很乱.
上传的附件:
2008-1-9 21:17
0
雪    币: 208
活跃值: (321)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主说说使用方法吧,谢小娥
2008-1-10 08:42
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你是说什么的使用方法?
那脚本只要在OD里面执行就可以了,会自动生成数据到C:\data.txt.
     生成的文件里面有VENDER NAME, 加密的VENDERCODE. 和重新生成KEY5用的随机密码,最后是一段反汇编的源程序,里面就是Y5生成用的移位顺序.
    有这些就可以生成VENDERCODE了.
    不过只能对付没有ECC的....
   
   那个KEYGEN可以做重新生成工作. 之前曾经看到脸说是自己做的MAKEKEY生成的LICENSE不能通过自己的(做MAKEKEY同时生成的DAEMON)的验证,我想原因可能是他们只生成了一对加密种子, 我这里生成的是2对加密种子,一对是用在MAKEKEY上的,一对是用在DAEMON上的(生成MAKEKEY的时候FLEXLM自动会处理,不用自己选择)
   用导入文件的格式很简单,就是按data.txt的前面到key4为止, 后面是一行版本,如9.2B就写
902(9.0,B),再后面是上述文件里面的MAGIC4, 然后是移位顺序, *8,*4,*2,*1.

一个我试验的DAEMON撮的数据如下:

c:\data.txt:

prflexd            
4
a1162d59
49209a94
6a93b3ec
d577e5b0
3f3d9d1f
945a9c32
9
39300020
302e
5059772
64286a4c
0
3
1
10
16
1f
adea8e72
4069a9ed
5d6b6335
b302987b
0
0

magic_4:  
38115f7f

can't get turns directly,so just dump the asm-code:

0FBE45 D8
movsx eax,byte ptr ss:[ebp-28]
D1E0
shl eax,1
0FBE4D D9
movsx ecx,byte ptr ss:[ebp-27]
C1E1 03
shl ecx,3
0BC1
or eax,ecx
0FBE55 DA
movsx edx,byte ptr ss:[ebp-26]
0BC2
or eax,edx
0FBE4D DB
movsx ecx,byte ptr ss:[ebp-25]
C1E1 02
shl ecx,2
0BC1
or eax,ecx
8B55 FC
mov edx,dword ptr ss:[ebp-4]

*****************************
lmgenkey可以导入的文件

注意: 从prflexd开始,没有任何其他附加
*******************************
prflexd            
a1162d59
49209a94
6a93b3ec
d577e5b0
3f3d9d1f
945a9c32
902
38115f7f
3142
ok
***************

生成的数据(保存到文件的)

\************************************************
* Vendor_Code for            prflexd Ver:9.0C        *
* re-generated with LMKEYGEN Wver:2.0                *
* Thu Jan 10 19:49:06                                *
*                         _by tylon                 *
************************************************\

Uses file_in : prf.txt

#define VENDOR_NAME  "prflexd"

#define ENCRYPTION_SEED1 0x568D25EB
#define ENCRYPTION_SEED2 0xBEBB9226
#define ENCRYPTION_SEED3 0x2F852D92
#define ENCRYPTION_SEED4 0xC7B39A5F

#define VENDOR_KEY1 0x0E49CF64
#define VENDOR_KEY2 0xB8CB932E
#define VENDOR_KEY3 0x53F3F782
#define VENDOR_KEY4 0xF080E2B2
#define VENDOR_KEY5 0x4773BA84

\***********************************\
#define  CRO_KEY1 0x55C207A8
#define  CRO_KEY2 0x9E4587B8
\***********************************\
\********  for review only  ********\
kcksum[0] =:         0x37FFBBFE
kcksum[1] =:         0x04008029
kcksum[2] =:         0x40020000
kcksum[3] =:         0x03EEA001
VNAME_CKS =:         0x03FE

EFA的数据库保存的就是上面的KCKSUM,呵呵,一个很直接的VENDERKEY
2008-1-10 19:52
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
对了,需要补充一点:
  上面生成的两对加密种子,KEY1/2和KEY3/4也许应该反过来,即:

#define ENCRYPTION_SEED1 0x2F852D92
#define ENCRYPTION_SEED2 0xC7B39A5F

#define ENCRYPTION_SEED3 0x568D25EB
#define ENCRYPTION_SEED4 0xBEBB9226

由于很久没有做过LICENSE了,也没有8.1以上的SDK,所以懒得再试.
呵呵
2008-1-10 20:02
0
雪    币: 208
活跃值: (321)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
非常感谢,这个先收藏了,好好学学,在此感谢atylon!
2008-1-10 22:38
0
雪    币: 539
活跃值: (257)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
确实不错,谢谢分享
2008-1-12 09:39
0
雪    币: 235
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
對於magic 4這資料是什麼,不清楚,樓主可否提供相關資料以助了解,謝謝
2008-1-15 07:47
0
雪    币: 206
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
你所抓的只是VERNDOR CODE,还没有VERDOR JOB,所以没法判断你的ENSEED是否正确。不过可以肯定的是你的VENDOR_KEY5和CROKEY是错误的,从你的结构可以算出:
#define VENDOR_NAME  "prflexd"
#define VENDOR_KEY1 0x0E49CF64
#define VENDOR_KEY2 0xB8CB932E
#define VENDOR_KEY3 0x53F3F782
#define VENDOR_KEY4 0xF080E2B2
#define VENDOR_KEY5 0x3e7bb2fd

#define  CRO_KEY1 0x05059772
#define  CRO_KEY2 0x64286a4c

ENSEED3/4是ECC里面用的,非ECC是没有的,在7.2里面可以算,但是很需要时间,在8.1及以后的版本是不能算的,它不存在DEAMON里面。而ECC的逆运算,,,,呵呵,大家都知道了。。。
2008-1-15 15:24
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
呵呵,遇到高手了.

不过10楼的这位老兄你看清了吗?抓到的内容里面有JOB的随机MAGIC,以及移位顺序.这就够了.
实际上所谓的JOB动态生成KEY5就是逆序计算VENDER名字,然后按移位顺序重新组合后与上述随机MAGICXOR. 每次重新生成DAEMON的时候这个随机MAGIC都不同,不过生成了就不变了.

我不知道10楼的老兄是怎么算KEY5的,如果你没有JOB的话?

CRO key是明码存放的.抓出来就是.
实际上没必要自己去生成(我做这个的时候是8.0刚刚出来的时候,还很少有见到CRO KEY的)
所以当时就加了一个根据VENDER名自动计算的CRO.
呵呵,只要生成的时候能通过就行.
2008-1-15 20:30
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
关于这里的MAGIC4是我自己命名的,由于要跟(我自己)早期东西兼容,所以一直没有与其他人发表的进行过统一.呵呵

具体地说,这MAGIC4就是在6.1以后的版本中lm_new.c文件中的l_36new_buf里面出现的那个随机数. 呵呵,把这个文件帖上来太大了.为清楚起见,把我源程序的定义帖在这里,看了就在于清楚了.

BOOL tl_setmagic(unsigned long mag[5], int flmver, unsigned long m4)
{
        switch (flmver)
        {
        case(3):
        case(4):
                mag[0] = 0xa8f38730;
                mag[2] = 0xcf53fa74;
                break;
        case(5): // version 5, 5.12
                mag[0] = 0xa8f38730;
                mag[2] = 0x58A340F2;
                break;
        case(6): // version 6.0, 6.1
                mag[0] = 0xa8f38730;
                mag[2] = 0x1504C935;
                mag[3] = m4                          ;       
                break;
        case(7): // version 7.0
                mag[0] = 0x7648b98e          ; // normal magic1
                mag[1] = 0xd0e83b58          ; // for CROkey_cksum  with CRO != 0
                mag[2] = 0x788f71d2          ; // for vendor_cksum  along with magic2
                mag[3] = m4                  ;       
                mag[4] = 0x08bc0ef8          ; // for key5 re_generation
                break;
        case(8): // version 8.0
                mag[0] = 0x6f7330b8          
                mag[1] = 0x2a82355a          
                mag[2] = 0x3cde3ebf          
                mag[3] = m4                               
                mag[4] = 0x08bc0ef8          ; // same as V7
                break;
        case(9): // version 9.0 not valid yet
                mag[0] = 0x6f7330b8          
                mag[1] = 0xf023fe01          
                mag[2] = 0x72346b53         
                mag[3] = m4               
                mag[4] = 0x08bc0ef8          ; // same as V7
                break;
        case(10): // version 10.0 not valid yet
                mag[0] = 0x6f7330b8          
                mag[1] = 0x1548463a          
                mag[2] = 0x5332322f          
                mag[3] = m4               
                mag[4] = 0x08bc0ef8          ; // same as V7          
                break;
        case(11): // version 11.0 not valid yet
                mag[0] = 0x6f7330b8          ; // normal magic1
                mag[1] = 0x1BEC6235          ; // for CROkey_cksum  with CRO != 0
                mag[2] = 0x0EBE86632            ; // for vendor_cksum  along with magic2
                mag[3] = m4                  ;       
                mag[4] = 0x08bc0ef8          ; // for key5 re_generation; same as V7
                break;
        default:
                printf ("Unknown version.\n");
                exit(1);
        }
        return 0;
}
2008-1-15 20:50
0
雪    币: 47
活跃值: (33)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
确实不错,谢谢分享
2008-1-15 21:21
0
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
这个东西具体如何使用?能说下吗?我是初者!
2008-1-15 23:30
0
雪    币: 206
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
仔细看了一下,你抓的好象是lc_init的数据,也就是加密的verdorcode,你能从加密的verdorcode还原为真正的verdorcode,看来不错,你的算法也跟网上流传的不同。
KEY5它与KEY1---KEY4及VERDOR NAME有关,还跟GLSEED这个参数有关,具体你可以参考前辈的程序。
CROKEY是用在ECC里面的CKSUM,只要你CKSUM!=0,CROKEY就可以编译通过,但是与具体的ECC是不同的,照你这么说随便生成一对就可以了,那还不如全部设为FFFFFFFF,事实上CROKEY是存在于verdorcode中。所以,不需要你随便生成。如果非要自己生成,那也是有算法的,可以参考NB的原程序,如果你逆向很厉害的话,还可以反编译LONG大虾的lmkg.exe。。。
2008-1-16 09:29
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
呵呵. CROKEY当然不是随便生成的. 是根据DAEMON中的ECC验证码逆算出来的. 这些码至少在早期的DAEMON中是静态存贮的. 当初做这个把时候查过V7/V8的,验算CROKEY的码都是一样的,因此就可以自己生成了. V9以后的我没有去查过,因为说实在的,CROKEY没用,呵呵.

至于本人的KEY5和加密SEED算法, 实际上确实只需要抓到INIT的就够了,甚至只要抓到静态的明码(有些DAEMON至今还有,呵呵,比如CADENCE10.8)

因此,可以说,用本人的生成器,根本不需要去抓你们说的那个JOB数据!只要在LC_INIT抓到 VENDERCODE(是经过XOR的,不需要真正的,呵呵), 我用的MAGIC4和移位顺序都可以静态反汇编得到.支部跟踪它只是省掉了人工找的麻烦. 呵呵,其实人工找也很简单,只要找到一大堆CALL TIME的那个SUB_ROUTING就行了. MAGIC4和移位顺序都在那儿.你也可以自己跟跟看看,程序是怎么算的.  
至于我的算法跟网上流传的不同,那是因为我做这个把时候V6.1刚刚出来,CRACKZ都还没有开始有FLEXLM的帖,只有FRAVIE(呵呵,记不清了)有讨论.所以各自的方法会不同,呵呵.我自己觉得,我的这种抓数据比你们抓JOB要简单,要抓JOB至少需要一个LICENSE,而我这种抓法不需要,呵呵.
2008-1-16 23:01
0
雪    币: 206
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
喔瑟,原来是位老前辈啊!!!致敬。。。。
2008-1-17 09:00
0
雪    币: 206
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
hi, atylon,
经检验,你的工具也可以用在V10和V11版本上。
01471150    55              push    ebp
01471151    8BEC            mov     ebp, esp
01471153    83EC 2C         sub     esp, 2C
01471156    C745 FC 729A192>mov     dword ptr [ebp-4], 26199A72 <------你的magic4,EFA里面叫UNIQUE
0147115D    C745 F8 0300000>mov     dword ptr [ebp-8], 3
01471164    8B45 0C         mov     eax, dword ptr [ebp+C]

014714B5    0FBE55 D8       movsx   edx, byte ptr [ebp-28]
014714B9    C1E2 03         shl     edx, 3     〈--------你的-4值,EFA叫order 0=3
014714BC    0FBE45 D9       movsx   eax, byte ptr [ebp-27]
014714C0    D1E0            shl     eax, 1        <--------order1=1(your -3)
014714C2    0BD0            or      edx, eax
014714C4    0FBE4D DA       movsx   ecx, byte ptr [ebp-26]
014714C8    C1E1 02         shl     ecx, 2     <--------order2=2 (your-2)
014714CB    0BD1            or      edx, ecx
014714CD    0FBE45 DB       movsx   eax, byte ptr [ebp-25]
014714D1    0BD0            or      edx, eax   <-------order3=0(your -1)
014714D3    8B4D D4         mov     ecx, dword ptr [ebp-2C]

verdor strurect:
00000004
5B203EAE
D3EF11C4
E1615216
D4232200
6C4D616A
2AB6D87F
0004000B
31310000
0000302E
2FA52EA7
CC6D223F
00000000
00000002
00000002
00000000
00000016
最后算得:
#define VENDOR_NAME  "ALDEC"

#define ENCRYPTION_SEED1 0x09379235  〈——————————????
#define ENCRYPTION_SEED2 0x81F8BD5F   〈------------------------????
#define ENCRYPTION_SEED3 0x4E3F9A72    〈---------------其实就是SEED1
#define ENCRYPTION_SEED4 0xC6F0B518    〈--------------其实就是SEED2

#define VENDOR_KEY1 0xAC9910AF
#define VENDOR_KEY2 0x9F9F2CBC
#define VENDOR_KEY3 0x64BD6FD1
#define VENDOR_KEY4 0x674E9787
#define VENDOR_KEY5 0x6E357D93         〈------错误的KEY5值

\***********************************\
#define  CRO_KEY1 0x62011861
#define  CRO_KEY2 0xCF26AB66
\***********************************\
\********  for review only  ********\
kcksum[0] =:         0x37FFBBFE
kcksum[1] =:         0x04000029
kcksum[2] =:         0x40020100
kcksum[3] =:         0x03EEA001
VNAME_CKS =:         0x02BD

有个问题:
#define ENCRYPTION_SEED1 0x09379235  〈——————————????
#define ENCRYPTION_SEED2 0x81F8BD5F   〈------------------------????
这个是你自己生成的吗???
2008-1-25 17:15
0
雪    币: 165
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
版主我可以运行你的脚本也产生了 data.txt文件了 但是文件里面那段汇编是用来找移位循序的数吗?怎么运行它,来找移位数字?我的那段汇编如下:
0FBE45 D8
movsx eax,byte ptr ss:[ebp-28]
D1E0
shl eax,1
0FBE4D D9
movsx ecx,byte ptr ss:[ebp-27]
C1E1 03
shl ecx,3
0BC1
or eax,ecx
0FBE55 DA
movsx edx,byte ptr ss:[ebp-26]
0BC2
or eax,edx
0FBE4D DB
movsx ecx,byte ptr ss:[ebp-25]
C1E1 02
shl ecx,2
0BC1
or eax,ecx
8B55 FC
mov edx,dword ptr ss:[ebp-4]
怎么来弄呢?

请帮忙指点一下
2008-1-30 10:16
0
雪    币: 244
活跃值: (28)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
20
呃都是高手,小菜鸟我只能帮顶一下了,非常感谢前辈们提供这些工具,我们晚辈只能苦练基本功了
2008-2-4 10:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
有一个软件(在附件中上传)flexlm 9.0 保护,总得不到正确的seed ,请大家帮一个忙,解一下
2008-2-20 16:34
0
雪    币: 135
活跃值: (191)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
楼上的还在做TB的license啊?

Autokonline.exe是M3的应用程序。
2008-2-21 08:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
是的,原来的license已经过期了,无钱更换,你有吗,能否提供一个,seed能给吗,
2008-2-21 11:13
0
雪    币: 193
活跃值: (410)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
楼主能否给出一个具体的使用方法?我在OD里面一使用就死机,并且针对不同软件死机的原因还不一样。我是入门者,请楼主多多指教。
2008-2-28 19:48
0
雪    币: 148
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
flexlm好深奥哈
2008-3-12 11:52
0
游客
登录 | 注册 方可回帖
返回
//