一起谈.NET技术,验证.NET强命称的思路和实例

  手头有一个行业软件,是需要插上加密狗才能正常运行的,C# / .Net Framework 1.1环境开发的。这是我们公司购买的正版软件,所以是能正常使用的,但是由于电脑多,加密狗难免要拔来拔去的。闲来无事,就研究研究吧,也好多学些调试知识。PEiD可以“鉴定”出该软件是Microsoft Visual C# / Basic .NET,新手不要以为脱壳查壳才用到PEiD啊。

  那就用Reflector分析吧,注意到不插加密狗会弹出个对话框提示“*****未注册*****”的字样,部分功能受限。按F3显示搜索窗口,输入“未注册”,点其右侧“String Seach”图标进行字符串搜索。找到一项,是程序启动的一个模块,双击来到左侧树状列表,再双击打开代码,我选的C#格式。一般我是IL和C#两种结合对照使用。鉴于诸多原因,代码已经精简并修改,特此说明。下同。


GlobalVariant.zhuce = Check.Textxyz;
if (!GlobalVariant.zhuce) { MessageBox.Show(this, "*****未注册*****"); }

一看,里面没有一个汉字,用许多“\u7237\u7016”之类的字串,这就是汉字的Unicode了。把模块代码复制出来,找个Unicode转换工具转一下,现在一目了然了,直接找到弹出“*****未注册*****”的条件判断,该判断调用了some.dll中的一个过程Check.Textxyz,点击过程名字跟踪过去,点开如下:


