一:背景

相信有很多朋友在遇到应用程序各种奇葩问题后,拿下来一个dump文件,辛辛苦苦分析了大半天,终于在某一个线程的调用栈上找到了一个可疑的方法,但 windbg 常常是以 汇编 的方式显示方法代码的,可惜的是,现如今的汇编,有多少像我们这些速成系码农还看的懂呢?

接下来尖锐的问题就来了,如何将这些汇编代码转成 C# 源代码,如果转不成源代码转成 IL代码也好呀,起码我努努力还是能试着看的懂的。。。

本篇我就来分享下如何把 dump 中的方法源码提取出来。

二: 从 dump 文件中提取源代码

1. 案例演示

为了能够演示方便,我用 .netcore 3.1 写了一个简单的demo,代码如下:


namespace ConsoleApp6
{
class Program
{
static void Main(string[] args)
{
Run();
} static void Run()
{
Console.WriteLine("hello world!");
Console.ReadLine();
}
}
}

将程序跑起来后,使用 任务管理器, adplus, procdump 随便哪一个抓取 dump 都可以。

2. 使用 lm + savemodule 命令提取

如果你的程序足够简单,可以直接用 lm 获取程序中所有的模块,然后使用 savemodule 将模块导出为 exe/dll 物理文件,如下所示:

  • 使用 lm 提取出所有模块

0:000> lm
start end module name
000002c2`264b0000 000002c2`264b8000 ConsoleApp6_2c2264b0000 (deferred)
00007ff7`e4a50000 00007ff7`e4a7f000 ConsoleApp6 (deferred)
00007ffa`a4b50000 00007ffa`a546d000 System_Private_CoreLib (deferred)
00007ffa`a5470000 00007ffa`a59df000 coreclr (deferred)
00007ffa`df070000 00007ffa`df1b2000 clrjit (deferred)
...

可以隐约的看到,我有一个名为 ConsoleApp6_2c2264b0000 的模块,这就是我要提取的 ConsoleApp6.exe,顺便提一下,那个很碍眼的 ConsoleApp6 (deferred) 是 PE 文件,要问我怎么知道的? 试一下就好啦

  • 使用 savemodule 提取

从上面第一行 start 列中可以看到 ConsoleApp6_2c2264b0000 的开始地址为 000002c2264b0000,接下来用 savemodule 导出到 E:\dump


