繁体   English   中英

C#代码x86反汇编看到的FFFF ****地址空间中的这些小功能是什么?

[英]What are these little functions in FFFF**** addres space seen by C# code x86 disassembly?

在调试一些用C#编写的代码时,我不得不遍历反汇编才能更清楚地了解微级上正在发生的事情。 大多数代码相当透明,但是CLR或C#显然提供了一些功能,因为我没有实现它们,它们位于0xffff ****地址空间中,而我却不知道。 例如在Bitmap.Width有一个FFFF0630的调用:

00000000  push        ebp 
00000001  mov         ebp,esp 
00000003  push        eax 
00000004  xor         eax,eax 
00000006  mov         dword ptr [ebp-4],eax 
00000009  mov         eax,dword ptr [ecx+10h] 
0000000c  mov         edx,ecx 
0000000e  push        eax 
0000000f  push        edx 
00000010  lea         ecx,[ebp-4] 
00000013  call        FFFF0630 

我无法使用调试器进入它,所以我只能从上下文中推测,它应该用于某种内存验证。 但我不知道,因为即使该功能二层Bitmap.Height有在同一地点另一个地址FFFF060C。 对两个几乎等效的属性进行不同的验证没有多大意义。

那么,这些功能的确是什么? 他们在做什么?

我无法使用调试器进入

您是否启用了本地调试? .NET将底层Win32函数用于OS服务。 它可能是对本机DLL的调用。

有另一个地址FFFF060C

找出地址加载哪些库的两种方法:

  1. Visual Studio中的“模块”视图(菜单:“调试” |“ Windows” |“模块”)。

  2. 流程浏览器的视图| 下部窗格视图 Dlls(您可能需要添加基地址列)。

DLL加载的地址取决于OS,32/64位,ASLR和DLL中的首选基址。

通常,系统DLL在进程的地址空间中加载得很高。

您可以在此处找到System.Drawing, Bitmap所在的位置。 它从Image继承, Image同时包含HeightWidth 他们看起来像这样:

public int Height {
    get {
        uint height;            
        Status status = GDIPlus.GdipGetImageHeight (nativeObject, out height);      
        GDIPlus.CheckStatus (status);           

        return (int)height;
    }
}
public int Width {
    get {
        uint width;         
        Status status = GDIPlus.GdipGetImageWidth (nativeObject, out width);        
        GDIPlus.CheckStatus (status);           

        return (int)width;
    }
}

它们都称为GDIPlus.CheckStatus所以它们是共同的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM