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 一个方法,而不是等到 "调用" 前的某个时候。
用 SOS.dll 查看一下。
很显然断点触发的时候,Test() 没有被 JIT 编译。我们增加点代码,完成强制编译工作。
...
阅读全文…
通过 System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod() 我们可以强行让 JIT Compile 一个方法,而不是等到 "调用" 前的某个时候。
unsafe static void Main(string[] args)
{
Debugger.Break();
Test(123);
}
{
Debugger.Break();
Test(123);
}
用 SOS.dll 查看一下。
009ec020 009e3020 NONE Learn.CUI.Program.Test(Int32)
009ec028 009e3030 JIT Learn.CUI.Program.Main(System.String[])
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:
阅读全文…
如果方法中包含异常处理代码 (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 定义:
阅读全文…
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)
阅读全文…
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 定义:
阅读全文…
我们简单地做两个转换演示,更详细的结构定义可参考 《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。
完整的信息,我们依然可以用 ILDASM 查看。
阅读全文…
#Strings Stream 中存储的是以 \0 结尾的 UTF8 字符串,由于是 Heap 方式,因此它以 Offset (相对位置) 来访问,而不是 Table Index。
完整的信息,我们依然可以用 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
...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 的位置和长度。
(RVA 地址转换可以借用 CFF Explorer 的 Address Converter,或者使用前一章提及的公式计算)
...
阅读全文…
在前面一章,我们已经知道 MetaData 和 IL Code 都存储在 .text section 中。在 .text 开始位置还存储了 .NET 程序集的基本信息,包括 MetaData RVA、Size,以及 EntryPointToken 等等。
通过 Optional Header -> Data Directories -> .NET Metadata Directory RVA、Size 我们可以确定 CLI Header 的位置和长度。
(RVA 地址转换可以借用 CFF Explorer 的 Address Converter,或者使用前一章提及的公式计算)
...
阅读全文…
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。
2. COFF File Header
...
阅读全文…
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。
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. 修复
先准备好相应的工具软件,包括 ...
阅读全文…
1. 加密
找个目标程序集,用 4.0 加密,注意不要选择其他选项,仅选中 "Quick Settings" 中的 "Anti ILDASM" 即可。因为本文的目的是手工修复元数据表,而不是为了完成一个破解过程。
当我们用 .NET Reflector 或者 Mono Cecil 打开这个加密的程序都会发现出错,可见还是具有一定的防护能力的。接下来,我们就依照 .NET Reflector 给出的错误信息开始手工修复过程。
2. 修复
先准备好相应的工具软件,包括 ...
阅读全文…











