首页
社区
课程
招聘
[原创]对.net程序进行手术的一点小小心得:)
发表于: 2014-9-2 23:18 31208

[原创]对.net程序进行手术的一点小小心得:)

2014-9-2 23:18
31208

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中。

以上是个人总结的,如果有不对的地方希望大家能指点一下,有用的,请致谢哦:)


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 3
支持
分享
最新回复 (52)
雪    币: 212
活跃值: (115)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好几个.net程序过不了,学习了。
2014-9-3 00:20
0
雪    币: 1436
活跃值: (3861)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
兄弟,厉害,潜水8年,才发14个帖子,牛人
2014-9-3 01:14
0
雪    币: 22
活跃值: (443)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主你好 对混淆后的程序 有没有研究呢

比如这个 xiaomi119.com
2014-9-3 08:51
0
雪    币: 396
活跃值: (838)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
(de4dot)+reflexil+ildasm+ilasm基本能搞定所有,reflexil自带强名移除挺好用的。
纯.net开发的程序只要不是加了jit壳都不麻烦,最多就是多跟几个类。最恶心的是c++/cil,nativecode/managed c++掺在一起,然后链接一个c#或vb.net写的module调用,代码跳来跳去让人想吐。
2014-9-3 09:48
0
雪    币: 1436
活跃值: (3861)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
reflexil移除了强名后,没法再加强名称吧
2014-9-3 10:41
0
雪    币: 396
活跃值: (838)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
ildasm反编译出il,ilasm加强名,不过一直没加也没什么问题
我的理解是自己添加强名没意义,因为不可能拿到对方的snk。移除强名之后public key token为null,基本上能直接运行,这样的话加个自己的强名跟不加没什么区别,又不是必须进GAC。
加强名一般用来对付strongnameidentity,这玩意实在是讨厌。
强签引用可以直接用reflexil去掉,不加强签反而省心。
2014-9-3 11:37
0
雪    币: 1436
活跃值: (3861)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
有的dll在C:\Windows\Microsoft.NET\assembly\GAC_MSIL里面,程序默认加载这里的,我要不从C:\Windows\Microsoft.NET\assembly\GAC_MSIL里面删除对于的dll,将补丁后的dll复制的exe目录,要不就手工替换字节,将补丁后的dll覆盖到C:\Windows\Microsoft.NET\assembly\GAC_MSIL里面。
2014-9-3 12:02
0
雪    币: 396
活跃值: (838)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
我的做法是看那个库用的地方多不多,要是一个收费的控件这种很多程序都用的,或者是个大型工程的依赖库,就重签名进GAC,否则将其从GAC里面卸掉,扔进exe目录。reference无论如何都要改。
将一个破坏了强签的库扔进GAC里面,可能会出问题。曾经改了系统库里面的DES,之后某些程序运行正常,某些程序各种问题,在那之后就不干替换GAC文件的事了
2014-9-3 14:20
0
雪    币: 1436
活跃值: (3861)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
纠正一下我的错误,上面说手工修改二进制文件避免强名,错误的。修改后的文件直接复制到GAC中替换原有文件,exe程序是可以运行的,但是没法用gacutil /i的方式安装到GAC,要想用gacutil /i,必须重新签名。因为是手工修改,改变的内容比较少,部分只修改一两个字节,多个程序调用这个dll也不会出问题。

问题:gacutil /u卸载不成功,直接到GAC中删除的文件夹。reflexil对一些dll无效,无法移除强名。
2014-9-3 15:16
0
雪    币: 216
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
现在很多.net程序没那么简单了。
现在好程序都加壳或c++/cil,nativecode/managed c++掺在一起
2014-9-4 09:26
0
雪    币: 238
活跃值: (1095)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
个人觉得关键依旧是脱壳反混淆。

现在有些壳,带混淆的,参杂各种原因之后,保守估计有5成以上代码,没法反混淆,de4dot什么的统统跪倒,或许很多流程什么的都在,你可以猜,但是类名,方法名变成乱码,像“口”字一样,点击之后出错,没法跟到对应方法去。

