惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Cybersecurity and Infrastructure Security Agency CISA
D
Darknet – Hacking Tools, Hacker News & Cyber Security
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Schneier on Security
L
Lohrmann on Cybersecurity
S
Securelist
P
Palo Alto Networks Blog
SecWiki News
SecWiki News
T
Troy Hunt's Blog
H
Hacker News: Front Page
AWS News Blog
AWS News Blog
Latest news
Latest news
Hacker News - Newest:
Hacker News - Newest: "LLM"
NISL@THU
NISL@THU
The Hacker News
The Hacker News
F
Full Disclosure
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
大猫的无限游戏
大猫的无限游戏
O
OpenAI News
P
Proofpoint News Feed
Know Your Adversary
Know Your Adversary
G
GRAHAM CLULEY
博客园_首页
Attack and Defense Labs
Attack and Defense Labs
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Security Latest
Security Latest
云风的 BLOG
云风的 BLOG
K
Kaspersky official blog
WordPress大学
WordPress大学
www.infosecurity-magazine.com
www.infosecurity-magazine.com
宝玉的分享
宝玉的分享
L
LINUX DO - 热门话题
博客园 - 叶小钗
L
LINUX DO - 最新话题
Martin Fowler
Martin Fowler
N
News | PayPal Newsroom
Project Zero
Project Zero
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
PCI Perspectives
PCI Perspectives
月光博客
月光博客
IT之家
IT之家
Recent Announcements
Recent Announcements
T
The Exploit Database - CXSecurity.com
D
DataBreaches.Net
J
Java Code Geeks
酷 壳 – CoolShell
酷 壳 – CoolShell
Last Week in AI
Last Week in AI
Google Online Security Blog
Google Online Security Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

博客园 - Flier Lu

Atlas 实现机制浅析 [3] Atlas 实现机制浅析 [2] Atlas 实现机制浅析 [1] [草稿] Managed COM Apartment - ExecutionContext [1] ASP.NET 2.0 异步页面原理浅析 [1] 也评《应用框架的设计与实现——.NET平台》 CLR 调试支持机制原理浅析 [1] 整体结构 [草稿] 咬文嚼字之 Java 版 关注企业级服务自身的可管理性 享受 .NET 时代的 COM+ 开发 感受 COM+ 事务性 在 CLR 1.1 中获取 IL 函数体信息 GDS [1] 使用Google桌面搜索构建企业搜索方案 基于透明代理的内部类访问抽象 [2] 自动类型转换与封装 基于透明代理的内部类访问抽象 [1] 类型与调用的封装 [TIPS] 正确判断当前用户角色 使用 FishEye 直观了解 CVS 情况 在 .NET 中获取 AD 上帐号密码过期时间 用WinDbg探索CLR世界 [10] 透明代理实现原理浅析 - 静态结构
[草稿] 自动下载完整的.NET源代码
Flier Lu · 2008-01-23 · via 博客园 - Flier Lu

更新:程序员的思维模式都差不多,Kerem KusmezerJohn Robbin 发布了一个类似的工具.NET Mass Downloader。既然有的用我就不重新发明轮子了,下面那个项目停止维护,有需求的朋友直接用那个工具好了,具体使用说明可以参考

Download All the .NET Reference Source Code at Once with Net Mass Downloader

更新:在 sourceforge 上申请了一个项目,有兴趣的朋友可以上去下载代码,或者提交bug和改进建议。不过我估计也就年后才有时间继续处理,暂且挖个坑反正这里吧,呵呵

    从去年MS就开始喊着要开放.NET源代码,如今终于在一个含糊不清的授权协议下,通过Source Server的方式放了出来。虽然是如愿开源,但目前只提供几个核心模块,而且还限制必须在VS2008里面在线访问。
    其实既然决定开放,何必搞那么多限制出来,让偶等用着不爽还得自己动手丰衣足食,写个程序直接模拟VS2008获取源码的行为,一次性全部拖回来备用。
    空口无凭,上载一个
System.Xml 的源码包,和一个理论上能跑的程序原型,有兴趣的朋友可以试试。回头有时间了把相关代码整理一下再放出来,下面先大概说一下思路。

    首先,VS2008虽然要

