首页
社区
课程
招聘
[原创]用WinDbg动态脱Reflector
发表于: 2006-2-4 00:21 18289

[原创]用WinDbg动态脱Reflector

2006-2-4 00:21
18289

用WinDbg动态脱Reflector

Bi11[CCG]
4 Feb 2006

我才知道WinDbg+SOS能调托管程序。。。无敌。。。

举个例子吧,脱Reflector玩玩,最新的4.2.0.0。
精华7里henryouly的《研读Reflector的保护原理心得》文中已经说了原理。简单说就是先解压,然后用Assembly.Load(byte[])加载。这次我们的任务是动态将这个要加载的byte[]给dump出来。

用WinDbg加载Reflector
Microsoft (R) Windows Debugger  Version 6.6.0003.5
...

在加载mscorjit.dll时设异常,执行
0:000> sxe ld:mscorjit.dll
0:000> g
...
ModLoad: 79430000 7947d000   C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\MSCORJIT.DLL
eax=00000000 ebx=00000000 ecx=00f60000 edx=7c92eb94 esi=00000000 edi=00000000
eip=7c92eb94 esp=0012e99c ebp=0012ea90 iopl=0         nv up ei ng nz ac po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000296
ntdll!KiFastSystemCallRet:
7c92eb94 c3               ret

载入sos.dll (WinDbg的插件,就在%windir%\Microsoft.NET\Framework\v1.1.4322\下。如果不能加载,请先设PATH环境变量)
0:000> .load sos

找Assembly.Load的MethodDesc
0:000> !name2ee mscorlib.dll System.Reflection.Assembly.Load
Loaded Son of Strike data table version 5 from "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\mscorwks.dll"
...
-----------------------
MethodDesc: 79ba35a8
Name: [DEFAULT] Class System.Reflection.Assembly System.Reflection.Assembly.Load(SZArray UI1)
-----------------------

给这个MethodDesc的m_CodeOrIL上加个断点(等RV添入)
0:000> ba w4 79ba35a8+4
0:000> g
Breakpoint 0 hit
...

RV应该添入了,设个断点
0:000> bp poi(79ba35a8+4)
0:000> g
Breakpoint 1 hit
eax=79a3bea8 ebx=01283de0 ecx=02447a68 edx=00b4568c esi=01285f54 edi=01285f30
eip=79a3bea8 esp=0012f644 ebp=0012f674 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
mscorlib_79990000+0xabea8:
79a3bea8 50               push    eax

看看堆栈,没问题~
0:000> !clrstack
Thread 0
ESP       EIP     
0012f644  79a3bea8 [DEFAULT] Class System.Reflection.Assembly System.Reflection.Assembly.Load(SZArray UI1)
0012f648  00f702d7 [DEFAULT] [hasThis] Void Reflector.Application..ctor(Class Reflector.IWindowManager)
0012f67c  00f70090 [DEFAULT] Void Reflector.Application.ᐁ()
0012f9b0  791d94bc [FRAME: GCFrame]
0012fa94  791d94bc [FRAME: GCFrame]

看看堆栈里的objects
0:000> !dumpstackobjects
ESP/REG  Object   Name
ebx      01283de0 Reflector.Application
ecx      02447a68 System.Byte[]
esi      01285f54 ᐄ
edi      01285f30 System.IO.MemoryStream
0012f64c 01283de0 Reflector.Application
0012f654 01284dec System.IO.__UnmanagedMemoryStream
0012f660 01283de0 Reflector.Application

我们找到了她的地址:2447a68,看看:
0:000> d 02447a68
02447a68  3c 2c b6 00 00 00 0e 00-4d 5a 00 00 05 00 00 00  <,......MZ......
02447a78  04 00 00 00 ff ff 00 00-80 00 00 00 00 00 00 00  ................
02447a88  40 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  @...............
02447a98  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
02447aa8  00 00 00 00 80 00 00 00-0e 1f e8 00 00 5a 83 c2  .............Z..
02447ab8  0d b4 09 cd 21 b8 01 4c-cd 21 54 68 69 73 20 70  ....!..L.!This p
02447ac8  72 6f 67 72 61 6d 20 63-61 6e 6e 6f 74 20 62 65  rogram cannot be
02447ad8  20 72 75 6e 20 69 6e 20-44 4f 53 20 6d 6f 64 65   run in DOS mode

