簡體   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