поиск хендла нтдлл

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by sn0w, 18 Jun 2010.

  1. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    есть у кого сабж?

    зы нахожусь в теле смсс.ехе, нтдлл - единственное что в нем загружено
     
  2. WNZRS

    WNZRS Member

    Joined:
    3 Sep 2009
    Messages:
    294
    Likes Received:
    52
    Reputations:
    1
    Code:
    GetModuleHandleA("ntdll.dll");
    если не прокатит можно заюзать:

    Code:
    #include <Psapi.h>
    
    #pragma comment( lib, "Psapi.lib" ) 
    
    DWORD GetModuleInfo( const char * module )
    {
    	HANDLE hProccess = GetCurrentProcess();
    	HMODULE Module[1024] = { 0 };
    	DWORD Need = 0x00;
    
    	if ( EnumProcessModules( hProccess, Module, sizeof( Module ), &Need ) )
    	{
    		for ( int i = 0; i < int( Need / sizeof( HMODULE ) ); i++ )
    		{
    			LPSTR FileName = new CHAR[512];
    			ZeroMemory( FileName, 512 );
    
    			if (GetModuleFileNameExA(hProccess, Module[i], FileName, 512))
    			{
    				if( strstr(FileName, module) != NULL ) 
    				{
    					delete [] FileName;
    					FileName = NULL;
    
    					return (DWORD)Module[i];
    				}
    			}
    
    			delete [] FileName;
    			FileName = NULL;
    		}
    	}
    
    	return 0x0;
    }
    
    DWORD htdll = GetModuleInfo("ntdll.dll");
    
     
  3. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    ненене, кернел32 и псапи там нету) в АПе smss.exe только нтдлл.длл
     
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Ну выдири его из PEB по аналогии с kernel32/kernelbase

    Точно не уверен, но на 32 битных системах примерно так будет
    Code:
    	void* ntdll;
    	
    	__asm
    	{	
    		mov     eax, fs:[0x30] // PEB
    		mov     eax, [eax + 0x0c] // PPEB_LDR_DATA
    		mov     eax, [eax + 0x1C] // Модули в порядке инита
    		mov     eax, [eax + 0x08] // ImageBase первого модуля. А первый у нас ntdll.dll
    		mov     ntdll, eax
    	}
    
    	printf("NTDLL BASE = %0.8X", ntdll);
    
    для теста можешь по оффсету 0x18 взять адрес полного пути либы и реально проверить ntdll это или нет.
    т.е. всё будет выглядить примерно так
    Code:
    	void* ntdll;
    	WCHAR* name;
    	
    	__asm
    	{	
    		push     edx
    		mov     eax, fs:[0x30] // PEB
    		mov     eax, [eax + 0x0c] // PPEB_LDR_DATA
    		mov     eax, [eax + 0x1C] // Модули в порядке инита
    		mov     edx, [eax + 0x08] // ImageBase первого модуля. А первый у нас ntdll.dll
    		mov     ntdll, edx
    		mov     edx, [eax + 0x18] // FullName первого модуля.
    		mov     name, edx
    		pop     edx
    	}
    
    	printf("BASE = %0.8X\nNAME = %ws\n", ntdll, name);
    
     
    #4 slesh, 18 Jun 2010
    Last edited: 18 Jun 2010
    1 person likes this.
  5. sn0w

    sn0w Статус пользователя:

    Joined:
    26 Jul 2005
    Messages:
    1,023
    Likes Received:
    1,296
    Reputations:
    327
    да, чотко, сенкс!!
     
  6. winterfrost

    winterfrost Elder - Старейшина

    Joined:
    18 Aug 2008
    Messages:
    42
    Likes Received:
    18
    Reputations:
    15
    У меня так:
    Code:
    PVOID GetNtdll() {
      LDR_DATA_TABLE_ENTRY *pModule;
      PEB *pPeb;
      __asm {
        mov eax, fs:[0x30]
        mov pPeb, eax
      }
      pModule = (LDR_DATA_TABLE_ENTRY *)((char*)pPeb->Ldr->InInitializationOrderModuleList.Flink-0x10);
      return pModule->DllBase;
    }
    
     
    #6 winterfrost, 18 Jun 2010
    Last edited: 18 Jun 2010