.NET高级调试 - 3.9~3.11代码审查以及杂项命令
简介
代码审查就是观察代码,代码形态分为三种C#代码>IL代码》汇编代码。通过代码审查,可以从原始代码的字节流中推测出逻辑详情
高级调试本质上属于逆向分析,更多的是以汇编为主。
反汇编代码
u(unassemble)
命令u把字节流反汇编为汇编指令

还有一个变种ub,uf。 u是向下反汇编,ub是向上反汇编
uf是显示整个函数的返汇编代码
!U
由于sos拓展更清楚CLR的内部细节,因此!U的能够对程序集进行标注(给内存地址打上注释).从而使得反汇编指令更加可读

我们可以看到,同一段代码。!U命令反汇编的可读性更加高
获取方法描述符
有时候使用
!ip2md (instruction pointer to method descriptor)

除了方法的名字外,还额外显示了其他一些信息。方法描述符,方法表,JIT状态,代码地址等。要想快速找出汇编代码位于哪个函数中,会很方便
!name2ee
格式为 模块的名字和方法的全名

同样可以获取方法描述符
观察IL代码
!dumpil
sos提供了!dumpil 命令将托管函数的汇编反编译成IL代码,但不适用内存地址作为参数。而是以方法描述符为参数

观察C#代码
!savemodule
参数为module address.可以使用之前介绍的!ip2md或者!name2ee 来获取module地址


结论
dump文件不要轻易给别人分析,可以从任何角度反编译你的代码。

杂项命令
!eeversion 获取CLR版本
不仅能看到clr版本,还能看到sos版本以及CLR当前的运作模式(服务器模式还是工作站模式)

!gcroot 引用关系

这个命令非常实用,用来判断某一个对象的引用以及为什么没有被GC回收
!FinAppDomain 找出对象的应用程序域

!ProcInfo 转储进程信息
在调试过程中,有时候获得被调试的进程更多信息会非常有用。比如内存使用量,环境变量,处理时间等
有三个变种
- -env
- -time
- -men
.NET高级调试 - 3.9~3.11代码审查以及杂项命令的更多相关文章
- [Android Studio 权威教程]断点调试和高级调试
好了开始写一个简单的调试程序,我们先来一个for循环 ? 1 2 3 4 5 6 7 8 <code class="language-java hljs ">for ( ...
- ###Android 断点调试和高级调试###
转自:http://www.2cto.com/kf/201506/408358.html 有人说Android 的调试是最坑的,那我只能说是你不会用而已,我可以说Android Studio的调试是我 ...
- Visual Studio高级调试技巧
1. 设置软件断点,运行到目标位置启动调试器 方法①:使用汇编指令(注:x64 c++不支持嵌入汇编) _asm 方法②:编译器提供的方法 __debugbreak(); 方法③:使用windows ...
- Android Stuido中断点调试和高级调试
写一个简单的调试程序 import android.os.Bundle; import android.support.v7.app.AppCompatActivity; public class M ...
- Linux高级调试与优化——gdb调试命令
番外 2019年7月26日至27日,公司邀请<软件调试>和<格蠹汇编——软件调试案例集锦>两本书的作者张银奎老师进行<Linux高级调试与优化>培训,有幸聆听张老师 ...
- .NET高级调试系列-Windbg调试入门篇
Windbg是.NET高级调试领域中不可或缺的一个工具和利器,也是日常我们分析解决问题的必备.准备近期写2篇精华文章,集中给大家分享一下如果通过Windbg进行.NET高级调试. 今天我们来一篇入门的 ...
- 玩好.NET高级调试,你也要会写点汇编
一:背景 1. 简介 .NET 高级调试要想玩的好,看懂汇编是基本功,但看懂汇编和能写点汇编又完全是两回事,所以有时候看的多,总手痒痒想写一点,在 Windows 平台上搭建汇编环境不是那么容易,大多 ...
- 高级Bash脚本编程指南(27):文本处理命令(三)
高级Bash脚本编程指南(27):文本处理命令(三) 成于坚持,败于止步 处理文本和文本文件的命令 tr 字符转换过滤器. 必须使用引用或中括号, 这样做才是合理的. 引用可以阻止shell重新解释出 ...
- myeclipse web servelet调试输入的中文在TOMCAT服务器的命令行显示为????
B 问题:myeclipse web servelet调试输入的中文在TOMCAT服务器的命令行显示为???? 解决:调整JSP页面编码:gb2312--->utf-8
- Linux高级调试与优化——信号量机制与应用程序崩溃
背景介绍 Linux分为内核态和用户态,用户态通过系统调用(syscall)进入内核态执行. 用户空间的glibc库将Linux内核系统调用封装成GNU C Library库文件(兼容ANSI &am ...
随机推荐
- 【Spring】03 XML配置
Alias别名设置 可以为一个Bean的ID再设置一个ID 多一个可用标识,大概... 在获取实例注入参数时,两个标识都可以使用 除了Alias可以设置别名之外,Bean的标签本身也可以设置第二别名 ...
- 【C】Re03
一.变量 变量存储了两个东西: 1.内存空间地址 2.内存空间存放的值 本质是给内存地址起了一个别名,允许我们通过别名对内存进行访问 void variable01() { int a = 100; ...
- 计算机网络中的Ad hoc network到底是个啥?
"Ad hoc network" 是一种临时网络,通常指由一组设备(如计算机.手机等)通过无线方式相互连接而不需要依赖固定的基础设施(如路由器或交换机).这些网络通常是自组织的,能 ...
- 惠普暗影精灵2pro挑电池和电源适配器
自己几年前买的暗影2pro前几个月坏掉了,无法充电,而且偶发性掉电,经过长时间研究发现该款电脑存在挑电池和电源适配器的问题. 相关资料: https://www.chinafix.com/thread ...
- 再探 游戏 《 2048 》 —— AI方法—— 缘起、缘灭(3) —— 游戏AI解法设计篇
接前文: 再探 游戏 < 2048 > -- AI方法-- 缘起.缘灭(2) -- 游戏环境设计篇 - Hello_BeautifulWorld - 博客园 (cnblogs.com) = ...
- code: 'ERR_OSSL_EVP_UNSUPPORTED' 报错解决
报错: Error: error:0308010C:digital envelope routines::unsupported at new Hash (node:internal/crypto/h ...
- 和xshell和crt说再见,认识了一款55k star多端跨平台终端神器,强大酷炫
一.Tabby简介 Tabby(以前称为Terminus)是一款高度可配置的终端仿真器.SSH 和串行客户端.开源且跨平台,支持在Windows.macOS和Linux系统下使用. 源码下载 http ...
- 用GDI+旋转多边形来绘制一个时钟摸拟小程序
效果图 在头文件类中声明变量 TCHAR m_dayStr[4]; // 日期 TCHAR m_weekStr[4]; // 星期 Gdiplus::Font* m_pFont; // 字体 Gdip ...
- 关于为什么使用 ASCII GBK Unicode编码
关于为什么使用 ASCII GBK Unicode编码 由来:大家都知道计算机最早是美国人为了更加便捷的存储和计算数据发明的,但是呢计算机底层都是硬件,只能存储像0101这样的二进制数据,那美国人为了 ...
- sublime text _正则表达式01
概述 sublime 常用正则表达式 预备工作:打开sublime之后,ctrl+h,点选使用正则表达式. (\S+) :匹配所有符号外的字符 用到的地方: 小明 小黄 小红 (构造批量插入sql语句 ...