C++形容给自己之 程序集&msil 扫盲

口上未说 心里可想MD 这家伙在博客园装了如此久之高手 竟然连这都不见面
,我错过哦。

程序集签名

.net 下 “程序集” 什么东东
,反正就是任着挺牛x的,其实就是指“一堆程序”从咱传统的C++封装的dll 认知
就是一个dll文件称
然后一个lib文件里有相应的函数列表,把lib文件添加上就OK了。

呐 现在我们来新建一个空白Asp.net网站
开拓web.config 里面纵使发一对默认引用的次第集

1 <assemblies>
2         <add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>            
3     <add assembly="System.Xml.Linq, Version=3.5.0.0,Culture=neutral,PublicKeyToken=B77A5C561934E089"/>
4 </assemblies>

见那些唧唧歪歪的属性没有 System.Core, Version=3.5.0.0,
Culture=neutral, PublicKeyToken=B77A5C561934E089 这还是头吗
,这虽是先后集信息
.net下对程序集的概念已经超越我们原本对dll文件认知的那种范畴了,程序集信息指代“一堆放可用程序功能”经过签字的唯一电子标签信息。

系统目录的次序集称之呢GAC ,global assembly
cache,就是咱平常用底console.write()啊 messageBox.show()啊啥的
。他放在C:\WINDOWS\assembly
进入好目录下后发觉资源管理器的视图变得不得了非常。发现独可查阅属性
而非能够拷走里面的文本。要拷走也可 在dos命令行下就好了
他是盖命名空间也目录树存放的。

咱温馨的次第集也可坐GAC里 需要这么做:
放开GAC下之次集必须使用一个私钥进行签约(附加强名称)方式如下:

  1. 在vs命令行 sn -k d:/key.snk
  2. 形容好代码 编译 csc /keyfile:d:/test.snk /target:library function.cs
  3. 会晤发出只function.dll文件发出 使用命令gacutil /i function.dll安装
  4. 当地方空白的asp.net网站里我们平常都是右键->添加引用
    然后选中dll文件。 代码中using 命名空间
    然后就按常规的措施采用。现在我们决不了 只待以web.config
    的<assemblies>里添加相同实施就可以了,像这么:
    <addassembly=”Function,Version=0.0.0.0,Culture=neutral,PublicKeyToken=6ac36eab110b624e”/>
    前面几个价都掌握 但是这PublicKeyToken怎么看呢
    直接在C:\WINDOWS\assembly就不过见到:
     C++ 1
    另各种措施都得 比如sn -t 文件称。然后代码中using 命名空间
    然后即便照常规的道使用。

普普通通程序集在非坏pe文件结构的状态修改后是得运行的。而透过高称签名的尽管免得以,有效之包了程序完整性.。
留意在.net3.5要以上版本不论在编译时选什么版本加了高称都还是好更改的。因为.net认为你的程序运行在一个”受信赖的条件”
所以强称验证是受pass的。但是加到GAC应该是加不进去的
加到GAC必定会进展大称验证。要惦记进行高称验证不受pass在app.config
里添加这样的部署:

1 <configuration>
2    <runtime>
3       <bypassTrustedAppStrongNames enabled="false"/>
4    </runtime>
5 </configuration>

附:
使用gacutil /i function.dll卸载
也可在C:\WINDOWS\assembly目录 选中程序集点右键 卸载。
csc命令的各种以方法:
生成dll的签名文件:
D:\>sn -k keyfor_function.snk
叠加签名编译为dll:
D:\>csc /keyfile:keyfor_function.snk /t:library function.cs
附加dll编译主调程序源码:
D:\>csc /reference:function.dll kit.cs

 

msil

.net运行时东西大部分之人头是未会见去刻意模仿他的,啥CLR 啊 JIT  啊 我啊未掌握
不克伪装高手 更无可知用出去吹。
入门的或者得被协调推广下。.net的exe是中档语言代码 这只能说ilasm
跟ildasm,一个是编译
一个凡是倒转编译。先来演示一下如何简单“破解”一个微序。顺便我们呢来玩玩ildsam

新建一个控制台程序
写几句子代码:

 1 using System;
 2 namespace test
 3 {
 4     class Program
 5     {
 6         static void Main(string[] args)
 7         {
 8             //验证不通过程序立即退出
 9             if (licence() == false)
10             {
11                 Console.WriteLine("invalid license");
12                 Console.ReadKey();
13                 return;
14             }
15             else//验证成功 程序继续运行
16             {
17                 Console.WriteLine("licence is ok");
18                 Console.ReadKey();
19             }
20         }
21         static bool licence()
22         {
23             //假设这里是一个硬件ID授权认证
24             //共享软件的注册验证 根据硬盘串号通过指定加密算法得到密文 即注册码
25             //硬盘串号加密得到的密文跟注册码进行匹配
26             //如果不一样则认为软件已被拷到未被授权的电脑上使用 return false
27             return false;
28         }
29     }
30 }

