// 실행중인 프로세스의 갯수를 얻어준다.
API_EXPORT BOOL ExpProcessControl_GetNumberOfProcessees( OUT int *pnNumberOfProcesses );
// 프로세스들의 정보를 얻는다.(간략)
API_EXPORT BOOL ExpProcessControl_GetProcesses( int nMaxBufSize, // (BYTE*)pstProcessEntry32List의 크기
OUT SSimpleProcessEntry32 *pstProcessEntry32List, // ProcessEntry32 의 배열 포인터
OUT OPTIONAL int *pnNumberOfFilledProcessEntry32List, // 버퍼에 채워진 process 정보 갯수(메모리 부족시 참고)
OUT OPTIONAL int *pnNumberOfTotalProcesses ); // 실제 process의 갯수
API_EXPORT BOOL ExpProcessControl_Read( HANDLE hProcess, // 읽을 process handle
DWORD dwVA, // VA
OUT BYTE *pbyBuffer, // Buffer
int nReadLen, // 읽을 크기
OUT int *pnReadSize ); // 읽은 결과 크기
// Write
API_EXPORT BOOL ExpProcessControl_Write( HANDLE hProcess, // 쓸 process handle
DWORD dwVA, // VA
OUT BYTE *pbyBuffer, // Buffer
int nWriteLen, // 쓸 크기
OUT int *pnWrittenSize ); // 쓴 결과 크기
// Find wanted process
API_EXPORT BOOL ExpProcessControl_FindProcess( char *szExeName, // Process의 exe name
OUT OPTIONAL DWORD *pdwProcessId, // Process Id
OUT OPTIONAL HANDLE *phProcess, // Process handle
OPTIONAL DWORD dwDesiredProcessAccess ); // Open Process시 입력할 Access type
// Inject Dll
API_EXPORT BOOL ExpProcessControl_DllInjectionByName( char *szExeName, // Process의 exe name
char *szDllPath, // Dll Path
BOOL bFreeLibAfterLoadComplete ); // Load 완료 후 Free 할지 여부
// Inject Dll
API_EXPORT BOOL ExpProcessControl_DllInjectionByHandle( HANDLE hProcess, // Process의 handle
char *szDllPath, // Dll Path
BOOL bFreeLibAfterLoadComplete ); // Load 완료 후 Free 할지 여부
// 함수가 실패할 경우 이 함수를 호출하면 원인을 문자열로 돌려준다. Alloc 불필요
API_EXPORT char *ExpProcessControl_GetLastError();
Code Injection을 해보시는건 어떨까요? :)
Kernel32.DLL는 프로세스마다 주소가 같으므로...
Kernel32.dll::GetVersion/GetVersionEx()로 OS 버전을 파악한 뒤
OS 버전에 따라 LoadLibraryExW를 호출하거나,
ntdll.dll::LdrLoadDll()을 호출하도록 하게...
물론 Code Injection과 CreateRemoteThread()를 써서요...
(CreateRemoteThread를 안쓰려면, DebugActiveProcess() 하고
SetThreadContext() / SuspendThread() / ResumeThread() 등을
쓰셔야되겠네요 :) )
dll injection기능은 이미 ProcessControl 내에 구현돼 있습니다.^^
제가 더 해보고 싶은건 Stealth injection이죠.
일부 제품에서 dll injection을 감지한다는데, 감지하지 못하는 injection을 해보고 싶네요. 별로 어려울 것 같지 않거든요..
담주쯤 시간 나면 해보려 합니다 ㅋㅋ
CreateRemoteThread()를 사용하지 않는다면, Debugger를 이용해서 구현해볼 수도 있겠군요.
DLL 인젝션 감지를 원천적으로 막기 위해선, PEB의Ldr정보를 슬쩍(?) 해서 Entry Point를 잠깐 모두 NULL로 해서 하는것도 괜찮아 보이더군요.
디버거도 좋은방법이죠^^
근데 까다로운 프로텍터로 프로텍팅돼있다면 디버깅되고 있는걸 숨기기가 상당히 까다로운지라...
굳이 디버거 어태치를 하지 않더라도,
대상 프로세스의 모든 스레드를 멈춰버리고, 스레드 실행정보를 얻어서 실행되는 라인을 그대로 후킹해버려서 원하는 코드를 실행하게 하고 되돌아가면 좋을 것 같거든요 크크
근데 코모도를 잠깐 봤는데, 코모도는 OpenThread나 OpenThread만 감지하고, 인젝션여부는 전혀 체크하지 않더군요.
자세한 감지까진 안돼서 코모도에 좀 실망했다는..
COMODO Firewall Pro는... 저도 솔직히 실망입니다.
하지만 가볍고 더 좋은 HIPS는 없기에 그냥 쓰고 있죠. :-)
COMODO Firewall Pro는 SSDT Hooking을 하는데, ZwOpenProcess()를 빼고 모두 복원시켜도 복구조차 안함..