2009-05-18 14:03:49
涉及的技术内容包括:.NET/C#、Java、Python、搜索引擎、电子商务等。
记录读书笔记、生活点滴。关注基础理论和开发……
除特别标注外,所有文章均为作者原创,转载请注明出处。谢谢!

  查看 "推荐文章目录"。  


  雨痕内部技术交流群,欢迎熟识的朋友参与。 将 添加为您的 MSN 联系人即可。
  承接搜索引擎开发项目;寻求搜索引擎商业合作伙伴。
  为杜绝垃圾广告的侵扰,只有注册用户可以发表评论和留言。
  如果有什么问题,可以单击右侧图标给雨痕发消息。( 绿色: 在线; 灰色: 脱机)
浏览模式: 普通 | 列表

Just In Time Compiler

[ 2009-06-24 17:02:50 | 作者: yuhen ]
1. Prepare Method

通过 System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod() 我们可以强行让 JIT Compile 一个方法,而不是等到 "调用" 前的某个时候。
unsafe static void Main(string[] args)
{
  Debugger.Break();
  Test(123);
}

用 SOS.dll 查看一下。
009ec020 009e3020 NONE Learn.CUI.Program.Test(Int32)
009ec028 009e3030 JIT Learn.CUI.Program.Main(System.String[])

很显然断点触发的时候,Test() 没有被 JIT 编译。我们增加点代码,完成强制编译工作。
...

阅读全文…

MetaData - 6. Method (2)

[ 2009-06-17 18:17:59 | 作者: yuhen ]
5. Extra Sections

如果方法中包含异常处理代码 (try...catch..finally),那么编译器就会使用 "附加段(Extra Section)" 来存储相应的异常处理信息。检查 Method Header Flags,当二进制低位 第 4 bit 为 1 (0x8) 时,就表示该方法拥有 CorILMethod_MoreSects 标记。

Extra Section Flags:
  • CorILMethod_TinyFormat = 0000 0010
  • CorILMethod_FatFormat = 0000 0011
  • CorILMethod_MoreSects = 0000 1000
  • CorILMethod_InitLocals = 0001 0000
包含附加段的方法必然是 ...

阅读全文…

MetaData - 5. Method (1)

[ 2009-06-17 14:11:24 | 作者: yuhen ]
我们以 MethodDef 为起点,开始分析 .NET Method 格式信息。

1. MethodDef : 0x06

ECMA 定义:
  • RVA (a 4-byte constant)
  • ImplFlags (a 2-byte bitmask of type MethodImplAttributes)
  • Flags (a 2-byte bitmask of type MethodAttributes)
  • Name (an index into the String heap)
  • Signature (an index into the Blob heap)
  • ParamList (an index into the Param table)
RVA 指向 MethodBody ...

阅读全文…

MetaData - 4. Tables

[ 2009-06-17 10:47:44 | 作者: yuhen ]
在 #~ Stream 中存储了 .NET 程序集类型和成员信息,以及相互之间的引用关系。这些数据以 Table 结构存储,并以特定的 Index 或 Offset 进行关联。

我们简单地做两个转换演示,更详细的结构定义可参考 《ECMA-335: Partition II: Metadata Definition and Semantics》 或 CFF Explorer 作者写的《The .NET File Format》

00 - Module Table

ECMA 定义:
  • Generation (a 2-byte
...

阅读全文…

MetaData - 3. .NET Directory (2)

[ 2009-06-17 09:37:53 | 作者: yuhen ]
5. #Strings

#Strings Stream 中存储的是以 \0 结尾的 UTF8 字符串,由于是 Heap 方式,因此它以 Offset (相对位置) 来访问,而不是 Table Index。

uploads/200906/16_204507_1.png


完整的信息,我们依然可以用 ILDASM 查看。
String Heap: 931(0x3a3) bytes

00000001: <Module>
0000000a: Test.exe
00000013: Program
0000001b: Learn.CUI
00000025: mscorlib
0000002e: System
00000035: Object
0000003c: Test
00000041: Main
00000046: .ctor
0000004c: args
...

阅读全文…

MetaData - 2. .NET Directory (1)

[ 2009-06-16 15:21:13 | 作者: yuhen ]
1. CLI Header

在前面一章,我们已经知道 MetaData 和 IL Code 都存储在 .text section 中。在 .text 开始位置还存储了 .NET 程序集的基本信息,包括 MetaData RVA、Size,以及 EntryPointToken 等等。

通过 Optional Header -> Data Directories -> .NET Metadata Directory RVA、Size 我们可以确定 CLI Header 的位置和长度。

uploads/200906/16_181144_12.png


(RVA 地址转换可以借用 CFF Explorer 的 Address Converter,或者使用前一章提及的公式计算)

uploads/200906/16_152137_1.png

...

阅读全文…

MetaData - 1. .NET PE/COFF

[ 2009-06-16 12:37:25 | 作者: yuhen ]
学习 MetaData 之前,简单复习一下 PE/COFF 的文件结构。我个人推荐使用 CFF Explorer 工具,这是学习和编辑 PE 文件的头号选择。

1. MS-DOS stub

PE 格式文件以一个 128 (0x80) bytes 的 MS-DOS stub 开头,通常用于显示 "This program cannot be run in DOS mode." 这样一段提示信息。有价值的数据是 0x3C 位置存储的 PE signature 00004550 (PE\0\0) 偏移量 e_ifanew = 0x00000080。

uploads/200906/16_122639_1.png


2. COFF File Header
...

阅读全文…

.NET Reactor 4.0 - Metadata 手工修复记

[ 2009-06-13 14:47:31 | 作者: yuhen ]
.NET Reactor 4.0 (Beta) 相对于以前的版本有很大的提升,就连最常用的 "Suppress ILDASM" 都升级成 "Suppress Decompilation / Anti ILDASM"。本文就是用这个功能做案例,来锻炼自己对元数据表结构的认知。

1. 加密

找个目标程序集,用 4.0 加密,注意不要选择其他选项,仅选中 "Quick Settings" 中的 "Anti ILDASM" 即可。因为本文的目的是手工修复元数据表,而不是为了完成一个破解过程。

当我们用 .NET Reflector 或者 Mono Cecil 打开这个加密的程序都会发现出错,可见还是具有一定的防护能力的。接下来,我们就依照 .NET Reflector 给出的错误信息开始手工修复过程。

2. 修复

先准备好相应的工具软件,包括 ...

阅读全文…