<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:wfw="http://wellformedweb.org/CommentAPI/">
  <channel>
    <title><![CDATA[Q.yuhen]]></title> 
    <link>http://www.rainsts.net/</link> 
    <description><![CDATA[秋雨漏更夜，琴音动心痕。RainTrail Studio.China 2000-2009]]></description> 
    <language>zh-cn</language> 
    <copyright><![CDATA[Copyright 2009, Q.yuhen]]></copyright> 
    <webMaster><![CDATA[qyuhen@hotmail.com (Q.yuhen)]]></webMaster> 
    <generator>LBS v2.0.313</generator> 
    <pubDate>Fri, 03 Jul 2009 09:47:54 +0800</pubDate> 
    <ttl>60</ttl>
  
    <item>
      <title><![CDATA[Just In Time Compiler]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=838]]></link> 
      <category><![CDATA[MSIL Injection]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Wed, 24 Jun 2009 17:02:50 +0800</pubDate> 
      <description><![CDATA[<b>1. Prepare Method</b><br /><br />通过 System.Runtime.CompilerServices.RuntimeHelpers.PrepareMethod() 我们可以强行让 JIT Compile 一个方法，而不是等到 &quot;调用&quot; 前的某个时候。<br /><div class="code">unsafe static void Main(string[] args)<br />{<br />&nbsp;&nbsp;Debugger.Break();<br />&nbsp;&nbsp;Test(123);<br />}</div><br />用 SOS.dll 查看一下。<br /><div class="code">009ec020   009e3020     NONE Learn.CUI.Program.Test(Int32)<br />009ec028   009e3030      JIT Learn.CUI.Program.Main(System.String[])</div><br />很显然断点触发的时候，Test() 没有被 JIT 编译。我们增加点代码，完成强制编译工作。<br />]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=838]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[MetaData - 6. Method (2)]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=837]]></link> 
      <category><![CDATA[Reflection CodeDom]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Wed, 17 Jun 2009 18:17:59 +0800</pubDate> 
      <description><![CDATA[<b>5. Extra Sections</b><br /><br />如果方法中包含异常处理代码 (try...catch..finally)，那么编译器就会使用 &quot;附加段(Extra Section)&quot; 来存储相应的异常处理信息。检查 Method Header Flags，当二进制低位 第 4 bit 为 1 (0x8) 时，就表示该方法拥有 CorILMethod_MoreSects 标记。<br /><br />Extra Section Flags:<ul class="ubb-list" ><li> CorILMethod_TinyFormat = 0000 0010</li><li> CorILMethod_FatFormat = 0000 0011</li><li> CorILMethod_MoreSects =  0000 1000</li><li> CorILMethod_InitLocals = 0001 0000</li></ul>包含附加段的方法必然是 ]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=837]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[MetaData - 5. Method (1)]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=836]]></link> 
      <category><![CDATA[Reflection CodeDom]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Wed, 17 Jun 2009 14:11:24 +0800</pubDate> 
      <description><![CDATA[我们以 MethodDef 为起点，开始分析 .NET Method 格式信息。<br /><br /><b>1. MethodDef : 0x06</b><br /><br />ECMA 定义：<ul class="ubb-list" ><li> RVA (a 4-byte constant) </li><li> ImplFlags (a 2-byte bitmask of type MethodImplAttributes) </li><li> Flags (a 2-byte bitmask of type MethodAttributes) </li><li> Name (an index into the String heap) </li><li> Signature (an index into the Blob heap) </li><li> ParamList (an index into the Param table)</li></ul>RVA 指向 MethodBody ]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=836]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[MetaData - 4. Tables]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=835]]></link> 
      <category><![CDATA[Reflection CodeDom]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Wed, 17 Jun 2009 10:47:44 +0800</pubDate> 
      <description><![CDATA[在 #~ Stream 中存储了 .NET 程序集类型和成员信息，以及相互之间的引用关系。这些数据以 Table 结构存储，并以特定的 Index 或 Offset 进行关联。<br /><br />我们简单地做两个转换演示，更详细的结构定义可参考 <a href="http://www.rainsts.net/uploads/200906/Document.rar" title="http://www.rainsts.net/uploads/200906/Document.rar" target="_blank">《ECMA-335: Partition II: Metadata Definition and Semantics》</a> 或 CFF Explorer 作者写的<a href="http://www.codeproject.com/KB/dotnet/dotnetformat.aspx" title="http://www.codeproject.com/KB/dotnet/dotnetformat.aspx" target="_blank">《The .NET File Format》</a>。<br /><br /><b>00 - Module Table</b><br /><br />ECMA 定义：<ul class="ubb-list" ><li> Generation (a 2-byte </li></ul>]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=835]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[MetaData - 3. .NET Directory (2)]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=834]]></link> 
      <category><![CDATA[Reflection CodeDom]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Wed, 17 Jun 2009 09:37:53 +0800</pubDate> 
      <description><![CDATA[<b>5. #Strings</b><br /><br />#Strings Stream 中存储的是以 \0 结尾的 UTF8 字符串，由于是 Heap 方式，因此它以 Offset (相对位置) 来访问，而不是 Table Index。<br /><br /><div style="width: 100%;overflow-x : auto;"><a href="http://www.rainsts.net/uploads/200906/16_204507_1.png" target="_blank"><img src="http://www.rainsts.net/uploads/200906/16_204507_1.png" alt="http://www.rainsts.net/uploads/200906/16_204507_1.png" /></a></div><br /><br />完整的信息，我们依然可以用 ILDASM 查看。<br /><div class="code">String Heap:  931(0x3a3) bytes<br /><br />00000001: &lt;Module&gt;<br />0000000a: Test.exe<br />00000013: Program<br />0000001b: Learn.CUI<br />00000025: mscorlib<br />0000002e: System<br />00000035: Object<br />0000003c: Test<br />00000041: Main<br />00000046: .ctor<br />0000004c: args</div>]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=834]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[MetaData - 2. .NET Directory (1)]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=833]]></link> 
      <category><![CDATA[Reflection CodeDom]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Tue, 16 Jun 2009 15:21:13 +0800</pubDate> 
      <description><![CDATA[<b>1. CLI Header</b><br /><br />在前面一章，我们已经知道 MetaData 和 IL Code 都存储在 .text section 中。在 .text 开始位置还存储了 .NET 程序集的基本信息，包括 MetaData RVA、Size，以及 EntryPointToken 等等。<br /><br />通过 Optional Header -&gt; Data Directories -&gt; .NET Metadata Directory RVA、Size 我们可以确定 CLI Header 的位置和长度。<br /><br /><div style="width: 100%;overflow-x : auto;"><a href="http://www.rainsts.net/uploads/200906/16_181144_12.png" target="_blank"><img src="http://www.rainsts.net/uploads/200906/16_181144_12.png" alt="http://www.rainsts.net/uploads/200906/16_181144_12.png" /></a></div><br /><br />(RVA 地址转换可以借用 CFF Explorer 的 Address Converter，或者使用前一章提及的公式计算)<br /><br /><div style="width: 100%;overflow-x : auto;"><a href="http://www.rainsts.net/uploads/200906/16_152137_1.png" target="_blank"><img src="http://www.rainsts.net/uploads/200906/16_152137_1.png" alt="http://www.rainsts.net/uploads/200906/16_152137_1.png" /></a></div><br />]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=833]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[MetaData - 1. .NET PE/COFF]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=832]]></link> 
      <category><![CDATA[Reflection CodeDom]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Tue, 16 Jun 2009 12:37:25 +0800</pubDate> 
      <description><![CDATA[学习 MetaData 之前，简单复习一下 PE/COFF 的文件结构。我个人推荐使用 <a href="http://www.ntcore.com" title="http://www.ntcore.com" target="_blank">CFF Explorer</a> 工具，这是学习和编辑 PE 文件的头号选择。<br /><br /><b>1. MS-DOS stub</b><br /><br />PE 格式文件以一个 128 (0x80) bytes 的 MS-DOS stub 开头，通常用于显示 &quot;This program cannot be run in DOS mode.&quot; 这样一段提示信息。有价值的数据是 0x3C 位置存储的 PE signature 00004550 (PE\0\0) 偏移量 e_ifanew = 0x00000080。<br /><br /><div style="width: 100%;overflow-x : auto;"><a href="http://www.rainsts.net/uploads/200906/16_122639_1.png" target="_blank"><img src="http://www.rainsts.net/uploads/200906/16_122639_1.png" alt="http://www.rainsts.net/uploads/200906/16_122639_1.png" /></a></div><br /><br /><b>2. COFF File Header</b><br />]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=832]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[.NET Reactor 4.0 - Metadata 手工修复记]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=831]]></link> 
      <category><![CDATA[Tools]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Sat, 13 Jun 2009 14:47:31 +0800</pubDate> 
      <description><![CDATA[.NET Reactor 4.0 (Beta) 相对于以前的版本有很大的提升，就连最常用的 &quot;Suppress ILDASM&quot; 都升级成 &quot;Suppress Decompilation / Anti ILDASM&quot;。本文就是用这个功能做案例，来锻炼自己对元数据表结构的认知。<br /><br /><b>1. 加密</b><br /><br />找个目标程序集，用 4.0 加密，注意不要选择其他选项，仅选中 &quot;Quick Settings&quot; 中的 &quot;Anti ILDASM&quot; 即可。因为本文的目的是手工修复元数据表，而不是为了完成一个破解过程。<br /><br />当我们用 .NET Reflector 或者 Mono Cecil 打开这个加密的程序都会发现出错，可见还是具有一定的防护能力的。接下来，我们就依照 .NET Reflector 给出的错误信息开始手工修复过程。<br /><br /><b>2. 修复</b><br /><br />先准备好相应的工具软件，包括 ]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=831]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[.NET Reactor NecroBit 脱壳]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=830]]></link> 
      <category><![CDATA[Tools]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Fri, 12 Jun 2009 15:22:27 +0800</pubDate> 
      <description><![CDATA[.NET Reactor 是一个非常不错的 .NET 加密软件，支持加壳和混淆操作 (4.0 版本有很大提升，看雪有高人专门跟踪破解)。本文只是简单演示如何脱解这类软件生成的整体加密壳 (本文不涉及混淆，其相关内容可参考本文尾部的链接。另外，在实际操作过程中第二和第三步通常只用一种，并通过手工计算的方式来修复文件头和元数据信息，但为了展示不同的手法，本文过程看上去有点啰嗦)。<br /><br /><b>1. 加密</b><br /><br />打开 .NET Reactor，对目标演示程序集文件进行加密，注意选中 NecroBit 选项。<br /><br /><div style="width: 100%;overflow-x : auto;"><a href="http://www.rainsts.net/uploads/200906/12_150936_1.png" target="_blank"><img src="http://www.rainsts.net/uploads/200906/12_150936_1.png" alt="http://www.rainsts.net/uploads/200906/12_150936_1.png" /></a></div><br /><br />嗯，效果很好。对各类常用反编译工具均能无差别杀伤。<br /><br /><div style="width: 100%;overflow-x : auto;"><a href="http://www.rainsts.net/uploads/200906/12_150939_2.png" target="_blank"><img src="http://www.rainsts.net/uploads/200906/12_150939_2.png" alt="http://www.rainsts.net/uploads/200906/12_150939_2.png" /></a></div><br /><div style="width: 100%;overflow-x : auto;"><a href="http://www.rainsts.net/uploads/200906/12_150943_3.png" target="_blank"><img src="http://www.rainsts.net/uploads/200906/12_150943_3.png" alt="http://www.rainsts.net/uploads/200906/12_150943_3.png" /></a></div><br />]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=830]]></wfw:commentRss>
    </item>
      
    <item>
      <title><![CDATA[Silverlight 3 - 13. Network (1)]]></title> 
      <link><![CDATA[http://www.rainsts.net/article.asp?id=829]]></link> 
      <category><![CDATA[WPF Silverlight]]></category> 
      <author><![CDATA[yuhen <null@null.com>]]></author> 
      <pubDate>Sat, 23 May 2009 12:21:43 +0800</pubDate> 
      <description><![CDATA[Silverlight 支持使用 HTTP/HTTPS (System.Net.WebClient 等) 和 Socket (System.Net.Sockets) 两种方式访问远程服务器，但基于安全原因，对这些网络访问制定了严格的安全策略。<br /><br /><b>1. HTTP/HTTPS 访问策略</b><br /><br />(1) 始终允许同域调用。同域是指调用必须使用同一子域、协议和端口，这是出于安全原因以及防止跨域伪造。 <br /><br /><div style="width: 100%;overflow-x : auto;"><a href="http://www.rainsts.net/uploads/200905/23_122153_snap1.png" target="_blank"><img src="http://www.rainsts.net/uploads/200905/23_122153_snap1.png" alt="http://www.rainsts.net/uploads/200905/23_122153_snap1.png" /></a></div><br /><br />(2) Silverlight 支持访问包含跨域策略文件的网站服务。跨域访问时，Silverlight Application 首先在目标 Web 服务的根路径查找 Silverlight 跨域策略文件 (clientaccesspolicy.xml)。如果没找到(404 Not ]]></description>
      <wfw:commentRss><![CDATA[http://www.rainsts.net/feed.asp?q=comment&id=829]]></wfw:commentRss>
    </item>
      
  </channel>
</rss>
