CLR探索系列:Windbg+SOS动态调试分析托管代码
http://blog.csdn.net/garyye/article/details/4788070
在使用VS进行托管应用程序的调试的时候,有的时候总感觉有些力不从心。譬如查看一个托管堆或者计算堆栈的时候,VS就不能胜任了。这个时候,Windbg+SOS扩展调试模块就为我们提供了一个很好的解决方案。
我们看一段代码:
class Program
{
static void Main(string[] args)
{
Program b = new Program();
b.test();
System.Console.ReadLine();
}
public void test()
{
int i = 67;
System.Console.WriteLine((char)i);
System.Console.WriteLine((char)67);
i = 1;
}
}
这是C#里面的一个强制类型转换,我们现在用windbg+SOS来分析下计算堆栈,以及强制类型转换之后的JIT代码。
在windbg里面加载这个正在运行的程序,attach to this process,然后加载SOS扩展调试模块:
0:003> .load C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/SOS.dll
然后显示当前的线程:
0:003> ~
0 Id: cf0.450 Suspend: 1 Teb: 7ffdf000 Unfrozen
1 Id: cf0.be8 Suspend: 1 Teb: 7ffdd000 Unfrozen
2 Id: cf0.168 Suspend: 1 Teb: 7ffdc000 Unfrozen
. 3 Id: cf0.7d0 Suspend: 1 Teb: 7ffde000 Unfrozen
切换到第0个线程:
0:003> ~0s
eax=0012f2e4 ebx=00000000 ecx=0012f400 edx=00000008 esi=0012f1f4 edi=00250688
eip=7c92eb94 esp=0012f194 ebp=0012f1b4 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
ntdll!KiFastSystemCallRet:
7c92eb94 c3 ret
显示test方法相关的地址:
0:000> !name2ee TestConcoleApp.exe TestConcoleApp.Program.test
Module: 00ab2c24 (TestConcoleApp.exe)
Token: 0x06000002
MethodDesc: 00ab2ff0
Name: TestConcoleApp.Program.test()
JITTED Code Address: 00d000f8
显示这个方法被C#编译器编译之后的IL代码:
0:000> !dumpil 00ab2ff0
ilAddr = 00402074
IL_0000: nop
IL_0001: ldc.i4.s 67
IL_0003: stloc.0
IL_0004: ldloc.0
IL_0005: conv.u2
IL_0006: call System.Console::WriteLine
IL_000b: nop
IL_000c: ldc.i4.s 67
IL_000e: call System.Console::WriteLine
IL_0013: nop
IL_0014: ldc.i4.1
IL_0015: stloc.0
IL_0016: ret
这里,sandwi对conv.u2这条指令一直困惑良多。我也对这个问题困惑了好久,翻阅了很多资料也没找到,后来准备在sscli的C#编译器里面找到答案,不过没找到地方......
后来被证实,这条指令是C#编译器为了类型安全,而生成的一条指令。作用在于把一个integer转换称为一个unsigned int16,然后前面补0成为int32压入堆栈里面去。
这是一个语言编译器行为,为了证实这个想法,同时写了一段同样的VB代码来证实我们的想法:
Module Module1
Sub Main()
Dim i As Integer
i = 67
System.Console.WriteLine(Chr(i))
System.Console.WriteLine(Chr(67))
System.Console.ReadLine()
End Sub
End Module
编译之后的IL代码也同样支持上面的想法。
这里,感谢微软的张翼证实了我关于conv.u2的存在原因的猜想。但是,zhangyi说在test方法中的conv.u2指令在JIT生成的本地代码中被优化掉了,我却不同意这种看法:
0:000> !u 00d000f8
这条指令,是显示JIT编译了的test方法的本地代码,根据
JITTED Code Address: 00d000f8
这一行得来的。显示结果如下:
Normal JIT generated code
TestConcoleApp.Program.test()
push esi
push eax
mov dword ptr [esp],ecx
cmp dword ptr ds:[0AB2DD8h],0
je 00d0010b (跳到xor esi,esi这里)
call mscorwks!CorLaunchApplication+0x108b4 (7a08e179)
xor esi,esi
nop
mov esi,43h
movzx ecx,si
call mscorlib_ni+0x2f8b9c (793b8b9c) (System.Console.WriteLine(Char), mdToken: 06000759)
nop
mov ecx,43h
call mscorlib_ni+0x2f8b9c (793b8b9c) (System.Console.WriteLine(Char), mdToken: 06000759)
nop
mov esi,1
pop ecx
pop esi
ret
这里,movzx ecx,si这条指令就对应了IL代码里面的Conv.u2,把对应的int前面补0放入到ecx寄存器里面去。
后记:关于动态调试托管代码,我也是刚接触不久,上面有不准确的地方,欢迎大家多多指正
CLR探索系列:Windbg+SOS动态调试分析托管代码的更多相关文章
- Anroid逆向学习从编写so到静动态调试分析arm的一次总结
Anroid逆向学习从编写so到静动态调试分析arm的一次总结 一.前言 最近跟着教我兄弟学逆向这篇教程学习Android逆向,在第七课后作业反复折腾了好几天,正好在折腾的时候对前面的学习总结一波,动 ...
- 使用Windbg和SoS扩展调试分析.NET程序
在博客堂的不是我舍不得 - High CPU in GC(都是+=惹的祸,为啥不用StringBuilder呢?). 不是我舍不得 - .NET里面的Out Of Memory 看到很多人在问如何分析 ...
- js调试系列: 断点与动态调试[基础篇]
js调试系列目录: - 额,我说的不是张敬轩的 断点 这首歌,是调试用到的断点,进入正题吧. 昨天留的课后练习 1. 分析 votePost 函数是如何实现 推荐 的.其实我们已经看到了源码,只要读下 ...
- Plist文件编辑工具PlistEdit Pro 1.9.1动态调试分析
0x00:简介 PlistEdit Pro是为macOS平台最优秀的属性列表和JSON编辑器.Mac和iOS开发人员在开发应用程序时必须编辑各种属性列表和JSON文件.PlistEdit Pr ...
- 【转】安卓逆向实践5——IDA动态调试so源码
之前的安卓逆向都是在Java层上面的,但是当前大多数App,为了安全或者效率问题,会把一些重要功能放到native层,所以这里通过例子记录一下使用IDA对so文件进行调试的过程并对要点进行总结. 一. ...
- CVE-2010-3974:Windows 传真封面编辑器 FxsCover.exe 双重释放漏洞调试分析
0x01 堆空间申请后的双重释放 Windows FxsCover 程序存储封面编辑器的信息,封面编辑器是传真服务的一个组件,通过解析特定的传真封面文件(.cov)时,会调用类析构函数对同一内存中的栈 ...
- CLR探索应用程序域世界(上):Windbg SOS剖析揭示域世界
在CLR的世界中,有一系列的令人Amazing的技术和架构.其中,CLR对应用程序在内存中内存分配,执行模型,程序之间的交互等一系列的技术,值得每一个致力于DotNet平台的技术人员深究. 编程人员在 ...
- WinDbg调试分析 net站点 CPU100%问题
WinDbg调试分析 asp.net站点 CPU100%问题 公司为了节省成本,最近有一批服务器降了配置,CPU从8核降到了2核.本身是小站点,访问量也不高,CPU总是会飙到100%而且可以一直持续几 ...
- .NET高级调试系列-Windbg调试入门篇
Windbg是.NET高级调试领域中不可或缺的一个工具和利器,也是日常我们分析解决问题的必备.准备近期写2篇精华文章,集中给大家分享一下如果通过Windbg进行.NET高级调试. 今天我们来一篇入门的 ...
随机推荐
- oracle数据库cmd导出数据和导入数据
一:前言 每次我自己来导出oracle数据的数据进行备份的时候都是要看一遍记载的语句,还别说自己敲多了,也熟练了,但是还是不是很放心,所以就记载下来吧. 二:内容 (1).最简单,最直接的导入方式(这 ...
- sql注入预防
在我们登陆验证时会发现sql注入的现象. 1.sql注入发生原因 因为如果用户在用户名上输入的是' or 1=1 # 时,我们得到的sql语句是select * from shop_user wher ...
- Linux XZ格式的解压
xz这个压缩可能很多都很陌生,不过您可知道xz是绝大数linux默认就带的一个压缩工具. 之前xz使用一直很少,所以几乎没有什么提起. 我是在下载phpmyadmin的时候看到这种压缩格式的,phpm ...
- eclipse导入java和android sdk源码,帮助文档
eclipse导入java和android sdk源码,帮助文档 http://blog.csdn.net/ashelyhss/article/details/37993261 JavaDoc集成到E ...
- HDU3910(数学期望题,题目难懂)
Liang Guo Sha Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- SSH的简单入门体验(Struts2.1+Spring3.1+Hibernate4.1)- 查询系统(上)
所谓SSH,指的是struts+spring+hibernate的一个集成框架,它是目前较流行的一种Web应用程序的开源框架. 集成SSH框架的系统从职责上分为四层:表示层.业务逻辑层.数据持久层和域 ...
- 常用的find命令
find命令 find [路径名] –name/-size/-perm find [路径名] –name “*p” 在路径搜索p结尾的文件夹及文件 find [路径名] –name “[ab]*” 在 ...
- JAVA 批量执行测试用例
如果多个测试用例在不同的类中,又需要一次性执行完所有的测试用例,则可以使用到Junit中的批量执行测试方法. 方法一 这种方式非常简单,不需要额外多写一行代码,Eclipse 本来就支持以项目或包为单 ...
- redis发布订阅、HyperLogLog与GEO功能的介绍
一.发布订阅 1.模型 发布者发布消息,订阅者接收消息 2.API 2.1.publish 2.2.订阅 2.3.取消订阅 unsubsribe 2.4.其他api 二.HyperLogLog 极小空 ...
- AC日记——[Noi2011]阿狸的打字机 bzoj 2434
2434 思路: 构建ac自动机: 抽离fail树: 根据字符串建立主席树: 在线处理询问: 询问x在y中出现多少次,等同于y有多少字母的fail能走到x: 1a,hahahahah: 代码: #in ...