public static bool Textxyz{ get { return ((Check() != 0) ? 1 : 0); }}

  再点击追查Check()函数,除了定义什么都没有,已经是传说中的Native Code了(本机代码)。[后来反编译才发现的]


 [PreserveSig, MethodImpl(MethodImplOptions.Unmanaged, MethodCodeType=
MethodCodeType.Native), SuppressUnmanagedCodeSecurity]
public static int modopt(CallConvCdecl) Check();

  但是无所谓了,分析一下,只需修改上面那个Textxyz中的return ((Check() != 0) ? 1 : 0); 根据判断返回1(true)或0(false),应该是检测软件狗的Native Code为:return ((Check() != 0) ? 1 : 1); 不管怎么样都返回1(true)嗯,方案确定,那就干吧。

  程序有5个DLL和2个.EXE,其中一个.EXE不是C# .Net程序(Assembly),只需解决这5个DLL和1个EXE就完了。简单!全部ildasm出来,将some.il的代码根据上面改法做了修改,很简单,就是把那段里的ldc.i4.0改为ldc.i4.1 L_0009: ldc.i4.0 /这里改成ldc.i4.1 L_000a: br.s L_000d L_000c: ldc.i4.1 L_000d: ret全部去掉强名称,用ilasm编译回去。到some.il卡壳了,我#@#@$!%$#&^$%* 还以为胜利在望了呢。这才注意到some.dll使用了本机代码(Native Code)。

  some.dll中还有许多.Net代码的软件功能。大家一致认为,混合了本机代码的Assembly是无法重新编译的,因为无法反编译(不信你试试;)~)唉,怎么办,查资料,眼都看晕了,结果还是NO WAY。PS 看来使用本机代码混编译.Net是保护.Net Assembly程序很强的方法。只能16进制编辑了,弄了一份some.dll,对照some.il找到特征字串,在编辑器中搜索到以后16(false)就改成了17(true)。

  这里some.il在用ildasm导出(即转储)时一定要把那几个方框打上勾,这样反编译出来的代码就有IL指令对应的some.dll中的16进制代码。很方便去编辑器中搜索定位。保存后打开软件,看看能不能运行---弹出公共语言运行库错误提示!运行.Net Framework SDK 1.1 的DbgCLR进行调试,查到是强名称认证出了问题!对有强名称的Assembly.Net程序,只要用16进制编辑器修改了任何字节,都会导致强名称验证失败而使程序无法运行。(不知道修改header会不会也这样,没试)解决强名称认证问题的常规方法就是重新编译程序,可是刚才就试过了,不行!反编译带本机代码的Assembly?搜索和研究了好久没找到解决方案。那么,能不能将全部DLL/EXE强行去掉强名称,试了一下不能运行,而且也不可能加载到GAC中运行。

  那么,怎么根据算法给some.dll“更新”成修改后的正确强名称?没有答案。这一点我很感兴趣,以后还会留意。没辙了,最后一招:怎么欺骗Microsoft.Net让它不去检查强名称,或者让它怎么看都是对的?网上找到写注册表的方法,但我试了几次都不行,怀疑是不是需要重新启动一下电脑?没再试。

  干脆,把.Net Framework 1.1的这个强名称机制破解了算了,我是没看到它到底有什么用。破解系统的强名称验证机制:结合网上找到的资料,StrongName强名称相关的操作在.Net Framework运行库的文件mscorsn.dll里,具体位置,一般在系统目录C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\下,自己找。涉及到的函数是StrongNameSignatureVerification和StrongNameSignatureVerificationFromImage。

  于是复制了一份mscorsn.dll,用OD打开,先点运行让它运行一遍(管它运行不运行呢),然后点菜单中 调试 --> 调用DLL输出,找到相关的函数并参照着找到函数入口点,修改一下让它们直接返回一个True。修改保存,覆盖掉系统原来的那个文件,注意先备份一下以防修改失败或事后系统恢复。覆盖时,要先覆盖Windows/System32/dllcache/目录下的那个,然后再覆盖Windows/Microsoft.NET/下的目录下的那个。

  现在点击已经修改好的程序看看怎么样了?运行成功!无异常。同事说我把这个软件和.Net一块给Crack了。只可惜要替换.Net Framework的系统文件mscorsn.dll才行,安全性是否下降尚不知道。这个系统文件的替换做法,在.Net Framework 2.0中应该是一样可以对付强名称的。

  最后总结:

  1. 如果你都看到了这里,证明你很有耐心,也很谦虚,麻烦不要挖苦我:-),请多多指点

  2. .Net程序(Assembly)的逆向研究难点就在Native Code混编,这个应该是研究方向

  3. 不可逆强名称程序的强名称验证能否从正面解决能否“更新”强命名是不是不可完成的任务?

  4. 这一点很重要:本文提出了一个强名称验证+编译本机代码保护程序的一个Crack思路,只要找到需要修改的关键点,只要能用16进制编辑器让它突破限制,那么程序也是可以照常使用 的。只不过再给系统打个免强名验证补丁而已。虽然是有所得有所失,但反过来想想,对软件到了 要Crack的地步的“强烈需求”,会在乎给系统打个并不是很令人讨厌的补丁吗?这个补丁怎 么样,还需要大家大面积的试验,实践出真知。

  可能有人会说,你想的也太天真了,如果软件的核心功能和验证都是NativeCode那你怎么办? 其实不用担心,因为你说的程序已经算不上.Net程序了。只是披上.Net外衣欺骗用户而已。 为什么要使用.Net开发程序?答案很多,开发快捷,功能强大易用(都是针对开发人员)等等 等等,所以呢,如果用.Net进行开发,肯定软件的核心功能是靠.Net NonNative Code实现的, 至于验证非法用户的核心功能,就写道Native Code中,然后混编一下。然后,这样的程序 应该还是很容易Crack的。没有强名称验证,Native Code作用有限。

时间: 2024-10-02 05:47:46

一起谈.NET技术,验证.NET强命称的思路和实例的相关文章

验证.N“.NET研究”ET强命称的思路和实例

手头有一个行业软件,是需要插上加密狗才能正常运行的,C# / .Net Framework 1.1环境开发的.这是我们公司购买的正版软件,所以是能正常使用的,但是由于电脑多,加密狗难免要拔来拔去的.闲来无事,就研究研究吧,也好多学些调试知识.PEiD可以"鉴定"出该软件是Microsoft Visual C# / Basic .NET,新手不要以为脱壳查壳才用到PEiD啊. 那就用Reflector分析吧,注意到不插加密狗会弹出个对话框提示"*****未注册*****&quo

一起谈.NET技术,Silverlight + RIA Service的SUID的实例

1.准备工作 新建一个Silverlight Business Application,首先修改web.config,他自动生成的配置比较省略,我手动加入membership,role,profile的配置,我是ASP.NET MVC的项目中拷贝过来,直接用他的配置也可以,不过手动配置一下连接字符串LocalSqlServer,不然不能运行. <membership><providers><clear /><add name="AspNetSqlMemb

中兴通讯携手中国移动率先完成基于NB-IoT标准协议系统的技术验证

