首页
社区
课程
招聘
[原创]Flexnet通关后传-license文件自动部署解决方案
2020-12-5 10:49 12229

[原创]Flexnet通关后传-license文件自动部署解决方案

2020-12-5 10:49
12229

Flexnet通关后传-license文件自动部署解决方案
前言: 感谢前人的工作,厉害了我的谁、laoqian、方向感、NoFlexlm、yangmyron等前辈大牛,这里不一一列举了。
原本以为Flexnet研究成功后,万事大吉,谁知后面的License文件管理也大为头疼。定期更新License文件也需要大量的时间,而且替换截止日期、生成SIGN字符串等很多都是重复性的操作,不胜其烦。本文不介绍Flexnet的知识,分享了一套自动部署系统的开发和实践过程,供参考。
严格地讲,本文不属于逆向,但是因逆向而生,所以放在本主题,不妥请版主帮忙揶下。

 

准备工作
【Flexnet界第一神器】lmcrypt.exe,更新签名
【开发语言】C#或python,开发License文件生成图形界面软件
【部署工具】Jenkins,用于持续集成,实现自动部署
【发布工具】wingFtp,一个可以针对不同用户账号管理的FTP/sFTP软件
【目标】摆脱乏味重复劳动,定期自动发布License文件给不同的用户账号

 

第一步,编辑License文件
整理原始License文件形成模板。在图形界面软件CreateLic.exe(以下简称CreateLic.exe)中读取模板文件,并完成日期替换、HostID编辑等动作,从而生成新的License文件。此时新License文件中的签名SIGN还是旧的,无效的。

 

第二步,更新签名SIGN
将新License文件拖到lmcrypt.exe软件上,更新签名SIGN。当然,为了实现自动部署功能,这个更新过程也要合并到CreateLic.exe中。
C#可以利用process类调用外部程序以及执行DOS命令。

1
2
3
4
5
6
7
8
9
10
System.Diagnostics.Process proc = new System.Diagnostics.Process();
    proc.StartInfo.FileName = "\"" + “CreateLic.exe”+ "\""; //程序名
    proc.StartInfo.Arguments = "\"" + strArgs + "\"";//执行参数                                                  
       为了美观,可以隐藏运行过程中的DOS窗口。
       proc.StartInfo.UseShellExecute = false;
       proc.StartInfo.CreateNoWindow = true;
    如果需要调试,可以用以下语句显示运行过程中的DOS窗口信息。
    // proc.StartInfo.UseShellExecute = true;
    // proc.StartInfo.CreateNoWindow = false;
        process.Start();  //执行

到这里,CreateLic.exe基本功能开发完成,但是还不够,因为第一步和第二步的工作只考虑了生成单个文件的情况,而实际生产中有一批批的License文件需要生成。

 

第三步,批量生成License文件
批量生成功能主要是管理生成License文件前的参数。我们将需要设置的参数统一放在配置文件中。配置文件格式可以用INI、XML或TXT,甚至是SQLite、MySQL数据库。操作数据库时,用“动软代码生成器”自动生成数据库三层结构代码,可以大大简化开发流程。完成参数设置后,一键批量生成可用的License文件,这个批量生成功能是本自动部署系统的关键,也要合并到CreateLic.exe中。
注:“动软代码生成器”是一款国产优秀的数据库代码生成软件,使用界面很友好,上手很快。软件集成了微软T4模板语言引擎,支持模板自定义,可自定义生成C#/VB/PYTHON等各类代码。目前已停止维护,网上有一份低版本的开源代码,最后一版是v2.78。

 

第四步,增加命令行功能
之前的CreateLic.exe都是在图形界面下操作的,方便手动生成。但是地球人都知道,自动化操作是需要命令行的。为此,我们的CreateLic.exe也增加命令行功能。
在C#工程的program.cs文件中,编写支持命令行参数的代码。

1
2
3
4
5
6
7
8
9
10
11
static void Main(string[] args)  //增加命令行参数
{
if (args.Length == 0)
{
        Application.Run(new Frm1()); //无命令参数,运行默认图形程序
    }
    else
    {
        Application.Run(new Frm1(args)); //有命令参数,解析命令行
}
}

在Frm1.cs文件中修改两个与命令行有关的初始类和默认加载类。

1
2
3
4
5
6
7
8
9
10
11
string[] gArgs = null;  //定义全局的命令参数
    public Frm1()
        {
            InitializeComponent();           
        }
    public Frm1(string[] args)  //重载
        {
            InitializeComponent();
            this.gArgs = args;
            Console.WriteLine(" start!");
        }

