tlhelp32.h의 함수들과 프로그램 실행환경의 관련성에 대한 질문입니다

조회수 995회

DLL 인젝션 / 이젝션 프로그램을 만들던 중에 한 가지 문제가 생겼습니다.

프로그램 구성은 대략 다음과 같습니다.

이미지

왼쪽 리스트 박스가 현재 실행 중인 프로세스를,

오른쪽 박스가 선택된 프로세스 내의 모듈을 표시합니다.

이때의 프로세스 리스트와 모듈 리스트는 tlhelp32.h의 함수들을 이용해서 뽑았는데요,

프로세스 리스트 박스 내 선택 항목을 변경하거나 Refresh List 버튼을 누를 때마다

스냅샷을 찍은 후, 프로세스 / 모듈 정보들을 가져와 구조체에 저장한 뒤

그것들을 화면에 표시했습니다.

문제는 컴파일러 상에서 F5키로 실행했을 땐 정상적으로 실행되는 반면,

빌드 후 exe 파일을 직접 실행시엔

몇몇 프로세스의 모듈 목록이 표시되지 않는다는 것입니다.

이미지

동일한 csrss.exe 프로세스의 모듈목록이 exe 파일로 실행했을 땐 표시되지 않습니다

Debug / Release 모드와는 상관없이,

F5로 실행하느냐 exe로 실행하느냐에 따라 문제가 생기는 것 같은데,

tlhelp32.h의 스냅샷 함수와 Module32First / Module32Next 함수의 검색 대상이

혹은 검색 범위가 프로그램이 실행되는 환경에 영향을 받는지가 궁금합니다.

그리고 만약 영향을 받는다면 해결 방법이나 개선할 방안을 알고 싶습니다.

혹시나 싶어 모듈 목록을 뽑아오는 코드 부분을 올립니다.

int GetCurrentModulesNumber(int PID)
{
 HANDLE hSnapShot = INVALID_HANDLE_VALUE;
 MODULEENTRY32 me = { sizeof(me) };

 hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, (DWORD)PID);
 Module32First(hSnapShot, &me);

 int count = 0;
 do
 {
  count++;
 } while (Module32Next(hSnapShot, &me));

 CloseHandle(hSnapShot);
 return count;
}

위 함수는 PID로 전달받은 프로세스 내부의 모듈 수를 리턴하는 함수입니다.

void GetCurrentModules(int PID, MODULE_STRUCT* ms, int nModules)
{
 HANDLE hSnapShot = INVALID_HANDLE_VALUE;
 MODULEENTRY32 me = { sizeof(me) };

 hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, (DWORD)PID);
 Module32First(hSnapShot, &me);

 int count = 0;

 do
 {
  for (int i = 0; i < 255; i++)
  {
   if (me.szModule[i] == 0)
    break;

   ms[count].mName[i] = me.szModule[i];
  }

  ms[count].mAddr = me.modBaseAddr;

  if (++count >= nModules)
   break;
 } while (Module32Next(hSnapShot, &me));

 CloseHandle(hSnapShot);
}

PID로 전달받은 프로세스의 모듈 정보를 nModules로 받은 모듈 개수만큼

MODULE_STRUCT라는 구조체 배열에 집어넣는 함수입니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)