0:000> !savemodule 000002c2`264b0000 E:\dump\ConsoleApp6.exe
3 sections in file
section 0 - VA=2000, VASize=6c4, FileAddr=200, FileSize=800
section 1 - VA=4000, VASize=564, FileAddr=a00, FileSize=600
section 2 - VA=6000, VASize=c, FileAddr=1000, FileSize=200

然后就可以看到 E:\dump 里面多了一个 ConsoleApp6.exe

如何从 dump 文件中提取出 C# 源代码?的更多相关文章

  1. (转) 从ffmpeg中提取出YUV数据

    有时需要从ffmpeg中提取出YUV数据用作预览,另存什么的. ffmpeg是先解码成YUV, 再以这个YUV作为输入进行编码,所以YUV数据有两种:  解码后的YUV数据, 以及  编码重建的YUV ...

  2. 从一段文字中提取出uri信息

    package handle.groupby; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io ...

  3. 用正则怎么将html文件中文字取出进行ASCII码转换?

    用正则怎么将html文件中文字取出?今天碰到这个问题,思来想去尝试了好几种方法,历经一阵头脑风暴,最后终于还是解决了,想想还是来记录一下.一共定义了三个函数,包含正则切割.正则判断对象开头.ASCII ...

  4. 从一个数组中提取出第start位到第end位

    假设通过数组in来表示一个很大的数(in[0]表示最低bit),提取该数的第start位到第end位(计数起始位为0): #define MAX_BYTE_LEN ( 48 ) int getData ...

  5. [Spark][python]从 web log 中提取出 UserID 作为key 值,形成新的 RDD

    针对RDD, 使用 keyBy 来构筑 key-line 对: [training@localhost ~]$ cat webs.log 56.31.230.188 - 90700 "GET ...

  6. jstack Dump 日志文件中的线程状态

    [转]jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注)  执行中,Runnable 等待资源,Waiting on condi ...

  7. jstack Dump 日志文件中的线程状态(转)

    jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注)  执行中,Runnable 等待资源,Waiting on conditio ...

  8. dump文件解析之探索.Net的内存

    前言: 对于需要长时间运行的.net程序,有时需要我们查看内存的使用有没有内存泄露问题. 我们可以从dump文件中找到答案. Dump的看点 用dump文件来分析内存,到底我们需要关心哪些点呢? 内存 ...

  9. 利用VS2005进行dump文件调试

    前言:利用drwtsn32或NTSD进行程序崩溃处理,都可以生成可用于调试的dmp格式文件.使用VS2005打开生成的DMP文件,能很方便的找出BUG所在位置.本文将讨论以下内容: 1.  程序编译选 ...

随机推荐

  1. c++指针练习

    Pointers 在getchar处断点,断点后,调试->窗口->反汇编 查看数据 main #include <iostream> #include <Windows. ...

  2. Mila Fletcher:日常理财应注意的五点

    米拉·弗莱彻于2007年毕业于耶鲁大学,她是一名真正意义上的法学博士,在校期间获得了马歇尔奖学金,毕业后曾在美国多家知名律师事务所任职,目前就职于星盟全球投资公司,专注于帮助公司和客户提供法务咨询,他 ...

  3. DENIEL SOIBIM:真正自律的人都在做这些事情!

    生活节奏的加快,使得很多人无法适从.很多人,浑浑噩噩,庸庸碌碌,觉得一天做了很多事,却总是一事无成.还有些人,觉得得过且过也很好,但是到头来,却让自己陷入慌乱之中.本想要自由自在的生活,但是却往往却被 ...

  4. NGK:APP一站式挖矿高收益项目

    NGK是10月中旬刚上线的公链项目,采用手机挖矿形式.NGK数字增益平台,200美金即可入场,收益可观,分为静态和动态两种,投资算力收益超高.邀请好友挖矿还有额外的返佣. NGK立志为所有人创造无差别 ...

  5. Hive实现自增序列及常见的Hive元数据问题处理

    Hive实现自增序列 在利用数据仓库进行数据处理时,通常有这样一个业务场景,为一个Hive表新增一列自增字段(比如事实表和维度表之间的"代理主键").虽然Hive不像RDBMS如m ...

  6. 第39天学习打卡(UDP多线程在线咨询 URL)

    UDP多线程在线咨询  package com.kuang.chat; ​ import java.io.BufferedReader; import java.io.InputStreamReade ...

  7. Spirent Tester二层裸流配置

    1.OLT配置 配一个VLAN,若GE口打Tag,不需要打PVID,打Untag,配PVID. 在ONU上配一个Other Bridge Wan链接. 2.TestCenter配置 选定两个TestC ...

  8. Nginx解析漏洞复现以及哥斯拉连接Webshell实践

    Nginx解析漏洞复现以及哥斯拉连接Webshell实践 目录 1. 环境 2. 过程 2.1 vulhub镜像拉取 2.2 漏洞利用 2.3 webshell上传 2.4 哥斯拉Webshell连接 ...

  9. CCF(317号子任务)-35分:Dijikstra算法

    317号子任务 201903-5 为了过前60分,想使用dijikstra优化算法的,但是最后还是只过了35分.这里的思路只需要先将所有的行星据点进行一次dijikstra,分别存储所有点到行星的最短 ...

  10. 小程序setData中key用变量

    Page({ data:{ //类型列表 lastRootList:0,//上次点击的类型 rootList:[{name:'服饰箱包',selectClass:'root-active',iconC ...