发新话题
打印

[转载]用WinDbg动态脱Reflector

[转载]用WinDbg动态脱Reflector

文章作者: Bi11

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

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

用WinDbg加载Reflector
Microsoft(R)WindowsDebuggerVersion6.6.0003.5
...

在加载mscorjit.dll时设异常,执行
0:000>sxeld:mscorjit.dll
0:000>g
...
ModLoad:794300007947d000C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\MSCORJIT.DLL
eax=00000000ebx=00000000ecx=00f60000edx=7c92eb94esi=00000000edi=00000000
eip=7c92eb94esp=0012e99cebp=0012ea90iopl=0nvupeingnzacponc
cs=001bss=0023ds=0023es=0023fs=003bgs=0000efl=00000296
ntdll!KiFastSystemCallRet:
7c92eb94c3ret

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

找Assembly.Load的MethodDesc
0:000>!name2eemscorlib.dllSystem.Reflection.Assembly.Load
LoadedSonofStrikedatatableversion5from"C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\mscorwks.dll"
...
-----------------------
MethodDesc:79ba35a8
Name:[DEFAULT]ClassSystem.Reflection.AssemblySystem.Reflection.Assembly.Load(SZArrayUI1)
-----------------------

给这个MethodDesc的m_CodeOrIL上加个断点(等RV添入)
0:000>baw479ba35a8+4
0:000>g
Breakpoint0hit
...

RV应该添入了,设个断点
0:000>bppoi(79ba35a8+4)
0:000>g
Breakpoint1hit
eax=79a3bea8ebx=01283de0ecx=02447a68edx=00b4568cesi=01285f54edi=01285f30
eip=79a3bea8esp=0012f644ebp=0012f674iopl=0nvupeiplnznaponc
cs=001bss=0023ds=0023es=0023fs=003bgs=0000efl=00000206
mscorlib_79990000+0xabea8:
79a3bea850pusheax

看看堆栈,没问题~
0:000>!clrstack
Thread0
ESPEIP
0012f64479a3bea8[DEFAULT]ClassSystem.Reflection.AssemblySystem.Reflection.Assembly.Load(SZArrayUI1)
0012f64800f702d7[DEFAULT][hasThis]VoidReflector.Application..ctor(ClassReflector.IWindowManager)
0012f67c00f70090[DEFAULT]VoidReflector.Application.ᐁ()
0012f9b0791d94bc[FRAME:GCFrame]
0012fa94791d94bc[FRAME:GCFrame]

看看堆栈里的objects
0:000>!dumpstackobjects
ESP/REGObjectName
ebx01283de0Reflector.Application
ecx02447a68System.Byte[]
esi01285f54ᐄ
edi01285f30System.IO.MemoryStream
0012f64c01283de0Reflector.Application
0012f65401284decSystem.IO.__UnmanagedMemoryStream
0012f66001283de0Reflector.Application

我们找到了她的地址:2447a68,看看:
0:000>d02447a68
02447a683c2cb60000000e00-4d5a000005000000<,......MZ......
02447a7804000000ffff0000-8000000000000000................
02447a884000000000000000-0000000000000000@...............
02447a980000000000000000-0000000000000000................
02447aa80000000080000000-0e1fe800005a83c2.............Z..
02447ab80db409cd21b8014c-cd21546869732070....!..L.!Thisp
02447ac8726f6772616d2063-616e6e6f74206265rogramcannotbe
02447ad82072756e20696e20-444f53206d6f6465runinDOSmode

换只眼看看
0:000>dd02447a68
02447a6800b62c3c000e000000005a4d00000005
02447a78000000040000ffff0000008000000000
02447a8800000040000000000000000000000000
02447a9800000000000000000000000000000000
02447aa8000000000000008000e81f0ec2835a00
02447ab8cd09b40d4c01b821685421cd70207369
02447ac872676f7263206d616f6e6e6165622074
02447ad86e757220206e692020534f4465646f6d

用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-SonofStrike
%???%\SDK\v1.1\ToolDevelopersGuide\Samples\sos\SOS.htm

TOP

发新话题