一:背景

相信有很多朋友在遇到应用程序各种奇葩问题后,拿下来一个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. where is the storage location of the browser's HTTP cache? disk or memory

    where is the storage location of the browser's HTTP cache? disk or memory HTTP cache & storage l ...

  2. node mailer & email bot

    node mailer & email bot email https://nodemailer.com/about/ https://github.com/nodemailer/nodema ...

  3. js 拖拽排序

    See alsoe: https://www.runoob.com/html/html5-draganddrop.html https://developer.mozilla.org/zh-CN/do ...

  4. yaml配置和ini配置的数据源配置和数据获取

    1.前言 关于yaml和ini的相关理论暂不做记录,不影响代码编写,百度即可. 2.关于配置文件的选择 yaml 和 ini 都使用过, 但是yaml更符合人类使用,已要弃用ini,后期各项目均采用y ...

  5. 01_MySQL从下载—>安装—>到快速上手

    一.MySQL下载 二.MySQL安装 三.MySQL几条简单命令快速上手(增删改查) 一.MySQL下载与安装 下载地址:https://dev.mysql.com/downloads/mysql/ ...

  6. 【Notes】现代图形学入门_02

    跟着闫令琪老师的课程学习,总结自己学习到的知识点 课程网址GAMES101 B站课程地址GAMES101 课程资料百度网盘[提取码:0000] 光栅化 着色(Shading) 在图形学中,着色的定义可 ...

  7. 微信支付/支付宝支付/银联支付,对比加总结(Java服务端)

    今天来讲讲支付. 工作到现在,接入过好几个项目的支付,其中涉及到了微信支付.支付宝支付.银联支付. 三种支付的对接感受其实整体上大同小异.都遵循同一个流程: 1).商户APP向商户服务器请求生成订单 ...

  8. 卧槽,好强大的魔法,竟能让Python支持方法重载

    1. 你真的了解方法重载吗? 方法重载是面向对象中一个非常重要的概念,在类中包含了成员方法和构造方法.如果类中存在多个同名,且参数(个数和类型)不同的成员方法或构造方法,那么这些成员方法或构造方法就被 ...

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

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

  10. 定西+简单dp

    定西 ECNU-3531 #include<iostream> #include<cstdio> #include<algorithm> #include<c ...