打个补丁才能用源码调试,但这并不是下载源码的必要条件。MS发布源码所依赖的Source Server的机制,很早就通过 WinDbg 的发布包引入了。有兴趣的朋友可以使用 WinDbg 工具自己架设 Source Server,具体步骤请参考 %Debugging Tools for Windows%\sdk\srcsrv\ 目录下文档和脚本。
    而这个 Source Server 说白就是从 .pdb 调试符号文件里面,获取被绑定的已索引文件列表,然后根据系统_NT_SOURCE_PATH环境变量指定的服务器,拼接出一个 URL 然后通过http下载。具体这块的配置,可以参考
    Configuring Visual Studio to Debug .NET Framework Source Code
    讨厌的是MS在dbghelp.dll里面做了一些手脚,直接通过url去下载调试符号和源码是不被允许的。刚好scz前面研究过symbol server的行为,基本确定ms服务端是根据user agent来进行判断的。也就是说在发起请求时,把当前http的user agent改成ms认可的方式,就能够模拟dbghelp.dll通过srcsrv.dll完成的工作,具体代码类似

public const string DefaultUserAgent = "Microsoft-Symbol-Server/9.9.9.9 (C; V; ;)";

    
public void Restart(Uri uri)
    
{
      _request 
= (HttpWebRequest)WebRequest.Create(uri);
      _request.UserAgent 
= DefaultUserAgent;    

      IAsyncResult result 
= (IAsyncResult)_request.BeginGetResponse(
        
new AsyncCallback(ResponseCallback), this);
      ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle,
        
new WaitOrTimerCallback(TimeoutCallback), this, _timeout, true);      
    }

    另外一个罗嗦的事情,是每个链接建立后,MS服务器会先返回一个罗嗦的license声明,srcsrv.dll会弹出一个对话框让你Accept才能继续下载。
    例如你通过命令行去下载一个文件

wget  --user-agent=Microsoft-Symbol-Server/9.9.9.9
    Http:
//ReferenceSource.microsoft.com/source/.net/8.0/DEVDIV/
    depot
/DevDiv/releases/whidbey/REDBITS/ndp/fx/src/Misc/
   
InvariantComparer.cs/1/InvariantComparer.cs

    会直接返回一对垃圾信息,类似

SYMSRVCOMMAND:
YESNODIALOG:
IDYES:Accept:Accept=0cf80f849aa7449e9d064ade971bd887
IDNO:Decline:Decline=0cf80f849aa7449e9d064ade971bd887
TITLE:End User License Agreement
BUTTONDESCRIPTION:Please read carefully and understand the license agreement above. 
If you want to accept the license agreement, please click the “Accept” button.
TEXT:This license applies to the .NET Framework components that Microsoft makes available to you
in source code form.  To print these terms, select the contents of this area and copy then paste
into an application that can print text.

MICROSOFT .NET FRAMEWORK REFERENCE LICENSE
.NET FRAMEWORK REFERENCE SOURCE CODE


This license governs use of the accompanying software. If you use the software, you accept this license.
If you do not accept the license, do not use the software.
1. Definitions
The terms "reproduce," "reproduction" and "distribution" have the same meaning here as under U.S. copyright law.
 

    解决方法很简单,直接用正则表达式找到里面一个随机生成的id,然后程序自动Accept即可,代码类似

    private static Regex _accept = new Regex(@"IDYES:Accept:Accept=(\w*)");

          
if (task._auth)
          
{
          }

          
else
          
{
            
string license = Encoding.Unicode.GetString(task._buf, 0, read);

            Match m 
= _accept.Match(license);

            
if (m.Success)
            
{

              task._auth 
= true;

              
string id = m.Groups[1].Value;

              _logger.DebugFormat(
"Accept license id {0} for {1}", id, task._request.Address);

              Uri uri 
= new Uri(string.Format("{0}?Accept={1}", task._uri.ToString(), id));

              task.Restart(uri);
            }

          }


其他的基本上没什么需要说明的,就是很基本的http请求调用啥的,呵呵

至于从.pdb里面获取文件名列表,需要调用dbghelp.dll里面的一组api
SymInitializeW/SymCleanup用来初始化和析构symbol engine
SymLoadModuleExW/SymUnloadModule64用来加载要便利源代码的模块
SymEnumSourceFilesW用来遍历一个有.pdb符号且包含已索引源码的列表
SymGetSourceFileW和SymGetSourceFileTokenW/SymGetSourceFileFromToken两套API,都可以用来获得特定源码的下载URL,然后把这个地址用上面两个方法处理一下即可。

注意:目前的实现只是个原型,需要手动下载和配置.pdb文件,并且直接发起大量的异步http请求,对网速慢的朋友,可能需要用 -i 参数增加超时时间(确实15分钟)