首页
社区
课程
招聘
查找FLEXLM ECC公钥在文件中位置的快捷方法
发表于: 2018-11-21 14:11 16100

查找FLEXLM ECC公钥在文件中位置的快捷方法

2018-11-21 14:11
16100
我们一直在尝试查找FLEXLM ECC公钥在加密保护文件中存储位置并尝试用自己的公钥替换,从而达到可以使用自己制作的许可之目的。但FLEXLM发展到11.12版本以后给原来已经形成的替换方法和程序带来了挑战,基本上对高于11.12版本的文件无法完成正常替换。本人参考前期各位大神的研究成果,经过长时间分析终于找到了对付FLEXLM高版本的快捷方法。

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

最后于 2018-11-21 15:53 被yangmyron编辑 ,原因:
上传的附件:
收藏
免费 5
支持
分享
最新回复 (55)
雪    币: 6117
活跃值: (6761)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
为了大家能够理解其中使用的原理(即快速定位函数l_n36_buf,直接反编译来快速实现ECC定位),现把原来写的学习心得再次附上供大家参考。这个续篇算是对11.11以上的版本有个交代吧,原楼主已多年没更新了。当然新方法也适用于老版本的FlexLM文件。
最后于 2018-11-21 16:14 被yangmyron编辑 ,原因: 添加说明
上传的附件:
2018-11-21 15:46
1
雪    币: 3797
活跃值: (769)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
请问下如果license文件加密了有没什么好办法?
2018-11-21 18:38
0
雪    币: 8911
活跃值: (5136)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jgs
4
收藏,进行学习,谢谢楼主提供
最后于 2018-11-21 18:45 被jgs编辑 ,原因:
2018-11-21 18:44
1
雪    币: 6117
活跃值: (6761)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5

对于x64守护神文件的特征码我没有过多提醒,这里做些补充:

1)为什么是“arg_28          = qword ptr  30h”?因为我们知道我们要定位的函数有6个传递参数,形如“signed __int64 __fastcall sub_140071280(_BYTE *a1, _WORD *a2, int a3, unsigned __int8 *a4, unsigned int a5, _DWORD *a6)”,在64位程序里正好对应“arg_28          = qword ptr  30h”,当然在32位程序里对应“var_4C          = dword ptr -4Ch”。如果紧跟此特征码的后面还有其它参数变量,肯定不是我们要找的函数。

2)如何确定它前面的特征码?因为该函数代码较长,需要的中间变量很多,所以此段会较长,程序会超过50个变量。如果你没有找到特征码“var_C8          = dword ptr -0C8h”,可以试试找“var_A8          = dword ptr -0A8h”。这可能与其使用一组ECC还是两组ECC公钥有关。另外该函数F5反编译时的耗时较长,这也是特征之一。

下面给个某11.15版的例子,大家可以感受一下(该程序只用1组ECC公钥)。这个文件用参考资料3的工具是查不出来的:)