换只眼看看
0:000> dd 02447a68
02447a68  00b62c3c 000e0000 00005a4d 00000005
02447a78  00000004 0000ffff 00000080 00000000
02447a88  00000040 00000000 00000000 00000000
02447a98  00000000 00000000 00000000 00000000
02447aa8  00000000 00000080 00e81f0e c2835a00
02447ab8  cd09b40d 4c01b821 685421cd 70207369
02447ac8  72676f72 63206d61 6f6e6e61 65622074
02447ad8  6e757220 206e6920 20534f44 65646f6d

用LordPE把0x2447a70开始,0xe0000大小的内存Dump到文件。改个exe,peid查看入口,_CorDllMain,是dll文件。那就再把文件名改成dll。

拖到Reflector,正常,收工。初次玩WinDbg,有出丑的地方还请指正~

顺便提一下,4.2的Reflector混淆用的都是不可显示的Unicode,出来一个个框框,太有创意了。

主要参考资料:

在托管代码中设置断点(WINDBG)
http://blog.joycode.com/gangp/articles/20417.aspx

用WinDbg探索CLR世界 [3] 跟踪方法的 JIT 过程
http://www.blogcn.com/User8/flier_lu/blog/1678453.html

SOS - Son of Strike
%???%\SDK\v1.1\Tool Developers Guide\Samples\sos\SOS.htm


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (16)
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
2
辛苦
希望能多看到用WinDbg调试的教程
2006-2-4 01:27
0
雪    币: 206
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
敢问 WinDbg  是什么东西啊?
多谢回答!
2006-2-4 04:21
0
雪    币: 301
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
4
收藏一份先,还没用过WinDbg
2006-2-4 09:16
0
雪    币: 14940
活跃值: (4728)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
WinDbg还用不明白...学习学习
2006-2-4 09:38
0
雪    币: 208
活跃值: (376)
能力值: ( LV12,RANK:330 )
在线值:
发帖
回帖
粉丝
6
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx
2006-2-4 19:02
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不明白...学习学习
2006-2-4 20:52
0
雪    币: 223
活跃值: (85)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
真正的高人用windbg,而且支持接口开发,未来取代softice的超级利器,说句实话。不是MS保守,哪还有softice的天下,ms故意把windbg做的这么难。
2006-2-7 20:42
0
雪    币: 238
活跃值: (326)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
9
windbg 在内核状态似乎不太稳定,至少我的感觉如此,不小心输错一个命令,立刻死机,而且是两台机一起死,真的很惨.windbg 的命令多的数不清, 而且就连同家族的 kd cd 都不同(虽然只有很少的差别,但足以让你死机,而且死的不明不白,没有任何提示).许多windbg的命令在Help当中都有专门的说明,叫你不用记住这条命令,因为这条命令经过updata后也许就换一个名字了,或者换了参数或参数格式了.
windbg 虽然强大无比,因为和操作系统是一个老板开发的,但由于命令太多,而且命令格式和其他debug不同,所以太难使用.(也许这就是开发者当初设计的目的).
windbg 在内核模式工作时,输入一个命令,然后你有足够的时间点燃香烟,抽上几口,活动一下胫骨.保证开发人员一直处于最佳状态.切记要有耐心,你输入的命令不到半个小时,你不能认为他死了.
偶尔也会使用windbg但不是用来调试.而是用来查看许多底层结构.也不敢用这样不稳定的debug来调试程序,哪怕输入错一个字母,立刻死机,并没有任何交代(提示信息,这一点简直太伟大了).
注:我这里指的是windbg处于内核模式,双机调试.
正是因为以上的特点,所以我赞美windbg.我佩服老盖作为一个商人的精明,和为人的态度.
这只是我的个人观点,如果你觉得这样的说法不如您的意思,只当没有看到,谢谢.从心里讲,非常希望这个伟大的debug能容易使用一点.可是......
另外如果你觉得windbg是非常稳定的,只是我不会使用,我没有任何不同的看法,我就是学不会.同样我也不会使用softice,但他不死,我也不会使用od,但他也不死.这就够了.
2006-2-9 05:19
0
雪    币: 234
活跃值: (104)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
最初由 gzgzlxg 发布
windbg 在内核状态似乎不太稳定,......
同样我也不会使用softice,........