然后有个很现实的问题是,它有几个DLL,相互调用,一旦没法没跟踪跳转了,想破就只能一个一个翻看了,看运气。

【说起这问题,求教:】
几个关联调用的DLL 都加了混淆怎么反混淆?如a.dll  可以调用 b.dll 里面的 GetName 方法,但是逐个dll反混淆过程中,方法被随机重命名了,dll里面的名字变得不一致了,如a.dll 现在调用的是 method1,但是b.dll 里面,那方法名现在是 method3,那a.dll就找不到目标方法了,咋办?怎么样脱壳才能使多个dll里面的名字对应?
2014-9-4 15:08
0
雪    币: 1436
活跃值: (3861)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
1.修改de4dot源码,将能识别的GetName 方法不要再重命名为method1/method2/...,因为方法的名称GetName没有混淆,做一个过滤。
2.或者使用simple assembly explorer里面的deobfuscator,有些设置。
3.显示“口”等字符的,可以试试dotPeek、JustDecompile。
2014-9-4 23:55
0
雪    币: 20
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
不凡试下对星宇财务管理软件NET反编译脱混淆的一个剖析
2014-9-5 17:24
0
雪    币: 1436
活跃值: (3861)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
用ilspy、dotPeek、JustDecompile、Reflector等工具提示错误,无法反编译成c#,反编译成il,
          Dispose(bool disposing) cil managed noinlining
  {
    // 代码大小       174 (0xae)
    .maxstack  3
    .locals init (int32 V_0)
//--------下面是无用代码----
    IL_0000:  br.s       IL_000a

    IL_0002:  call        [ERROR: INVALID TOKEN 0x4D30FD61] 
    IL_0007:  ldnull
    IL_0008:  ldind.ref
    IL_0009:  pop
    IL_000a:  ldc.i4.0
    IL_000b:  brtrue.s   IL_0007
//-----------上面无用代码---
    IL_000d:  call       bool。。。。

用正则表达式删除这部分,再编译成exe,这下ilspy、dotPeek、JustDecompile、Reflector等工具就能看了。
正则表达式:
 +?IL_....:  br\.s.+

 +?IL_....:  call        \[ERROR: INVALID TOKEN.+
 +?IL_.+
 +?IL_.+
 +?IL_....:  pop
 +?IL_....:  ldc.i4.0
 +?IL_....:  brtrue.s.+
2014-9-6 00:29
0
雪    币: 1436
活跃值: (3861)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
对多个dll重新签名,试过StrongNameRemover v2.3/reflexil,不理想,一次只能处理一个文件,移除强名后,exe运行错误,用sn重签名,提示不表示具有强名称的程序集,还是用snr方便,批处理搞定所有的。
2014-9-7 01:22
0
雪    币: 90
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
de4dot 反混淆不修改任何代码,程序就不能运行啊
2014-9-12 18:46
0
雪    币: 49
活跃值: (156)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
有什么办法编辑.NET程序的图片资源吗?
2014-9-12 20:27
0
雪    币: 6538
活跃值: (4496)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
19
感谢,学习到了一点经验
2014-9-12 20:50
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
密匙校验
2014-9-14 13:26
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
可以啊,替换资源就可以了
2014-9-14 13:27
0
雪    币: 49
活跃值: (156)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
资源替换类工具ResHacker,替换不了exe里面的图片资源

可能是我不会,求指点
2014-9-15 09:44
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
如果是.NET就很好搞的
2014-9-21 20:43
0
雪    币: 49
活跃值: (156)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
.net破解和修改文字都还好,修改.net程序内部图片网上居然没有一个帖子,唯一在52有个视频电话,链接N早失效了
2014-9-21 21:31
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
给文件来看看?
2014-9-23 22:17
0
游客
登录 | 注册 方可回帖
返回
//