能力值:
( LV9,RANK:330 )
26 楼
这个不改server xxx xxx_dongle=13744 7362
你只能带狗了,把dongle=13744 7362去掉!换网卡
能力值:
( LV2,RANK:10 )
27 楼
按网卡的方式构造如下的licesne文件:
SERVER 主机 网卡号(共12位) 27000
DAEMON xxx xxx.exe
INCREMENT 10007 xxx 30.000 1-jan-0 1 12345678901234567890 \
VENDOR_STRING=xxx
在守护程序中的算法的地址为cs:429cf2
cs:429ddc处可以找到seed1,seed1=eax=0x91827364
cs:429f38处可以找到seed2,seed2=eax=0x90187236
守护程序可以自动计算出密码,记下计算出的密码串。
记加下您虚构的license文件中密码串中的第2 4 6 8处的数值
(假设为2 4 6 8),将这四个数值插入到正确密码串的第2 4 6 8
处位置。
方法如下:
假设虚构的密码串为:12345678901234567890
* * * *(2 4 6 8处的值)
计算出的密码串为 :A72BA7E13EA5344B
正确的密码串为 :A27426B8A7E13EA5344B
* * * *(2 4 6 8处的值)
能力值:
( LV2,RANK:10 )
28 楼
Nothing special.
From the deamon program, the dongle isn't a must.
If the main program requires the dongle, because it only uses the RNBExtendRead function, patch is easy.
能力值:
( LV2,RANK:10 )
29 楼
感谢marstj和laoqian等专家的帮助,你们找的种子跟我跟踪到的是一样的,看来我没有找错,现在闲来无事,我在研究为什么找出的seed无法做出带狗的lic,哈哈!
能力值:
( LV2,RANK:10 )
30 楼
比如我带狗跟踪到的lic是
SERVER *** ***_DONGLE=13744 7362
DAEMON *** ***.exe
INCREMENT 10096 kcs 30.000 1-jan-0 99999 EDC3267C91CE18DB07EE \ VENDOR_STRING=***
但是用seed和SDK算出来的却是
SERVER *** ***_DONGLE=13744 7362
DAEMON *** ***.exe
INCREMENT 10096 kcs 30.000 permanent 99999 7DA376DC29D0C10E1C55 \ VENDOR_STRING=***
能力值:
( LV2,RANK:10 )
31 楼
to luj107:
您跟踪出的结果和用SDK计算出的都正确。
为什么密码不一样,因为计算密码有好几套算法,而您只跟踪到了一套。算法对license文件的处理就有多种方式,可以将VENDOR_STRING的信息转换为大写的串,这样可计算一套密码;也可以将VENDOR_STRING的信息转换为小写的串,这样也可以计算出一套密码;也可以保持其信息不变,又计算出一套密码。而在检验时,只要license文件中的密码与计算出的任一套相一致就可通过检测。您可以试着跟踪出其他的算法。(算法大都一样,只是把license文件中的信息作了不同的处理)
能力值:
( LV2,RANK:10 )
32 楼
to marstj
谢谢你的解释,这一点我在跟踪的时候也发现了,但是我用sdk算出的那个号码并不正确哦,Invalid license key (inconsistent authentication code)
能力值:
( LV2,RANK:10 )
33 楼
to marstj:
还有一个,如果换成sign的话,是不是跟踪的算法不同呢?
能力值:
( LV2,RANK:10 )
34 楼
To uj107:
标准的FlexLm对加密狗的识别用的是FLEXID=6-xxxx。用lmcryptgui.exe生成的lmcrypt程序,可以生成加密狗为FLEXID=6-xxxx的license文件。至于不能正确生成您的软件的license,是因
为XXX_DONGLE=13744在内存中的表示方式和lmcrypt程序识别的方式不一致。您可以将licesne文件中的硬件标识改为不同的形式,就可以分析出网卡号,磁盘序列号,ANY ,DEMO以及其他加密狗等在内存中的表示方式。真正的算法是不变的。对于用SIGN方式,计算的算法与不用SIGN方式的算法不一样,但两种算法所在的位置相差不远,其对licesne文件在内存中的数据的前8个字节的处理方式完全一致,方法都是为:8个字节xor seed(也为8个字节),并且共用同一段代码。找到这段代码后,您根据流程的走向应该可以找到处理处理SIGN=xxxxxx方式的代码和不用SIGN=xxxxxx方式的代码。如果您读通了程序,可以自己用高级语言写出计算licese的通用程序,只要更换不同的seed,就可以计算出不同产品的licesne,就像lmcryptgui.exe一样,lmcryptgui.exe需要的信息也只是vendor name和seeds。算法对flexlm v5.0 ~10都有效,当然对ECC除外。
能力值:
( LV9,RANK:330 )
35 楼
最初由 marstj 发布 按网卡的方式构造如下的licesne文件: SERVER 主机 网卡号(共12位) 27000 DAEMON xxx xxx.exe INCREMENT 10007 xxx 30.000 1-jan-0 1 12345678901234567890 \ VENDOR_STRING=xxx 在守护程序中的算法的地址为cs:429cf2 cs:429ddc处可以找到seed1,seed1=eax=0x91827364 cs:429f38处可以找到seed2,seed2=eax=0x90187236 守护程序可以自动计算出密码,记下计算出的密码串。 记加下您虚构的license文件中密码串中的第2 4 6 8处的数值 (假设为2 4 6 8),将这四个数值插入到正确密码串的第2 4 6 8 处位置。 方法如下: 假设虚构的密码串为:12345678901234567890 * * * *(2 4 6 8处的值) 计算出的密码串为 :A72BA7E13EA5344B 正确的密码串为 :A27426B8A7E13EA5344B * * * *(2 4 6 8处的值)
密码串中的第2 4 6 8处的数值 不明白是什么作用?
能力值:
( LV2,RANK:10 )
36 楼
to laoqian:
2 4 6 8处的值您可以任意给定。您虚构的licesne文件中如果
用的20位的密码,2 4 6 8位的值参与运算计算出的密码位为16位,
在形成正确的密码串时要保持2 4 6 8处的值不变(即虚构的是什么,在正确的license中就用什么,同样保持在2 4 6 8位置,这样正确的密码串也就为20位)
能力值:
( LV2,RANK:10 )
37 楼
hi, marstj
你所说的内存表示方式,我不太明白,是不是说要调试守护程序,并找到相关的东西吗?看样子xxx_dongle=13744已经不是标准的lic格式了.
哈哈,不要嫌我罗嗦哦,既然着手研究这个问题,所以就想搞清楚,谢谢你的指点
能力值:
( LV2,RANK:10 )
38 楼
to luj107:
:00429CE3 8B8D74FEFFFF mov ecx, dword ptr [ebp+FFFFFE74]
:00429CE9 83C101 add ecx, 00000001
:00429CEC 898D74FEFFFF mov dword ptr [ebp+FFFFFE74], ecx
:00429CF2 83BD74FEFFFF08 cmp dword ptr [ebp+FFFFFE74], 00000008
:00429CF9 7D2B jge 00429D26
:00429CFB 8B55F4 mov edx, dword ptr [ebp-0C]
:00429CFE 039574FEFFFF add edx, dword ptr [ebp+FFFFFE74]
:00429D04 33C0 xor eax, eax
:00429D06 8A02 mov al, byte ptr [edx]
:00429D08 8B8D74FEFFFF mov ecx, dword ptr [ebp+FFFFFE74]
:00429D0E 33D2 xor edx, edx
:00429D10 8A91801E4A00 mov dl, byte ptr [ecx+004A1E80]
:00429D16 33C2 xor eax, edx
:00429D18 8B8D74FEFFFF mov ecx, dword ptr [ebp+FFFFFE74]
:00429D1E 8881801E4A00 mov byte ptr [ecx+004A1E80], al
:00429D24 EBBD jmp 00429CE3
这是您提供的程序中计算license密码的一段代码。
请注意
:00429D06 8A02 mov al, byte ptr [edx]
该指令,ds:edx中的内容即为license文件的内容(密码串除外)经转换后
存放到内存中的内容,您应该可以分析出网卡,demo,加密狗等标识在
内存中的表示方式。
能力值:
( LV2,RANK:10 )
39 楼
哈哈,晕哦,确实找到了相关的内容,不过这之后呢?是不是再跟sign进行xor运算啊
能力值:
( LV2,RANK:10 )
40 楼
看来问题是越来越复杂了,脑子不够用了,以后再说了,哈哈!
能力值:
( LV2,RANK:10 )
41 楼
hi, marstj
我在woodmann网站有了一个新的发现,原文是这样的
My target is GC-Powerstation, it's proctection is Flexlm + Sentinel Dongle.
Flexlm uses LM_A_VENDOR_ID_DECLARE to change HOSTID to GC_DONGLE ID (ex. HOSTID=GC_DONGLE=1234 ).
If I make a license which HOSTID=ANY, the program can't pass.
How can I crack this target
我看我这个软件跟他的非常相似,也就是说也使用了LM_A_VENDOR_ID_DECLARE,这个是不是应该在l_new_hostid函数上跟踪呢?
能力值:
( LV9,RANK:330 )
42 楼
顶了,我不搞破解了,但是喜欢,没有整块的时间,哎!愿你解决他!
能力值:
( LV2,RANK:10 )
43 楼
If you check the "lm_attr.h" from any version of flexlm sdk. You can find the interesting thing as follow:
#define LM_A_VENDOR_ID_DECLARE 58 /* set: PTR to LM_VENDOR_HOSTID struct*/
/* get: PTR to LM_VENDOR_HOSTID_PTR */
From the daemon "kcs.exe", Use "bp _lc_set_attr" several times, you will find
.text:0040D1E2 push eax
.text:0040D1E3 push 3Ah -->(decimal 58)
.text:0040D1E5 push dword_4A4A80
.text:0040D1EB mov esi, offset sub_40D02E
.text:0040D1F0 mov [ebp+var_10], offset aKcs_dongle ; "KCS_DONGLE"
.text:0040D1F7 mov [ebp+var_C], 3E9h
.text:0040D1FE mov [ebp+var_4], esi
.text:0040D201 call _lc_set_attr
.text:0040D206 add esp, 18h
.text:0040D209 mov edi, offset aLm_a_vendor_id ; "LM_A_VENDOR_ID_DECLARE FAILED"
.text:0040D20E test eax, eax
.text:0040D210 jz short loc_40D220
能力值:
( LV2,RANK:10 )
44 楼
最初由 ericliu 发布 If you check the "lm_attr.h" from any version of flexlm sdk. You can find the interesting thing as follow: #define LM_A_VENDOR_ID_DECLARE 58 /* set: PTR to LM_VENDOR_HOSTID struct*/ /* get: PTR to LM_VENDOR_HOSTID_PTR */ ........ LM_A_VENDOR_ID_DECLARE FAILED,跟踪了半天是这个结果,怎么回事啊?
能力值:
( LV2,RANK:10 )
45 楼
研究了2天的9.2源代码,终于将问题搞定了,在此还是要谢谢marstj
和laoqian等高手的帮助