- lumenFC 축구 동호회
- 마샤블
- 웍스프레소
- 소셜@나눔<소셜미디어나눔연구소>
- 리버스코어
- LAIN
- LAIN 이사한 블로그
- TeamCR@K
- Sunnyday
- 보안 걱정이
- 리버싱 학습
- securityfirst_jo
- Practical Security Blog
- 세상, 그 유쾌한 전장
- 악성코드관련블로그
- Back to the Mac
- 패킷분석입문
- PacketInside / 네트워크 패킷 분석 블로그
- 침해사고분석 :: 네이버 블로그
- 소프트웨어 기술자경력관리시스템
- JK.Moon
- 자바 온라인학습
- Ezbeat의 도서관
- Dreams of a Final Journey
- IT eBooks - Free Download - Bi…
- Index of /madchat/coding/rever…
- Security Insight
- Reversing war game
- 고길고기
- clamav
- zerowine
- FORENSIC-PROOOF
- jquery 예제
- 조대협의블로그
- 국가과학기술인력개발원 교육포털 사이트
- 빅데이터, splunk
- 지식을 연주하는 사람
- malware analysis system
- 건국대토익스피킹
- 소프트웨어개발 및 협업도구
kisoo
VISTA&WIN7 잘못된 프로세스 경로일때 본문
한 2일 정도 삽질한 경우를 설명 하겠다.
상황 : 네트워크로 패킷을 보내는 프로세스의 정보를 구한다. ProcessName , ProcessId 를 얻어서 ProcessPath 를 구하려고 했다.
그러나 , 프로세스 경로가 c:\windows\system32\svchost.exe 로 나오는 것이다.
그런데 여기서 나를 햇갈리게 하는 경우가 있었으니...그것은 바로
네트워크 소켓 연결을 하지 않은 상태에서는 정상적인 경로를 구할 수 있었다.
이런경우가 다있나...? 구글링을 아무리 해도 이런 경우가 없었다.
나를 더 황당하게 했던 것은 우리가 일반적으로 쓰고 있는 ProcessMonitor 와 TcpView 에서도 동일하게 이런 경우가 발생 했다.
나를 합리화 하기 시작했다. 아 .. sysinternals 프로그램도 이렇게 되니까...내가 잘못 한 것은 아닐꺼구...버그 인가???
이렇게 합리화를 하던 찰나에 혹시나 하는 마음에 Process Explorer 실행하고 해봤더니....둘다 정상이었다. 통신 일때나 아닐때나...
이때부터 나의 구글링은 다시 시작 되었다.
그러나... 이런 경우는 없었다. MSDN 을 자세히 살펴보니 VISTA 이상에서는 GetModuleFileNameEx 보다는 QueryFullProcessImageName 를 권장한다고 한다.
http://msdn.microsoft.com/en-us/library/ms684919(v=vs.85).aspx
그래서 저 함수를 쓰려고 했더니...저런 함수가 없다고 나온다. sdk 를 깔아야 하나... 어쨋든 저 함수가 KERNEL.DLL 에서 익스포트 하고 있으니 재정의 해서 사용해 봤다.
아래와 같이 사용하니 되는군. 어쨌든 글쓰기도 힘들다. 2일을 이것때문에 고생했다. 어쨌든 뿌듯하네 ^^
선언부
typedef WINBASEAPI BOOL (*LPQueryFullProcessImageName)( __in HANDLE hProcess, __in DWORD dwFlags, __out_ecount_part(*lpdwSize, *lpdwSize) LPSTR lpExeName, __inout PDWORD lpdwSize );
typedef BOOL (WINAPI *fpQueryFullProcessImageName)(HANDLE,DWORD,LPSTR,PDWORD);
사용시
DWORD dwLen = sizeof(szFilePath)/sizeof(TCHAR);
if ( !IsVista() )
{
GetModuleFileNameEx(hProcess,hMod[0], szFilePath, MAX_PATH );
strBuffer = szFilePath;
}
else
{
//VISTA 이상
HMODULE hDLL = LoadLibrary("kernel32.dll");
fpQueryFullProcessImageName pQueryFullProcessImageName ;
if (!hDLL) return(0); //Now use pointer to get access to functions defined in DLL
pQueryFullProcessImageName = (fpQueryFullProcessImageName)GetProcAddress(hDLL, "QueryFullProcessImageNameA"); //ANSI version
if (!pQueryFullProcessImageName)
return false;
ZeroMemory(szFilePath, sizeof(szFilePath));
dwLen = sizeof(szFilePath)/sizeof(TCHAR);
pQueryFullProcessImageName(hProcess, 0, szFilePath, &dwLen);
strBuffer = szFilePath;
}
if(!strBuffer.IsEmpty())
{
//프로세스 전체경로
strProcessPath = strBuffer;
TerminateProcess(hProcess,0);
return TRUE;
}
이 글은 스프링노트에서 작성되었습니다.