2011-06-11 14 views
5

मैं नोटपैड.एक्सई के पीईबी को पढ़ने की कोशिश कर रहा हूं वर्तमान में मैं प्रोसेस क्रिएशन कॉलबैक पंजीकृत करके पीईबी तक पहुंचने की कोशिश कर रहा हूं और फिर नोटपैड.एक्सई बनने तक प्रतीक्षा कर रहा हूं। जब नोटपैड बनाया जाता है तो मैं प्रक्रिया को खोलने के लिए पीआईडी ​​का उपयोग करता हूं और पीईबी को ZwQuerryProcess (PROCESS_BASIC_INFORMATION) के साथ ढूंढता हूं।उपयोगकर्ता मोड मेमोरी का उपयोग कैसे करें?

लेकिन जब मैं जानकारी-> PEB एक अपवाद उठाया है परे पढ़ने की कोशिश (मुझे लगता है इस वजह से मैं स्मृति का उपयोग नहीं कर सकते हैं) जब मैं पहली बार इस खोज की मैं किसी को KeStackAttachProcess उल्लेख की याद आई और यह

समकक्ष किसी अन्य प्रक्रिया संदर्भ के अंदर पते तक पहुंचने के लिए।

समस्या यह है कि मुझे नहीं पता कि संदर्भ परिवर्तन सफल था या नहीं। और एक बार जब मैं किसी अन्य संदर्भ में माना जाता हूं तो भी मैं पेब तक नहीं पहुंच सकता। क्या किसी को पता है कि मैं नोटपैड के पीईबी तक कैसे पहुंच सकता हूं?

मान लें hgtPid नोटपैड की पीआईडी ​​=

void ModuleDumperThread(){ 

NTSTATUS Status = STATUS_SUCCESS; 
HANDLE hProcessHandle = NULL; 
PLIST_ENTRY Next; 
PLDR_DATA_TABLE_ENTRY LdrDataTableEntry; 
CLIENT_ID clientID; 
ACCESS_MASK DesiredAccess = PROCESS_ALL_ACCESS; 
OBJECT_ATTRIBUTES ObjectAttributes; 
HANDLE hProcessId = hgtPid; 
PROCESS_BASIC_INFORMATION BasicInfoReal; 
ULONG SizeReturned; 

PEPROCESS ep; 
KAPC_STATE *ka_state = NULL; 


InitializeObjectAttributes (&ObjectAttributes, NULL, OBJ_KERNEL_HANDLE, NULL, NULL); 

    clientID.UniqueProcess = hProcessId; 
    clientID.UniqueThread = NULL; 

__try{ 


Status = ZwOpenProcess(&hProcessHandle, DesiredAccess, &ObjectAttributes, &clientID); 

       if(Status != STATUS_SUCCESS){ 
         DbgPrint("Failed to open process\n"); 
         DbgPrint("NtStatus: 0x%x", Status); 
         return; 
       } 

      Status = gZwQueryprocess(hProcessHandle, ProcessBasicInformation, (PVOID)&BasicInfoReal, sizeof(PROCESS_BASIC_INFORMATION), &SizeReturned); 

        if(Status != STATUS_SUCCESS){ 
           DbgPrint("gZwQueryprocess failed\n"); 
           DbgPrint("Size returned: 0x%x\nNtStatus: 0x%x\n", SizeReturned, Status); 
           ZwClose(hProcessHandle); 
           return; 
        } 

      ZwClose(hProcessHandle);   

     Status = PsLookupProcessByProcessId(hProcessId, &ep); 

        if(Status != STATUS_SUCCESS){ 
           DbgPrint("PsLookupProcessByProcessId failed\n"); 
           DbgPrint("NtStatus: 0x%x\n", Status); 
           return; 
        } 

ka_state = ExAllocatePoolWithTag(NonPagedPool, sizeof(KAPC_STATE),'trak'); 

      KeStackAttachProcess(ep, ka_state); 

__try{ 

       if(BasicInfoReal.PebBaseAddress->Ldr){ 

          Next = BasicInfoReal.PebBaseAddress->Ldr->InLoadOrderModuleList.Blink; 
          LdrDataTableEntry = CONTAINING_RECORD(Next, 
                    LDR_DATA_TABLE_ENTRY, 
                    LoadOrder 
                   ); 
        DbgPrint("Module base address: 0x%x", LdrDataTableEntry->ModuleBaseAddress); 
       } 
    }__except(EXCEPTION_EXECUTE_HANDLER) { 
     DbgPrint("Exception while trying to access the PEB\n"); 
     } 

      KeUnstackDetachProcess(ka_state); 
      ExFreePool(ka_state); 


}__except(EXCEPTION_EXECUTE_HANDLER) { 
       DbgPrint("Exception in ModuleDumper\n"); 
     } 

       if(ep){ 
       ObDereferenceObject(ep);   
       } 
return; 
} 

किसी को भी किसी भी त्रुटि/दोष का पता है:

यहाँ कोड मैं वर्तमान में पाते हैं और PEB तक पहुँचने के लिए उपयोग कर रहा हूँ है?

अग्रिम धन्यवाद

संपादित करें:

मैं कुछ चीजें बदल गया है, और जहां यह वास्तव में अजीब हो जाता है यह है। यह सुनिश्चित करने के लिए कि मैंने KestackAttachProcess() के 'ep' को msdn नामित PRKPROCESS प्रकार से बदल दिया है, जब मैं KeStackAttachProcess() को कॉल करता हूं तो अब निष्पादन गायब हो जाता है। कॉल से पहले सब ठीक हो रहा है, कॉल के बाद बस कुछ भी नहीं है। कोई त्रुटि नहीं कोई अपवाद नहीं बीएसओडी: कुछ भी नहीं। क्या चल रहा है?!