第一届全球5G大会在北京召开之际,中兴通讯携手中国移动在中国移动5G联合创新中心实验室,率先完成严格遵循NB-IoT标准协议的技术验证演示.鉴于基本完稿的3GPPNB-IoT标准协议将在6月下旬正式冻结,中兴通讯全程跟踪3GPP国际标准的制定,与标准冻结同步推出系列化的新技术和新产品.本次技术验证演示的成功,彰显了中兴通讯在物联网关键技术方面的创新能力和技术积累,携手业界共同推动NB-IoT产业链快速发展. 本次NB-IoT演示,中兴通讯采用基于NFV功能的虚拟核心网,无线网络利用成熟商用的4G

《创业家》牛文文:少谈点模式多谈点技术

"模式"如同当年的"主义",流行于各种创业大赛.创业励志节目.论坛的"街头"式秀场 文/创业家 牛文文 "美国某某公司你知道吧?就是刚被戴尔.惠普.思科十几亿美元抢购的那家.我们的模式和它的一样,现在还没赢利,可将来起码有十几亿人民币的市值." "我开了小煤矿,但煤运不出去,上商学院之后受到启发,想搞模式创新,具体讲就是想在铁路边上搞个煤炭物流开发区,建一个大的物流和信息流平台,把分散的煤炭集中在我这个园区,这样和铁

一起谈.NET技术,谈谈微软技术,以及对待技术应有的态度

昨晚在家上网,看看微软研究院TechFest 2010的消息,逛逛Channel 9,瞅瞅DevLabs里的项目,以及F#与Reactive Framework之类东西.然而,我一边对那些有趣而奇妙的技术感叹不已,同时却又产生出一种忿忿之情.为什么?因为在国内的技术圈子里,经常有一种在我看来莫名奇妙的鄙视微软技术的风气.这样的风气在国内的推特圈里也非常明显,基本上只有我一个人对微软的技术抱有好感,并"勇于"和大量意见向左的人争辩.忿忿之余,我便在推特上不断表达我对这种风气的抱怨及否定,

区块链技术在物联网中应用的思路探讨

物联网作为新一代信息通信技术高度集成和综合应用的典范,正在与经济社会深度融合,深刻改变生产活动.社会管理.公共服务.随着物联网技术在各行业中的普及和不断深化,人类社会正进入"万物互联"的新时代,可穿戴设备.智能家电.自动驾驶汽车.智能机器人等数以百亿计的新设备将接入网络,也使得物联网成为当今全球技术创新最活跃.应用空间最广阔的领域之一. 云计算.大数据.新一代移动通信技术与智能感知.行业应用相互交织,激荡融合,不断激发创新活力,成为物联网发展的新动力.区块链技术作为当前国内外的焦点技术

php 用户而验证-跪求大神帮我指点迷津,授权验证代码,已经有思路,也设计出来了,就是不知道怎么调用,代码如下

问题描述 跪求大神帮我指点迷津,授权验证代码,已经有思路,也设计出来了,就是不知道怎么调用,代码如下 <?php $auth=http://g.xsscp.com/include/code1.php?url=$_SERVER['HTTP_HOST']"; <?php $url = "http://g.xsscp.com/include/code1.php?url=$_SERVER['HTTP_HOST']"; $html = file_get_contents($

谈装饰公司网站用户体验度优化思路

中介交易 SEO诊断 淘宝客 云主机 技术大厅 谈装饰公司网站用户体验度优化思路 企业做网站的目的在笔者大致分几个部分,销售型.品牌型.混合型,不难看出做网站的目的与中小型企业网络营销的制定是类似的,中小型企业从事网站建设和优化工作主要是为了形成转化率,带来实际的销售效益,拓展多个销售渠道,今天笔者就结合自身装饰公司网站谈一谈体验度优化的思路和转化率的影响. 1.从浏览者角度出发.企业通过网站产生转化率,必须首要站在浏览者的角度分析网站的整体,简单的说就是浏览者想看到什么,你的网站能不能实现浏览

一起谈.NET技术,ASP.NET4中不要相信Request.Browser.Cookies,Form验证要用UseCookies

从ASP.NET 3.5升级至ASP.NET4之后,遇到三种登录后不能保存cookie的情况(升级前一切正常): 1. 遨游3在极速模式下(默认模式). 2. FireFox中修改了UserAgent. 3. 诺基亚手机自带浏览器或者UCWeb浏览器访问博客园手机版(m.cnblogs.com). 今天终于把罪魁祸首给揪出来了,它就是Request.Browser.Cookies. 如果你在程序中使用Form验证并使用cookie保存用户的登录状态,请切记:在<authentication mo