以品种性质上->右键->属性
添加程序签名:
C++ 2
花色落得->右键->添加->新建起->应用程序配置文件
种下大半矣app.config
编辑它

1 <?xml version="1.0"?>
2 <configuration>
3   <runtime>
4     <bypassTrustedAppStrongNames enabled="false"/>
5   </runtime>
6 </configuration>

现今编译并运行

运转输出 invalid licence
C++ 3

生明确验证不经过

呐现在咱们虽来针对他进行破解 让他说明通过

然后打开il dasm 工具
一经未清楚在哪里打开 就于vs命令行里输入ildasm
下一场打开我们以debug目录编译后的exe文件
C++ 4
C++ 5意味着test命名空间
C++ 6代表program类
C++ 7哎呀这啥东东
咱在代码里从未写是办法啊

我们在书写及效仿了要是没有写构造方法 则编译时提供默认的构造方法
看 这里就是是这个意思 ctor可能全是 constructor

打开main函数 代码如下:

 1 .method private hidebysig static void  Main(string[] args) cil managed
 2 {
 3   .entrypoint
 4   // 代码大小       50 (0x32)
 5   .maxstack  1
 6   .locals init ([0] bool CS$4$0000)
 7   IL_0000:  nop
 8   IL_0001:  call       bool test.Program::licence()
 9   IL_0006:  stloc.0
10   IL_0007:  ldloc.0
11   IL_0008:  brtrue.s   IL_001e
12   IL_000a:  nop
13   IL_000b:  ldstr      "invalid license"
14   IL_0010:  call       void [mscorlib]System.Console::WriteLine(string)
15   IL_0015:  nop
16   IL_0016:  call       valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
17   IL_001b:  pop
18   IL_001c:  br.s       IL_0031
19   IL_001e:  nop
20   IL_001f:  ldstr      "licence is ok"
21   IL_0024:  call       void [mscorlib]System.Console::WriteLine(string)
22   IL_0029:  nop
23   IL_002a:  call       valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey()
24   IL_002f:  pop
25   IL_0030:  nop
26   IL_0031:  ret
27 } // end of method Program::Main

开辟licence函数 代码如下:

 1 .method private hidebysig static bool  licence() cil managed
 2 {
 3   // 代码大小       7 (0x7)
 4   .maxstack  1
 5   .locals init ([0] bool CS$1$0000)
 6   IL_0000:  nop
 7   IL_0001:  ldc.i4.0
 8   IL_0002:  stloc.0
 9   IL_0003:  br.s       IL_0005
10   IL_0005:  ldloc.0
11   IL_0006:  ret
12 } // end of method Program::licence

接下来单击文件菜单->转储
保存为il 文件
俺们只是待以main函数中改条件判断 让他说明通过就可以了
故而记事本打开保存的il文件
找到这同样执行 看到莫
IL_0008:  brtrue.s   IL_001e

倘转成为这样吧
IL_0008:  brfalse.s   IL_001e
试下吧

转移了后在vs命令行使用ilasm test.il 把il文件还编译成exe文件

这会儿我们再次运行test.exe
啊怎么回事 不成事

1 未处理的异常:  System.IO.FileLoadException: 未能加载文件或程序集“test, Version=
2 1.0.0.0, Culture=neutral, PublicKeyToken=e49d145887009c3e”或它的某一个依赖项。
3 强名称验证失败。 (异常来自 HRESULT:0x8013141A)
4 文件名:“test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e49d145887009c3e
5 ” ---> System.Security.SecurityException: 强名称验证失败。 (异常来自 HRESULT:0x
6 8013141A)
7 失败的程序集的区域是:
8 MyComputer

为生次序签名,所以我们尚得把大称去丢。
双重打开il文件
盼出诸如此类3高居开始的地方:
.publickeytoken
.publickey
.hash

将她们去
接下来还用ilasm编译 并运行发现说明成功
C++ 8

注意:
要是程序集加了高称 改了pe文件之其它内容后都是力不从心起动的
就像有绑定的MD5校验一样。为了掩护程序 都见面用混淆器进行处理
,而混淆器正好又见面变动文件内容。

另外:
说俗点高级语言为不过就是
int var1=123
if(){
}
else{}

for(){}
这些之类的
在押了下网上il的代码解析 以及以前看了部分针对汇编的懂得
虽然不用汇编做开发。
汇编是基于堆栈的 流水线 似的操作 ,事先初始化的变量在编译时都是规定好的
入栈出栈操作 ,每次都进行一个发令 对寄存器赋值 或者进行运算 地址跳转
等。

细思忖有了这些基础特征就是足足了
高级语言的那些语法基本上还足以实现只不过要累来

int var1=123
其一隐秘了

if(){
}
else{}
以汇编里估计是由此规范 地址跳反啥的来兑现

for(){}
实则为酷简短
看了一点il的代码 发现吗即是一个连续if的过程
条件上不交跨反到前的地点继续n++
像这样
int n=1;
loop:
n++;
console.writeline(“hi”);
if(n<50)
goto loop;

事实上我无晓汇编语言的 有头乱七八糟说之原 勿喷。