.text:0000000140071280
.text:0000000140071280 ; =============== S U B R O U T I N E =======================================
.text:0000000140071280
.text:0000000140071280
.text:0000000140071280 sub_140071280   proc near               ; DATA XREF: .data:off_1402611A8↓o
.text:0000000140071280                                         ; .pdata:000000014029B664↓o
.text:0000000140071280
.text:0000000140071280 var_A8          = dword ptr -0A8h
.text:0000000140071280 var_A4          = byte ptr -0A4h
.text:0000000140071280 var_A3          = byte ptr -0A3h
.text:0000000140071280 var_A2          = byte ptr -0A2h
.text:0000000140071280 var_A1          = byte ptr -0A1h
.text:0000000140071280 var_A0          = byte ptr -0A0h
.text:0000000140071280 var_9F          = byte ptr -9Fh
.text:0000000140071280 var_9E          = byte ptr -9Eh
.text:0000000140071280 var_9D          = byte ptr -9Dh
.text:0000000140071280 var_9C          = byte ptr -9Ch
.text:0000000140071280 var_9B          = byte ptr -9Bh
.text:0000000140071280 var_9A          = byte ptr -9Ah
.text:0000000140071280 var_99          = byte ptr -99h
.text:0000000140071280 var_98          = byte ptr -98h
.text:0000000140071280 var_97          = byte ptr -97h
.text:0000000140071280 var_96          = byte ptr -96h
.text:0000000140071280 var_95          = byte ptr -95h
.text:0000000140071280 var_94          = byte ptr -94h
.text:0000000140071280 var_93          = byte ptr -93h
.text:0000000140071280 var_92          = byte ptr -92h
.text:0000000140071280 var_91          = byte ptr -91h
.text:0000000140071280 var_90          = byte ptr -90h
.text:0000000140071280 var_8F          = byte ptr -8Fh
.text:0000000140071280 var_8E          = byte ptr -8Eh
.text:0000000140071280 var_8D          = byte ptr -8Dh
.text:0000000140071280 var_8C          = byte ptr -8Ch
.text:0000000140071280 var_8B          = byte ptr -8Bh
.text:0000000140071280 var_8A          = byte ptr -8Ah
.text:0000000140071280 var_89          = byte ptr -89h
.text:0000000140071280 var_88          = byte ptr -88h
.text:0000000140071280 var_87          = byte ptr -87h
.text:0000000140071280 var_86          = byte ptr -86h
.text:0000000140071280 var_85          = byte ptr -85h
.text:0000000140071280 var_84          = byte ptr -84h
.text:0000000140071280 var_83          = byte ptr -83h
.text:0000000140071280 var_82          = byte ptr -82h
.text:0000000140071280 var_80          = dword ptr -80h
.text:0000000140071280 var_7C          = dword ptr -7Ch
.text:0000000140071280 var_78          = dword ptr -78h
.text:0000000140071280 var_74          = dword ptr -74h
.text:0000000140071280 var_70          = dword ptr -70h
.text:0000000140071280 var_6C          = dword ptr -6Ch
.text:0000000140071280 var_68          = dword ptr -68h
.text:0000000140071280 var_64          = dword ptr -64h
.text:0000000140071280 var_60          = dword ptr -60h
.text:0000000140071280 var_5C          = dword ptr -5Ch
.text:0000000140071280 var_58          = dword ptr -58h
.text:0000000140071280 Dst             = byte ptr -50h
.text:0000000140071280 var_30          = byte ptr -30h
.text:0000000140071280 var_10          = qword ptr -10h
.text:0000000140071280 arg_0           = qword ptr  8
.text:0000000140071280 arg_8           = qword ptr  10h
.text:0000000140071280 arg_10          = dword ptr  18h
.text:0000000140071280 arg_18          = qword ptr  20h
.text:0000000140071280 arg_20          = dword ptr  28h
.text:0000000140071280 arg_28          = qword ptr  30h


上传的附件:
2018-11-22 11:32
2
雪    币: 276
活跃值: (167)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
其实找到这里就能找到关键的ECC patch的地方了 不需要替换 直接patch 然后license随便填
2018-11-22 14:45
0
雪    币: 6117
活跃值: (6761)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7

修改原来一些不正确的说法:

       如果现在我说你根本不用去记特征码找函数,对于x86的exe文件,FlexLM几乎所有版本的守护神文件用IDA反汇编后Length最长、Arguments为18(Locals为A8或A4等可变,位于.text节内,不能在.textidx节内)的那个函数就是我们需要的东东,你会不会打我?对于x64的守护神exe文件,也存在几乎所有版本的守护神文件用IDA反汇编后该函数Length最长、Arguments为30(Locals为C8、D8或E8等可变,位于.text节内,不能在.textidx节内)。只要我们在IDA的Function窗口内点击头上的Length排序,就会轻松找到该函数。