不知台兄使用啥底层调试工具? 传说中的硬件调试器(hard ice)?
2006-2-9 09:55
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
最初由 gzgzlxg 发布
windbg 在内核状态似乎不太稳定,至少我的感觉如此,不小心输错一个命令,立刻死机,而且是两台机一起死,真的很惨.windbg 的命令多的数不清, 而且就连同家族的 kd cd 都不同(虽然只有很少的差别,但足以让你死机,而且死的不明不白,没有任何提示).许多windbg的命令在Help当中都有专门的说明,叫你不用记住这条命令,因为这条命令经过updata后也许就换一个名字了,或者换了参数或参数格式了.
windbg 虽然强大无比,因为和操作系统是一个老板开发的,但由于命令太多,而且命令格式和其他debug不同,所以太难使用.(也许这就是开发者当初设计的目的).
windbg 在内核模式工作时,输入一个命令,然后你有足够的时间点燃香烟,抽上几口,活动一下胫骨.保证开发人员一直处于最佳状态.切记要有耐心,你输入的命令不到半个小时,你不能认为他死了.
偶尔也会使用windbg但不是用来调试.而是用来查看许多底层结构.也不敢用这样不稳定的debug来调试程序,哪怕输入错一个字母,立刻死机,并没有任何交代(提示信息,这一点简直太伟大了).
注:我这里指的是windbg处于内核模式,双机调试.
........


兄弟很幽默呀
:)
2006-2-9 17:26
0
雪    币: 494
活跃值: (629)
能力值: ( LV9,RANK:1210 )
在线值:
发帖
回帖
粉丝
12
最初由 gzgzlxg 发布
windbg 在内核状态似乎不太稳定,至少我的感觉如此,不小心输错一个命令,立刻死机,而且是两台机一起死,真的很惨.windbg 的命令多的数不清, 而且就连同家族的 kd cd 都不同(虽然只有很少的差别,但足以让你死机,而且死的不明不白,没有任何提示).许多windbg的命令在Help当中都有专门的说明,叫你不用记住这条命令,因为这条命令经过updata后也许就换一个名字了,或者换了参数或参数格式了.
windbg 虽然强大无比,因为和操作系统是一个老板开发的,但由于命令太多,而且命令格式和其他debug不同,所以太难使用.(也许这就是开发者当初设计的目的).
windbg 在内核模式工作时,输入一个命令,然后你有足够的时间点燃香烟,抽上几口,活动一下胫骨.保证开发人员一直处于最佳状态.切记要有耐心,你输入的命令不到半个小时,你不能认为他死了.
偶尔也会使用windbg但不是用来调试.而是用来查看许多底层结构.也不敢用这样不稳定的debug来调试程序,哪怕输入错一个字母,立刻死机,并没有任何交代(提示信息,这一点简直太伟大了).
注:我这里指的是windbg处于内核模式,双机调试.
........


真有这么差啊? 我看那些玩rootkit的高人都用WinDbg的。我倒是想学,不过N多的命令让人生畏
2006-2-9 18:24
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
13
一群笨蛋,笑翻。。。

windbg的GUI只是个DEMO,各位可以编写自己的windbgGUI
2006-2-14 23:15
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ywb
14
呵呵 ,,,,,,,,,,,,.........我是不会,也不学了 
2006-2-15 10:19
0
雪    币: 277
活跃值: (312)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
15
不知道有没有简体中文版的。
2006-2-16 20:22
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
可用虚拟机使用,防止错误。
2006-2-28 22:39
0
雪    币: 35761
活跃值: (7155)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
说得在理啊,我虚拟机中单步都兰屏了。
2022-2-22 19:34
0
游客
登录 | 注册 方可回帖
返回
//