2016-05-07 33 views
0

嗨,我有一個來源,執行以下操作。獲取掛起進程的lpbase地址

int[] context = new int[179]; 
context[0] = 65538; //context integer 
GetThreadContext(PI.hThread, context); //from kernel32 

ReadProcessMemory(PI.hProcess, context[41]+ 8, ref BaseAddress, 4, ref ReadWrite) 

經過Google搜索之後,上下文[41]指的是EBX。任何想法爲什麼? PInvokes.net顯示以下內容。

[StructLayout(LayoutKind.Sequential)] 
public struct CONTEXT 
{ 
    public uint ContextFlags; //set this to an appropriate value 
    // Retrieved by CONTEXT_DEBUG_REGISTERS 
    public uint Dr0; 
    public uint Dr1; 
    public uint Dr2; 
    public uint Dr3; 
    public uint Dr6; 
    public uint Dr7; 
    // Retrieved by CONTEXT_FLOATING_POINT 
    public FLOATING_SAVE_AREA FloatSave; 
    // Retrieved by CONTEXT_SEGMENTS 
    public uint SegGs; 
    public uint SegFs; 
    public uint SegEs; 
    public uint SegDs; 
    // Retrieved by CONTEXT_INTEGER 
    public uint Edi; 
    public uint Esi; 
    public uint Ebx; 
    public uint Edx; 
    public uint Ecx; 
    public uint Eax; 
    // Retrieved by CONTEXT_CONTROL 
    public uint Ebp; 
    public uint Eip; 
    public uint SegCs; 
    public uint EFlags; 
    public uint Esp; 
    public uint SegSs; 
    // Retrieved by CONTEXT_EXTENDED_REGISTERS 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 512)] 
    public byte[] ExtendedRegisters; 
} 

另外爲什麼我們必須ebx + 8才能獲得lpbase地址?

+0

'FLOATING_SAVE_AREA'是112個字節,或28個點。所以只要計算一下,「Ebx」是第42位。 –

+0

進程沒有基地址。加載進程中的每個模塊(包括.exe)都有一個基地址。 –

+0

定義爲什麼模塊?函數,Dll和資源等? – RStyle

回答

1

CONTEXT結構在winnt.h中定義。請注意,它基於處理器體系結構具有不同的定義。使用此結構定義訪問ebx寄存器而不是開始的特定偏移量。 EBX寄存器指向進程的PEB(進程環境塊),其中Ldr指針包含基地址。所有這些都被用於稱爲'Dynamic Forking'的技術,以在另一個進程的上下文中運行進程。例如用於惡意軟件應用程序。