1、申 请 I D :没方向感
2、个人邮箱:zsj008od@sina.com
3、原创技术文章:
看雪ID:方向感,已在看雪论坛给hmilywen发一条短消息:)
本想申请“方向感”这个id的,好像被占用了,不知道是不是多年前自己占用的,那就重新申请一个吧。
看雪精华帖:flexlm程序替换pubkey制作license的血泪史 和 对 .net程序进行手术的一点小小心得:)
[原创]flexlm程序替换pubkey制作license的血泪史
[C] 纯文本查看 复制代码
多年前这个软件都是直接爆破的,程序在lc_checkout的时候会调用setjmp,直接修改这里跳转,让他返回0,实现了不要lic也可以直接运行程序。
if (setjmp(job->jobcatch))
return 0;
补丁的程序太多,setjmp在msvcrxx.dll中,直接修改msvcrxx.dll的setjmp3,在里面判断调用进程是不是需要补丁的程序,是就直接返回0,否还是继续执行setjmp3.用这个方法实现了不修改程序就破解了。
多年后的今天,翻看论坛前辈留下的宝贵资料,结合sdk源码,奋斗了多少个日日夜夜,终于重新对这个软件打了补丁,作出了注册机。
大概方法就是手动或用程序替换程序的pubkey,(当然你也可以直接修改l_pubkey_verify,直接返回0,只要lic格式跟原版一致,例如将一个试用lic的试用时间往后修改一下,程序就能运行。)找到ENCRYPTION_SEED1/2,修改sdk代码,生成lmcrypt就行了。
pubkey的手动替换,请仔细阅读ECC替换公钥实践,这个方法适用于任何版本,pubkey分布在lm_new.c中,里面夹杂了大量的垃圾代码,通过asm搜索,再F5,很容易找到这些pubkey,替换成你自己生成的pubkey,然后制作一个dif文件,自动替换,如:
This difference file has been created by IDA Pro
0039F0F8: 76 76
0039F6F4: 13 cf
0039F294: 42 27
0039F068: 26 bc
0039F630: 4D 05
0039F3F4: 99 3c
0039F518: 88 bb
pubkey的自动替换,可以使用关于Generic ECC pubkey replacer by tanker, v1.70,但是他不支持11.9.1,用这个工具只能将pubkey替换成特定的pubkey,当然可以替换这个工具中内置的pubkey成你自己的。如果用网上流传的命令行pubkey -d xxx -y xxxx.exe,制作的lic程序不认,他替换的内容太多了,我只替换Group0 PubKey239,采用命令行pubkey -s 2 -d xxx -y xxxx.exe即可。采用这个工具自带的pubkey,记得将他对应的PriKey239贴到sdk的lmprikey.h中。
pubkey的定位和查看:版本低的可以用flexlm ECC pubkey 自动搜索工具 ,太高的估计只能自己找了。如何定位可以参照ECC替换公钥实践
很多帖子说查找LM_SEED1/2/3,有看到说LM_SEED-》ENCRYPTION_SEED是不可逆的,一般找到的都是ENCRYPTION_SEED1、2,所以找到的都是ENCRYPTION_SEED1/2,不要当成LM_SEED1、2贴到lm_code.h中,且这个ENCRYPTION_SEED1/2贴到lm_code.h作出的lic也不能用,必须贴到lmseeds.h中,网上很多说贴到lm_code.h,我是没成功过。ENCRYPTION_SEED3、4无关紧要,不用修改。
根据以上方法制作的lic,程序替换过pubkey后,正常运行,但是vendor.exe却运行不了,弹窗提示can't initialize错误,dos窗口提示
D:\>xxx 1 2 3
17:42:31 (xxx) FLEXnet Licensing version v11.6.0.0 build 60117 i86_n3
17:42:33 (xxx) EXITING DUE TO SIGNAL 43 Exit reason 20
(vendor.exe需要传入3个参数才能运行,且lic他从C:\flexlm\license.dat读取,所以先将lic复制成C:\flexlm\license.dat)
最后发现许可有问题,原来是
FEATURE V1 xxx 5.1 1-oct-2017 uncounted HOSTID=ANY \
SIGN="065C C004 8667
需要改成
SERVER My_PC 1010b1915316
VENDOR xxx
USE_SERVER
INCREMENT V1 xxx 5.1 1-oct-2017 uncounted HOSTID=ANY \
SIGN="065C C004 8667
再次运行xxx.exe,终于成功了。
[原创]对.net程序进行手术的一点小小心得:)
[C] 纯文本查看 复制代码
1. 用ilspy、dotPeek、JustDecompile、Reflector等工具,反汇编源代码成C#,用ilspy动态调试,找到关键点
2.1 用SimpleAssemblyExplorer打开,对比ilspy中找到的关键点,直接修改il,保存修改文件,大部分没有强名称的程序立刻能运行,检查找到的关键点是否正确。用这类直接修改il的工具,补丁后的文件与原文件对比,改变的地方比较多,文件差异比较大,一部分程序可以直接运行,另外一部分有强名称的,程序运行提示错误。对dll做过任何修改,过不了强名称,不能用gacutil /i的方式安装dll到GAC,解决方法有:1.直接复制到GAC中替换同名文件(有朋友说会导致莫名其妙的问题,可能是修改过度,可考虑下面只补丁几个字节的方法),2.重新签名,可对付某些SDK的dll。3.将dll从中卸载或删除,将补丁后的dll复制到exe目录。
2.2 用ildasm反汇编成il,对比ilspy,找到关键点,设置ildasm,让其显示字节码,参考字节码,手工用二进制编辑软件对文件进行搜索、替换。这种方法补丁后的文件,与源文件对比,改动较小,可能只用几个字节,但也不能用gacutil /i安装dll到GAC。再好点的方法就采用2.3的方法
2.3 将文件直接用ildasm或DotNetHelper反汇编成il,直接修改il文件,再编译生成exe或dll,重新签名即可。(遇到混淆过的,先用de4dot反混淆,再修改),遇到il无法编译的,只能采用2.2的方法,直接手工修改exe的二进制文件。
3. 关于重新签名,试过Strong.Name.Helper.v1.7-whoknows、StrongNameRemover、admiraldebilitate_v0.2等,都不理想,(可能是我的问题,不会用),自己觉得最有效的方法是采用批处理+snr,先替换签名,再重新生成key用sn签名。对dll重新签过名了,调用他的exe文件也需要替换签名或重新签名。
4. 当直接修改il时,拿不定il命令是否对的,可以用1中提到的工具将程序反编译成项目文件,提取相关部分的c#代码,先修改成想要的内容,在VS中编译,生成exe或dll,(也可以用Reflector的Snippy)再用ildasm去把il代码抠出来,对比着来对原来的程序进行补丁。
自己常用2.2方法,大部分不用重新签名,最小修改后替换到GAC中。
以上是个人总结的,如果有不对的地方希望大家能指点一下,有用的,请致谢哦:) |