Windbg 从dump提取C#代码 电脑版发表于:2022/9/2 11:41 ![](https://img.tnblog.net/arcimg/hb/0f6f3d2d518b43969c64320d9e4d69d6.png) ># Windbg 从dump提取C#代码 [TOC] ## 抓dump包 tn2>首先我们的应用在服务器上出现问题时,我们可以通过`procdump`或者`procexp`提取文件。 这里我就使用`procdump`来抓取了。 首先以管理员的方式打开Powershell。 (<a target="_blank" href="https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump">关于安装请点击这里</a>) ![](https://img.tnblog.net/arcimg/hb/5a0b01bd4ba54a72a40dc465f49c0255.png) tn2>创建`Inglass.PackagingMediaRepository.UploadJob`进程的Dump到D盘下。 ```bash procdump -ma Inglass.PackagingMediaRepository.UploadJob -i D:\ ``` tn2>更多关于procdump的参数请访问<a href="https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump">这里</a> ## 提取dump中的C#代码 tn2>首先打开Windbg,使用`lm`命令来获得image的base address. ![](https://img.tnblog.net/arcimg/hb/61cc2f89a14b48f28c9804bb3fb00e8f.png) tn2>然后我们通过`SaveModule`提取于此项目相关的代码。 ```bash !SaveModule 00db0000 D:\out.tmp ``` tn2>生成的out.tmp文件,我们通过ILSpy工具进行反汇编一下,但是只发现了几个文件的代码,并没有找到其他包的代码。 ![](https://img.tnblog.net/arcimg/hb/3bf29ad07e814e2d8b503ca429eaa978.png) tn2>这时我们需要通过AppDomain来提取了。 ## AppDomain提取C#代码 tn2>我们知道 CLR 中 Assembly 是在名为 AppDomain 的逻辑空间中被载入运行的,而 AppDomain 是介于操作系统层面进程和线程概念之间,同时具有线程的轻便和进程的封闭性,使用者可以通过 AppDomain.CreateDomain 传见新的 AppDomain。 我们可以通过`EEHeap`命令,通过列出 CLR 执行引擎的堆信息,获取当前运行的 AppDomain 情况。 ```bash !EEHeap ``` ![](https://img.tnblog.net/arcimg/hb/a4d85eff22ef4d57a6321dd469794138.png) tn2>我们可以看到CLR已经有了三个AppDomain:`System Domain`, `Shared Domain` 和 `Domain 1`。 然后我们通过如下命令来查看这三个域中有哪些引用的dll。 ```bash !DumpDomain /d 731875a8 !DumpDomain /d 73187258 !DumpDomain /d 0130aa50 ``` ![](https://img.tnblog.net/arcimg/hb/f91f1f5bae564ae691254b4b48bdae06.png) tn2>我们慢慢滚动,发现想要的包在Domain1下面,并且地址为`01115f40`. ![](https://img.tnblog.net/arcimg/hb/4e6761fe1b064bfb9ec25febb29d7d6f.png) tn2>接着我们通过SaveModule导出该dll的c#代码到D盘的out2.tmp文件中,并再次用ILSpy查看就有了。 ```bash !SaveModule 01115f40 D:\out2.tmp ``` ![](https://img.tnblog.net/arcimg/hb/b6d08a181bc24846a00db264086fd3bb.png) ![](https://img.tnblog.net/arcimg/hb/249bf5fcff5141609234aa74c5aa653e.png)