2016-05-07 5 views
0

こんにちは、私は以下を行うソースを持っています。保留中のプロセスのlpbaseaddressを取得する

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) 

多くの場合、コンテキスト[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; 
} 

また、なぜlpbaseaddressを取得するためにebx + 8を使用する必要がありますか?

+0

'FLOATING_SAVE_AREA'は112バイト、つまり28単位です。だからちょうどuintsを数え、 'Ebx'は42番目です。 –

+0

プロセスにベースアドレスがありません。 .exeを含む、プロセスにロードされた各モジュールには、ベースアドレスがあります。 –

+0

定義されているモジュールとは何ですか?関数、DLL、リソースなど? – RStyle

答えて

1

CONTEXT構造体はwinnt.hで定義されています。プロセッサアーキテクチャに基づいて異なる定義があることに注意してください。この構造体定義を使用して、開始位置への特定のオフセットの代わりにebxレジスタにアクセスします。 EBXレジスタはプロセスのPEB(プロセス環境ブロック)を指し、Ldrポインタにはベースアドレスが含まれています。これらのすべては、'Dynamic Forking'という技術で使用され、別のプロセスのコンテキストでプロセスを実行します。マルウェアアプリケーションなどで使用されます。

関連する問題