परिवर्तन:

__asm{ 
     mov eax, ep 
     mov eax, [eax] 
     mov myPKPROCESS, eax // just dereferencing my pointer (I don't have the structs) 
    } 

    DbgPrint("Test print\n"); // gets printed just fine 

      KeStackAttachProcess(&myPKPROCESS, ka_state); 
DbgPrint("Test print\n"); // nothing happens 

EDIT2:

मैं इस समस्या का समाधान कर लिया। मैं अभी भी नहीं पता है कि इसके बाद के संस्करण कोड में गलत हो गया था, लेकिन इस कोड काम कर रहा है:

void ModuleDumperThread(){ 

NTSTATUS Status = STATUS_SUCCESS; 
HANDLE hProcessHandle = NULL; 
PLIST_ENTRY Next; 
PLDR_DATA_TABLE_ENTRY LdrDataTableEntry; 
CLIENT_ID clientID; 
ACCESS_MASK DesiredAccess = PROCESS_ALL_ACCESS; 
OBJECT_ATTRIBUTES ObjectAttributes; 
HANDLE hProcessId = hgtPid; 
PROCESS_BASIC_INFORMATION BasicInfoReal; 
ULONG SizeReturned; 
PEPROCESS ep = NULL; 
unsigned int Index = 0; 
InitializeObjectAttributes (&ObjectAttributes, NULL, OBJ_KERNEL_HANDLE, NULL, NULL); 

    clientID.UniqueProcess = hProcessId; 
    clientID.UniqueThread = NULL; 


__try{ 

    Status = ZwOpenProcess(&hProcessHandle, DesiredAccess, &ObjectAttributes, &clientID); 

       if(Status != STATUS_SUCCESS){ 
         DbgPrint("Failed to open process\n"); 
         DbgPrint("NtStatus: 0x%x", Status); 
         return; 
       } 

      Status = gZwQueryprocess(hProcessHandle, ProcessBasicInformation, (PVOID)&BasicInfoReal, sizeof(PROCESS_BASIC_INFORMATION), &SizeReturned); 

        if(Status != STATUS_SUCCESS){ 
           DbgPrint("gZwQueryprocess failed\n"); 
           DbgPrint("Size returned: 0x%x\nNtStatus: 0x%x\n", SizeReturned, Status); 
           ZwClose(hProcessHandle); 
           return; 
        } 

    //DbgPrint("Basic info: 0x%x\n", BasicInfoReal); 
    //DbgPrint("BasicInfoReal->PebBaseAddress: 0x%x\n", BasicInfoReal->PebBaseAddress); 
    //DbgPrint("RealPeb: 0x%x\n", RealPeb); 
    //DbgPrint("gZwReadVirtualMemory: 0x%x\n", gZwReadVirtualMemory); 

        Status = PsLookupProcessByProcessId(hProcessId, &ep); 

        if(Status != STATUS_SUCCESS){ 
           DbgPrint("PsLookupProcessByProcessId failed\n"); 
           DbgPrint("NtStatus: 0x%x\n", Status); 
           ZwClose(hProcessHandle); 
           return; 
        } 
Timeout((INT64)0x1FFFFFF); 

KeAttachProcess(ep); 
__try{ 
    DbgPrint("ImageBaseAddress of notepad.exe: 0x%x\n", BasicInfoReal.PebBaseAddress->ImageBaseAddress); 

    Next = BasicInfoReal.PebBaseAddress->Ldr->InLoadOrderModuleList.Blink; 
    LdrDataTableEntry = CONTAINING_RECORD(Next, LDR_DATA_TABLE_ENTRY, LoadOrder); 


    for(Index = 0; Index != 17; Index++){ 
     DbgPrint("%d: ImageBase of %wZ in Notepad.exe: 0x%x\n", Index, &(LdrDataTableEntry->ModuleName), LdrDataTableEntry->ModuleBaseAddress); 
     Next = Next->Blink; 
     LdrDataTableEntry = CONTAINING_RECORD(Next, LDR_DATA_TABLE_ENTRY, LoadOrder); 
    } 


    }__except(EXCEPTION_EXECUTE_HANDLER) { 
       DbgPrint("Exception while accessing the LDR\n"); 
     } 

KeDetachProcess(); 

    }__except(EXCEPTION_EXECUTE_HANDLER) { 
       DbgPrint("Exception in ModuleDumper\n"); 
     } 
     ObDereferenceObject((PVOID)ep); 
     ZwClose(hProcessHandle);  


return; 
} 

उत्तर

2

आप PPEB PsGetProcessPeb (IN PEPROCESS Process) उपयोग कर सकते हैं। इस API के पते को प्राप्त करने के लिए आपको MmGetSystemRoutineAddress का उपयोग करने की आवश्यकता है। इस फ़ाइल में GetDllByPeb समारोह पर एक नज़र डालें: http://code.google.com/p/arkitlib/source/browse/trunk/ARKitDrv/Ps.c

0

यह आपके PsGetProcessPeb है:

/base/ntos/ps/pshelper.c

PPEB 
PsGetProcessPeb(
    __in PEPROCESS Process 
    ) 
{ 
    return Process->Peb; 
} 

अतिरिक्त काम करने के लिए EPROCESS struct से PEB सूचक को निकालने के लिए (कोई ज़रूरत नहीं है जो 32/64-bit अंतर को छोड़कर, सभी विंडोज संस्करणों के लिए बिल्कुल समान है)

और आपप्राप्त कर सकते हैं ID=4 (सिस्टम प्रोसेस) का उपयोग करके PsLookupProcessByProcessId द्वारा।

संबंधित मुद्दे