上传的附件:
2018-11-23 11:04
1
雪    币: 276
活跃值: (167)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
对于非ECC加密的12位短sign大家有什么好的patch方法吗?不想动态找seed,很麻烦。
2018-11-23 13:13
0
雪    币: 6117
活跃值: (6761)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
xj无敌 对于非ECC加密的12位短sign大家有什么好的patch方法吗?不想动态找seed,很麻烦。
我记得可以直接爆破,就修改一个字节
2018-11-23 16:30
0
雪    币: 26225
活跃值: (63302)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
10
感谢分享!
2018-11-23 16:36
1
雪    币: 276
活跃值: (167)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
yangmyron 我记得可以直接爆破,就修改一个字节
可以show下吗  学习下。
另外怎么调试daemon啊,我用的x64dbg 调试的时候说can't initialize。
2018-11-23 17:22
0
雪    币: 47147
活跃值: (20450)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
12
测试
最后于 2018-11-23 17:56 被kanxue编辑 ,原因:
2018-11-23 17:56
0
雪    币: 6117
活跃值: (6761)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
最后于 2018-11-24 11:16 被yangmyron编辑 ,原因:
2018-11-24 11:15
0
雪    币: 6117
活跃值: (6761)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
14
xj无敌 可以show下吗 学习下。 另外怎么调试daemon啊,我用的x64dbg 调试的时候说can't initialize。
改变命令行:" xxxx.exe" -T your-machine-name 11.9 -c license.dat
传的图片没显示
2018-11-24 11:21
1
雪    币: 2143
活跃值: (278)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
现在对有Trusted Stroage的验证有什么好办法么?比如SSQ已有破解的Lumerical,但是他们破解还是通过传统方式,(自己做了daemon?)
2018-11-24 13:53
0
雪    币: 2143
活跃值: (278)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
现在有用所谓SDT的,hook都不好办。
2018-11-24 14:30
0
雪    币: 276
活跃值: (167)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
邱zr 现在对有Trusted Stroage的验证有什么好办法么?比如SSQ已有破解的Lumerical,但是他们破解还是通过传统方式,(自己做了daemon?)
Trusted stroage指的是什么?狗吗?SSQ破解的软件是通过patch ecc的,daemon都是原文件,只patch了ecc然后加了个壳
2018-11-24 16:36
0
雪    币: 2143
活跃值: (278)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
xj无敌 Trusted stroage指的是什么?狗吗?SSQ破解的软件是通过patch ecc的,daemon都是原文件,只patch了ecc然后加了个壳
你以Trusted stroage FlexNet为关键词搜索一下。
lumerical如果想不用license server激活,应该是必须要通过Trusted Stroage授权,SSQ的做法像是绕了过去。这样有一个麻烦,有些软件的试用版或者买的单机版根本没有提供daemon,除非设法伪造daemon(我不知道是否可能)再爆破ECC,只能设法搞定这个。
2018-11-24 18:25
0
雪    币: 276
活跃值: (167)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
邱zr 你以Trusted stroage FlexNet为关键词搜索一下。 lumerical如果想不用license server激活,应该是必须要通过Trusted Stroage授权,SSQ的做法像 ...
你说的这个软件SSQ只patch了exe和daemon的ecc, 当然这个软件还有自校验,我和SSQ有过一些讨论。你说的Trusted stroage不太了解,我个人偏爱licesen server,主要是可以floating license。
2018-11-24 19:23
0
雪    币: 1250
活跃值: (3555)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
感谢分享!
2018-11-25 13:22
0
雪    币: 6117
活跃值: (6761)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
21

这个文件出的是ECC公钥的值(十进制,-=为补码)而不是虚拟地址??? 有大神明白为啥吗?

*((_BYTE *)Dst + 072) += 118;
*((_BYTE *)Dst + 073) -= 107;
*((_BYTE *)Dst + 074) -= 17;
*((_BYTE *)Dst + 075) += 87;
*((_BYTE *)Dst + 076) -= 52;
*((_BYTE *)Dst + 077) += 15;
*((_BYTE *)Dst + 078) -= 53;
*((_BYTE *)Dst + 079) -= 63;
*((_BYTE *)Dst + 080) -= 120;
*((_BYTE *)Dst + 081) -= 20;
*((_BYTE *)Dst + 082) -= 105;
*((_BYTE *)Dst + 083) -= 9; 
*((_BYTE *)Dst + 084) -= 80;
*((_BYTE *)Dst + 085) += 32;
*((_BYTE *)Dst + 086) -= 3; 
*((_BYTE *)Dst + 087) += 126;
                               
