2016-09-11 1 views
0

다른 프로세스에서 모든 모듈을 가져오고 싶습니다. 그러나 그것은 터무니없는 가치를 반환합니다. 프로그램은 do-while 루프에 한 번만 머물러 있습니다. 그 후에 do-while 루프가 종료됩니다.다른 프로세스에서로드 된 모듈 가져 오기

어디에서 실수를 발견 할 수 없는데 어떻게 해결할 수 있습니까? 나는 그 프로그램이 여러 시간 동안 do-while 루프에 있어야한다는 것을 알고 있지만 그렇지 않다.

NTSTATUS Status; 
PROCESS_BASIC_INFORMATION pbi; 
ULONG ReturnLength; 
Status = NtQueryInformationProcess(
    INJECTOR_INFO.process.processHandle, 
    ProcessBasicInformation, 
    &pbi, 
    sizeof(PROCESS_BASIC_INFORMATION), 
    &ReturnLength); 
if (!NT_SUCCESS(Status)) { 
    printf("NtQueryInformationProcess failed.(pbi)\n"); 
    return; 
} 
else { 
    PLIST_ENTRY HeadEntry = pbi.PebBaseAddress->LoaderData->InMemoryOrderModuleList.Flink; 
    PLIST_ENTRY nextEntry = pbi.PebBaseAddress->LoaderData->InMemoryOrderModuleList.Blink; 


    DWORD dwBytesRead = 0; 
    PLDR_MODULE pLdrModule = nullptr; 
    LDR_MODULE LdrModule; 
    do 
    { 
     LDR_DATA_TABLE_ENTRY LdrEntry; 
     PLDR_DATA_TABLE_ENTRY Base = CONTAINING_RECORD(HeadEntry, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks); 

     if (NT_SUCCESS(Status = NtReadVirtualMemory(INJECTOR_INFO.process.processHandle, Base, &LdrEntry, sizeof(LdrEntry), &dwBytesRead))) 
     { 
      if (dwBytesRead != sizeof(LdrEntry)) { 
       printf("length doesn't match"); 
       return; 
      } 
      char* pLdrModuleOffset = reinterpret_cast<char*>(HeadEntry) - sizeof(LIST_ENTRY); 
      if (!NT_SUCCESS(Status = NtReadVirtualMemory(INJECTOR_INFO.process.processHandle, pLdrModuleOffset, &pLdrModule, sizeof(pLdrModule), &dwBytesRead))) { 
       printf("pLdrModuleOffset doesn't read"); return; 
      }else if (dwBytesRead != sizeof(pLdrModule)) { printf("pLdrModule length doesn't match"); return; } 
      if (!NT_SUCCESS(Status = NtReadVirtualMemory(INJECTOR_INFO.process.processHandle, pLdrModule, &LdrModule, sizeof(LdrModule), &dwBytesRead))) { 
       printf("pLdrModule doesn't read"); return; 
      }else if (dwBytesRead != sizeof(LdrModule)) { printf("LdrModule length doesn't match"); return; } 

      if (LdrEntry.DllBase) 
      { 
       printf("BaseAddress:  %p\n", LdrModule.BaseAddress); 
       printf("Reference Count: %d\n", LdrModule.LoadCount); 
      } 

      HeadEntry = LdrEntry.InMemoryOrderLinks.Flink; 
     } 
     else { printf("LDR_DATA_TABLE_ENTRY doesn't read"); return; } 
    } while (HeadEntry != nextEntry); 
} 

나는 변수의 값에 대한 방법 NtQueryInformationProcess 후 !NT_SUCCESS(Status)에 중단 점을 넣어 : DO 변수의 값을

Values after NtQueryInformationProcess

또 다른 중단하는 동안 첫 번째 사이클의 끝 :

Values for the end of the first cycle

+0

[EnumProcessModules] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682631.aspx)에 문제가 있습니까? – IInspectable

답변

0

리모컨 프로세스에 대한 쿼리가입니다.,하지만 당신은 당신의 자신의 과정에서 포인터를 따라 진행 : 다음 원격 프로세스에서 LoaderData을 읽고,이 작업을 위해

PLIST_ENTRY HeadEntry = pbi.PebBaseAddress->LoaderData->InMemoryOrderModuleList.Flink;

이 (pbi.PebBaseAddress에서) 원격 프로세스에서 PEB 읽기 (PEB.LoaderData). 그런 다음 InMemoryOrderModuleList을 따르십시오 (다시, 원격 프로세스에서 데이터를 읽으십시오).

이제 원격 프로세스에서 각 항목을 읽음으로써 전체 목록을 반복 할 수 있습니다.