默认加载类Frm1_Load()中,别忘记了使用“this.Close();”关闭图形界面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void Frm1_Load(object sender, EventArgs e)
     {                     
 
         if (this.gArgs == null) return;
         switch (this.gArgs .Length)
         {
             case 0:
                 break;
             case 1:
                 //生成License文件,省略具体代码
                 this.Close(); //关闭图形界面
                 break;             
             default:
                 break;
         }

顺带提一下,解析命令行参数时,可以使用林选臣大神写的方法。命令行输入--lindexi doubi,就可以得到doubi。这个方法不需要安装任何的库,性能很高,但是封装不好,足够我们日常使用了。

 

第五步,CreateLic.exe完善
至此,我们的CreateLic.exe开发完成。为便于实施无人执守的自动部署功能,还应该在正常的程序运行中增加日志记录。为此,可以引进log4net.dll,对日志进行分级记录和控制。

 

第六步,部署License文件存放服务
使用wingFtp创建用户账号和工作文件夹,并开通sftp协议监听。不要使用ftp协议监听,因为如果wingFtp软件部署在云服务器上,可能面临主动ftp模式和被动ftp模式的折腾。这样,每个用户都可以登录到自己的sFTP账号名下,获取各自的License文件。

 

第七步,自动部署功能
因每隔一段时间License文件会失效,经常我们需要定期批量更新。为此,我们借助Jenkins软件来实现甩手掌柜的最后一步。Jenkins软件有很多插件扩展功能,非常适合于持续集成。且Jenkins支持多种部署方式,部署便捷,使用界面十分友好,上手很快。自动部署功能工作过程如下:
1)【可选,方便集成】Jenkins通过SVN/Git获取CreateLic.exe;
2)Jenkins调用CreateLic.exe生成新License文件;
3)通过Publish over SSH插件,发布新License文件到各sFTP账号下;
4)【可选】Jenkins重启License服务器,更新License文件;
5)邮件通知各ftp账号用户。
配置构建触发器,定期自动触发上述部署过程。为方便集成,我们可以提交CreateLic.exe源码到SVN/Git,并编写编译脚本。如果再在Jenkins中增加一个CreateLic.exe系统测试Project,那就实现了从源码管理到生产部署的全套持续部署系统了,此是后话。

 

不过,如果在局域网中,使用windows-“系统工具”自带的“任务计划程序”实现定时运行,发布到共享文件夹,一样可以实现本方案的定时自动部署的功能。和本方案相比,优点是简单快捷,缺点是部署出错的话不好监控。

 

通过以上步骤,一套License文件自动部署系统就开发和搭建完成。后面有新的License需求时,我们只需要维护CreateLic.exe参数文件和Jenkins配置,大侠们又可以腾出手脚去攻克Flexnet难题了。


阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

最后于 2020-12-9 20:31 被tcy027编辑 ,原因:
上传的附件:
收藏
点赞4
打赏
分享
最新回复 (9)
雪    币: 101
活跃值: (743)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
tcy027 2020-12-6 10:54
2
1
第一次发原创,供交流。不周到的地方还请海涵。
雪    币: 5381
活跃值: (6002)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
yangmyron 2020-12-8 11:31
3
0
生生把自己干成了软件供应商
雪    币: 101
活跃值: (743)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
tcy027 2020-12-9 08:58
4
0
yangmyron 生生把自己干成了软件供应商[em_13]
您也应该出现在前言中的,参考了您不少文章!
这么说确实哈,恰如其分了。不过这个功能也是一点点完善,至少修改了20个版本,才最终稳定下来。
雪    币: 101
活跃值: (743)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
tcy027 2020-12-9 09:09
5
0
逆向彻底一点,把上游供应也逆向了
雪    币: 1421
活跃值: (3271)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
方向感 2021-1-10 17:03
6
0
许可时间改长点不行么?或者是永久的
雪    币: 101
活跃值: (743)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
tcy027 2021-1-11 09:19
7
0
方向感 许可时间改长点不行么?或者是永久的[em_1]
为了与原厂家的lic习惯保持一致,顺带给自己来个小挑战。
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
cyh_cs 2022-10-10 13:38
8
0
tcy027 为了与原厂家的lic习惯保持一致,顺带给自己来个小挑战。
工具可以分享吗?
雪    币: 101
活跃值: (743)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
tcy027 2023-2-13 14:03
9
0
cyh_cs 工具可以分享吗?
源码其实就在文中了。把文中的代码连起来,就是工具。
雪    币: 4
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_djskddce 2024-2-20 09:56
10
0
tcy027 第一次发原创,供交流。不周到的地方还请海涵。
大佬我破解了一个软件,Lic管理器和软件内部都可以识别到我的lic,但是对应功能却没有解锁可否分析一下
游客
登录 | 注册 方可回帖
返回