*((_BYTE *)Dst + 112) += 118;
*((_BYTE *)Dst + 113) -= 101;
*((_BYTE *)Dst + 114) += 59;
*((_BYTE *)Dst + 115) -= 101;
*((_BYTE *)Dst + 116) -= 21;
*((_BYTE *)Dst + 117) += 66;
*((_BYTE *)Dst + 118) -= 48;
*((_BYTE *)Dst + 119) += 83;
*((_BYTE *)Dst + 120) += 59;
*((_BYTE *)Dst + 121) -= 87;
*((_BYTE *)Dst + 122) += 121;
*((_BYTE *)Dst + 123) += 5; 
*((_BYTE *)Dst + 124) -= 96;
*((_BYTE *)Dst + 125) -= 79;
*((_BYTE *)Dst + 126) += 86;
*((_BYTE *)Dst + 127) -= 125;
*((_BYTE *)Dst + 128) += 51;
*((_BYTE *)Dst + 129) += 76;
*((_BYTE *)Dst + 130) -= 41;
*((_BYTE *)Dst + 131) -= 72;
*((_BYTE *)Dst + 132) -= 66;
*((_BYTE *)Dst + 133) -= 125;
                               
*((_BYTE *)Dst + 152) += 117;
*((_BYTE *)Dst + 153) -= 33;
*((_BYTE *)Dst + 154) -= 56;
*((_BYTE *)Dst + 155) += 51;
*((_BYTE *)Dst + 156) += 39;
*((_BYTE *)Dst + 157) += 10;
*((_BYTE *)Dst + 158) += 118;
*((_BYTE *)Dst + 159) += 14;
*((_BYTE *)Dst + 160) -= 37;
*((_BYTE *)Dst + 161) += 34;
*((_BYTE *)Dst + 162) -= 82;
*((_BYTE *)Dst + 163) += 110;
*((_BYTE *)Dst + 164) += 126;
*((_BYTE *)Dst + 165) -= 10;
*((_BYTE *)Dst + 166) -= 21;
*((_BYTE *)Dst + 167) += 113;
*((_BYTE *)Dst + 168) += 116;
*((_BYTE *)Dst + 169) += 76;
*((_BYTE *)Dst + 170) -= 52;
*((_BYTE *)Dst + 171) -= 2; 
*((_BYTE *)Dst + 172) -= 13;
*((_BYTE *)Dst + 173) += 51;
*((_BYTE *)Dst + 174) += 46;
*((_BYTE *)Dst + 175) -= 79;
*((_BYTE *)Dst + 176) -= 114;
*((_BYTE *)Dst + 177) -= 35;
*((_BYTE *)Dst + 178) += 34;
*((_BYTE *)Dst + 179) -= 11;
*((_BYTE *)Dst + 180) -= 114;
*((_BYTE *)Dst + 182) += 41;

最后于 2018-11-26 17:00 被yangmyron编辑 ,原因:
上传的附件:
2018-11-26 16:58
0
雪    币: 276
活跃值: (167)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
yangmyron 改变命令行:" xxxx.exe" -T your-machine-name 11.9 -c license.dat 传的图片没显示
试了下 还是不行


最后于 2018-11-30 22:31 被xj无敌编辑 ,原因:
2018-11-26 20:48
0
雪    币: 321
活跃值: (121)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
大神,在线激活那种flexnet publisher有什么办法吗?
2018-11-30 15:41
0
雪    币: 226
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
24
xj无敌 其实找到这里就能找到关键的ECC patch的地方了 不需要替换 直接patch 然后license随便填
请问这里应该如何修改?
2020-7-22 18:06
0
雪    币: 101
活跃值: (743)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
25
用楼主定位的方法,很容易找到l_pubkey_verify(),在函数开头或结尾  xor  eax, eax ; ret
如果清楚修改的地方,可以用ida反汇编后的图表流程查看,patch方法更是n种。祝你好运~
2020-7-24 16:12
1
游客
登录 | 注册 方可回帖
返回
//