CreateRemoteThread в Winlogon.exe синий экран

Тема в разделе "WASM.WIN32", создана пользователем quporos, 5 июн 2010.

  1. quporos

    quporos New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    55
    недавно нагуглил исходник инжекта dll в Winlogon и решил выдрать оттуда код для собственного использования, но при адаптатации онго всвоем приложении вылетаю в синьку в функции CreateRemoteThread :
    Код (Text):
    1. DWORD LoadDllInProcessEx(DWORD dwPid,char* DllPathName)  
    2. {  
    3.     HANDLE hProcess,hThread;  
    4.     RemoteProcessData rpd;  
    5.     PWSTR pwModuleFileName;  
    6.     HANDLE hModule=NULL;  
    7.     UNICODE_STRING usModule;  
    8.     LPVOID lpParameters,lpThread;  
    9.     SECURITY_ATTRIBUTES saSecAttr;  
    10.     DWORD dwActual,dwResult=0,rc;  
    11.    
    12.     hProcess=OpenProcess(PROCESS_ALL_ACCESS,0,dwPid);  
    13.     if (hProcess==NULL)  
    14.         goto cleanup;  
    15.    
    16.     rpd.pLdrLoadDll=(LDRLOADDLL)GetProcAddress(GetModuleHandle("ntdll"),"LdrLoadDll");  
    17.     if (!rpd.pLdrLoadDll)  
    18.         goto cleanup;  
    19.            
    20.     rpd.Flags=0;  
    21.     rpd.PathToFile=NULL;  
    22.     rpd.ModuleHandle=NULL;  
    23.        
    24.     pwModuleFileName=(PWSTR)malloc((strlen(DllPathName)*2)+1);  
    25.     if (!pwModuleFileName)  
    26.         goto cleanup;  
    27.            
    28.     MultiByteToWideChar(CP_ACP,0,DllPathName,strlen(DllPathName),pwModuleFileName,(strlen(DllPathName)*2)+1);  
    29.     usModule.Buffer=(PWSTR)InjectData(hProcess,pwModuleFileName,(strlen(DllPathName)*2)+1);  
    30.    
    31.     free(pwModuleFileName);  
    32.    
    33.     if (!usModule.Buffer)  
    34.         goto cleanup;  
    35.        
    36.     usModule.Length=(strlen(DllPathName)*2)+1;  
    37.     usModule.MaximumLength=(strlen(DllPathName)*2)+1;  
    38.    
    39.     memcpy(&rpd.ModuleFileName,&usModule,sizeof(UNICODE_STRING));  
    40.    
    41.     lpParameters=InjectData(hProcess,&rpd,sizeof(RemoteProcessData)+4096);  
    42.     if (!lpParameters)  
    43.         goto cleanup;  
    44.    
    45.     lpThread=InjectData(hProcess,&RemoteThread,(PBYTE)EndRemoteThread-(PBYTE)RemoteThread+4096);  
    46.     if (!lpThread)  
    47.         goto cleanup;  
    48.    
    49.     // Set security attributes    
    50.     saSecAttr.nLength=sizeof(SECURITY_ATTRIBUTES);  
    51.     saSecAttr.lpSecurityDescriptor = NULL;  
    52.     saSecAttr.bInheritHandle = TRUE;  
    53.    
    54.     hThread=CreateRemoteThread(hProcess,&saSecAttr,0,(LPTHREAD_START_ROUTINE)lpThread,lpParameters,0,&dwActual);
    55.     if (hThread==NULL)  
    56.         goto cleanup;  
    57.        
    58.     rc=WaitForSingleObject(hThread, INFINITE);    
    59.    
    60.     switch (rc)    
    61.     {  
    62.         case WAIT_TIMEOUT:  
    63.             break;  
    64.         case WAIT_FAILED:  
    65.             break;  
    66.         case WAIT_OBJECT_0:  
    67.             if (ReadProcessMemory(hProcess,lpParameters,&rpd,sizeof(RemoteProcessData),&dwActual))  
    68.                 dwResult=(DWORD)rpd.ModuleHandle;  
    69.             break;  
    70.         default:  
    71.             break;  
    72.     }  
    73.    
    74. cleanup:  
    75.     if (rpd.ModuleFileName.Buffer!=NULL)  
    76.         VirtualFreeEx(hProcess,rpd.ModuleFileName.Buffer,0,MEM_RELEASE);  
    77.    
    78.     if (lpParameters!=NULL)  
    79.         VirtualFreeEx(hProcess,lpParameters,0,MEM_RELEASE);  
    80.    
    81.     if (lpThread!=NULL)  
    82.         VirtualFreeEx(hProcess,lpThread,0,MEM_RELEASE);  
    83.    
    84.     if (hThread) CloseHandle(hThread);  
    85.     if (hProcess) CloseHandle(hProcess);  
    86.    
    87.     return dwResult;  
    88. }
    Привелелии на отладку получаюься ,VirtualAllocEx и WriteProcessMemory отрабатыают нормально ,но в итоге синий экран . В чем может быть причина ?
     
  2. sideX

    sideX New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    57
    что содержится в инжектируемой DLL?
     
  3. quporos

    quporos New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    55
    просто тестирую
    Код (Text):
    1. BOOL APIENTRY DllMain( HMODULE hModule,
    2.                        DWORD  ul_reason_for_call,
    3.                        LPVOID lpReserved
    4.                      )
    5. {
    6.     switch (ul_reason_for_call)
    7.     {
    8.     case DLL_PROCESS_ATTACH:
    9.     case DLL_THREAD_ATTACH:
    10.     case DLL_THREAD_DETACH:
    11.     case DLL_PROCESS_DETACH:
    12.         break;
    13.     }
    14.     return TRUE;
    15. }
     
  4. sideX

    sideX New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    57
    Код (Text):
    1. ;       dwPID         - идентификатор процесса
    2. ;       lpDllName     - имя DLL
    3. ;       lpProcAddress - адрес LoadLibraryA
    4.  
    5. InjectDll   proc dwPID, lpDllName, lpProcAddress : DWORD
    6.         LOCAL   lpMemory : DWORD
    7.         LOCAL   hProcess : DWORD
    8.        
    9.         xinvoke OpenProcess, PROCESS_ALL_ACCESS, 0, dwPID
    10.         test    eax, eax
    11.         jnz @F
    12.         ret            
    13. @@:
    14.         mov hProcess, eax
    15.  
    16.         xinvoke VirtualAllocEx, hProcess, 0, 10, MEM_COMMIT, PAGE_EXECUTE_READWRITE
    17.         test    eax, eax
    18.         jz  _proc_close
    19.         mov lpMemory, eax
    20.  
    21.         xinvoke _strlen, lpDllName
    22.         xinvoke WriteProcessMemory, hProcess, lpMemory, lpDllName, eax, offset dwBytes
    23.         test    eax, eax
    24.         jz  _free_mem
    25.        
    26.         xinvoke CreateRemoteThread, hProcess, 0, 0, lpProcAddress, lpMemory, 0, offset dwBytes
    27.         test    eax, eax
    28.         jz  _free_mem
    29.        
    30.         xinvoke CloseHandle, eax
    31.        
    32. _free_mem:
    33.         push    eax
    34.         xinvoke VirtualFree, lpMemory, 0, MEM_RELEASE
    35.         pop eax
    36.        
    37. _proc_close:
    38.         push    eax
    39.         xinvoke CloseHandle, hProcess
    40.         pop eax
    41.         ret
    42. InjectDll   endp
     
  5. sideX

    sideX New Member

    Публикаций:
    0
    Регистрация:
    9 июн 2009
    Сообщения:
    57
    както так
     
  6. quporos

    quporos New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    55
    спасибо,буду пробовать после отпишусь.
     
  7. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    quporos
    Ось хоть какая?
     
  8. quporos

    quporos New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    55
    xp sp3
     
  9. quporos

    quporos New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    55
    вообще код взят из Winlogonhijack Injector Written by JeFFOsZ
    _http://en.pudn.com/downloads3/sourcecode/hack/detail11999_en.html
     
  10. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Ну так и выложи весь проект, что можно из куска понять?
     
  11. quporos

    quporos New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    55
    main.cpp
    Код (Text):
    1. #include <windows.h>
    2. #include <tlhelp32.h>
    3. #include <tchar.h>
    4. #include <stdio.h>
    5.  
    6. #include "injector.h"
    7.  
    8.  
    9. #define PROCESS_SIZE MAX_PATH    
    10. #define STATUS_INFO_LENGTH_MISMATCH 0xc0000004    
    11.    
    12. typedef LONG NTSTATUS;  
    13.    
    14. // NTQUERYSYSTEMINFORMATION    
    15.    
    16. typedef struct _tagThreadInfo  
    17. {  
    18.         FILETIME ftCreationTime;  
    19.         DWORD dwUnknown1;  
    20.         DWORD dwStartAddress;  
    21.         DWORD dwOwningPID;  
    22.         DWORD dwThreadID;  
    23.         DWORD dwCurrentPriority;  
    24.         DWORD dwBasePriority;  
    25.         DWORD dwContextSwitches;  
    26.         DWORD dwThreadState;  
    27.         DWORD dwWaitReason;  
    28.         DWORD dwUnknown2[5];  
    29. } THREADINFO, *PTHREADINFO;  
    30.    
    31. #pragma warning(disable:4200)    
    32. typedef struct _tagProcessInfo  
    33. {  
    34.         DWORD dwOffset;  
    35.         DWORD dwThreadCount;  
    36.         DWORD dwUnknown1[6];  
    37.         FILETIME ftCreationTime;  
    38.         DWORD dwUnknown2[5];  
    39.         WCHAR* pszProcessName;  
    40.         DWORD dwBasePriority;  
    41.         DWORD dwProcessID;  
    42.         DWORD dwParentProcessID;  
    43.         DWORD dwHandleCount;  
    44.         DWORD dwUnknown3;  
    45.         DWORD dwUnknown4;  
    46.         DWORD dwVirtualBytesPeak;  
    47.         DWORD dwVirtualBytes;  
    48.         DWORD dwPageFaults;  
    49.         DWORD dwWorkingSetPeak;  
    50.         DWORD dwWorkingSet;  
    51.         DWORD dwUnknown5;  
    52.         DWORD dwPagedPool;  
    53.         DWORD dwUnknown6;  
    54.         DWORD dwNonPagedPool;  
    55.         DWORD dwPageFileBytesPeak;  
    56.         DWORD dwPrivateBytes;  
    57.         DWORD dwPageFileBytes;  
    58.         DWORD dwUnknown7[4];  
    59.         THREADINFO ti[0];  
    60. } _PROCESSINFO, *PPROCESSINFO;  
    61. #pragma warning( default:4200 )    
    62.    
    63. long(__stdcall *NtQuerySystemInformation)(ULONG,PVOID,ULONG,ULONG)=NULL;  
    64.    
    65. // END NTQUERYSYSTEMINFORMATION    
    66. ULONG InjectAllWinLogons(char* argv)  
    67. {  
    68.     PBYTE pbyInfo = NULL;  
    69.     DWORD cInfoSize = 0x2000;  
    70.     ULONG ret=0;  
    71.     CHAR szProcessName[PROCESS_SIZE];  
    72.     PPROCESSINFO pProcessInfo;  
    73.     BOOL bLast;  
    74.     DWORD dwResult=0;  
    75.    
    76.     if (!NtQuerySystemInformation)  
    77.         NtQuerySystemInformation=(long( __stdcall * )(ULONG,PVOID,ULONG,ULONG))  
    78.          GetProcAddress(GetModuleHandle("ntdll.dll"),"NtQuerySystemInformation");  
    79.        
    80.     pbyInfo=(PBYTE)malloc(cInfoSize);  
    81.    
    82.     if (pbyInfo)  
    83.     {  
    84.         while(NtQuerySystemInformation(5,pbyInfo,cInfoSize,0)==STATUS_INFO_LENGTH_MISMATCH)  
    85.         // check for size    
    86.         {  
    87.             cInfoSize += 0x2000;  
    88.             pbyInfo=(PBYTE)realloc(pbyInfo,cInfoSize);  
    89.         }  
    90.    
    91.         pProcessInfo=(PPROCESSINFO)pbyInfo;  
    92.         bLast = FALSE;  
    93.            
    94.         do  
    95.         {  
    96.             if (pProcessInfo->dwOffset==0) // last?    
    97.                 bLast = TRUE;  
    98.    
    99.             if (pProcessInfo->dwProcessID!=0) // ignore system idle    
    100.             {      
    101.                 WideCharToMultiByte(CP_ACP, 0, pProcessInfo->pszProcessName,    
    102.                 -1,szProcessName, PROCESS_SIZE, NULL, NULL); // convert processname    
    103.                    
    104.                 if (strnicmp(szProcessName,"winlogon.exe",11)==0)  
    105.                 {  
    106.                     printf("[*] LoadDllInProcess(PID: %u): ",pProcessInfo->dwProcessID);  
    107.                     // Load our DLL in the given process    
    108.                     if (dwResult=LoadDllInProcessEx(pProcessInfo->dwProcessID,argv))  
    109.                         printf("OK (Base: 0x%08X).\r\n",dwResult);  
    110.                     else  
    111.                         printf("FAILED.\r\n");  
    112.                 }  
    113.                            
    114.                 ret++;  
    115.             }  
    116.             pProcessInfo=(PPROCESSINFO)((PBYTE)pProcessInfo+pProcessInfo->dwOffset); // next    
    117.         }    
    118.         while(bLast==FALSE);  
    119.            
    120.         free(pbyInfo);  
    121.     }  
    122.     return ret;  
    123. }  
    124.    
    125. int main(int argc,char* argv[])  
    126. {  
    127.     BOOL bNt,bDeb;  
    128.     DWORD dwMinorVer,dwMajorVer;  
    129.     TOKEN_PRIVILEGES tkpOld;  
    130.    
    131.     printf("[+] Winlogon Hijack v0.3 Injector written by JeFFOsZ\r\n");  
    132.      
    133.         // Check if we're running on a NT based windows.    
    134.         bNt=IsWinNt(&dwMajorVer,&dwMinorVer);  
    135.         printf("[*] IsWinNt(): ");  
    136.         if (bNt)  
    137.             printf("OK [Version: %d.%d].\r\n",dwMajorVer,dwMinorVer);  
    138.         else {  
    139.             printf("FAILED.\r\n");  
    140.             return 0;  
    141.         }  
    142.    
    143.         // Get debug privileges    
    144.         bDeb=GetDebugPriv(&tkpOld);  
    145.         printf("[*] GetDebugPriv(): ");  
    146.         if (bDeb)  
    147.             printf("OK.\r\n");  
    148.         else {  
    149.             printf("FAILED.\r\n");  
    150.             return 0;  
    151.         }  
    152.        
    153.         // Inject all "winlogon.exe" processes.    
    154.         InjectAllWinLogons("c:\\HOOK.dll");  
    155.              
    156.     return 0;  
    157. }
    ijector.cpp
    Код (Text):
    1. ////////////////////////////////////////////////////////////////////    
    2. //    
    3. // This file contains the functions that are used for injecting data    
    4. // and loading a dll in a remote process. Written by JeFFOsZ    
    5. //    
    6. ////////////////////////////////////////////////////////////////////    
    7.    
    8. #include <WINDOWS.H>    
    9. #include <STDIO.H>    
    10. #include "injector.h"    
    11.    
    12. BOOL GetDebugPriv(PTOKEN_PRIVILEGES ptkpPrev)  
    13. {  
    14.     HANDLE hToken;  
    15.     LUID sedebugnameValue;  
    16.     TOKEN_PRIVILEGES tkp;  
    17.     BOOL bRet;  
    18.     ULONG ulRet;  
    19.    
    20.     if (!OpenProcessToken(GetCurrentProcess(),  
    21.         TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken))  
    22.         return FALSE;  
    23.    
    24.     bRet=LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &sedebugnameValue);  
    25.     if (!bRet)  
    26.     {  
    27.         CloseHandle(hToken);  
    28.         return bRet;  
    29.     }  
    30.    
    31.     tkp.PrivilegeCount = 1;  
    32.     tkp.Privileges[0].Luid = sedebugnameValue;  
    33.     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  
    34.    
    35.     bRet=AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(tkp),ptkpPrev,&ulRet);  
    36.    
    37.     CloseHandle(hToken);  
    38.    
    39.     return bRet;  
    40. }  
    41.    
    42. BOOL RestorePrivileges(TOKEN_PRIVILEGES tkp)  
    43. {  
    44.     HANDLE hToken;  
    45.     BOOL bRet;  
    46.        
    47.     if (!OpenProcessToken(GetCurrentProcess(),  
    48.         TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken))  
    49.         return FALSE;  
    50.        
    51.     bRet=AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(tkp),NULL,NULL);  
    52.        
    53.     CloseHandle(hToken);  
    54.    
    55.     return bRet;  
    56. }  
    57.    
    58. BOOL IsWinNt(PDWORD pdwMajorVersion,PDWORD pdwMinorVersion)  
    59. {  
    60.     OSVERSIONINFO ovi;  
    61.     DWORD lRet;  
    62.        
    63.     ovi.dwOSVersionInfoSize=sizeof(OSVERSIONINFO);  
    64.    
    65.     lRet=GetVersionEx(&ovi);  
    66.     if (!lRet)  
    67.         return FALSE;  
    68.    
    69.     if (ovi.dwPlatformId!=VER_PLATFORM_WIN32_NT)  
    70.         return FALSE;  
    71.        
    72.     *pdwMajorVersion=ovi.dwMajorVersion;  
    73.     *pdwMinorVersion=ovi.dwMinorVersion;  
    74.    
    75.     return TRUE;  
    76. }  
    77.    
    78. LPVOID InjectData(HANDLE hProcess,LPVOID lpData,ULONG ulFuncLen)  
    79. {  
    80.     LPVOID lpAddress=NULL;  
    81.     DWORD dwOldProtect;  
    82.     DWORD BytesWritten=0;  
    83.        
    84.     // Allocate memory for lpData int the remote process    
    85.     lpAddress=VirtualAllocEx(hProcess,NULL,ulFuncLen,MEM_COMMIT|MEM_TOP_DOWN,PAGE_EXECUTE_READWRITE);  
    86.     if (lpAddress)  
    87.     {  
    88.         // Change the protection for the allocated memory    
    89.         if (VirtualProtectEx(hProcess,lpAddress,ulFuncLen,PAGE_EXECUTE_READWRITE,&dwOldProtect))  
    90.         {  
    91.             // ...    
    92.             FlushInstructionCache(hProcess,lpAddress,ulFuncLen);  
    93.             // Write lpData into the remote process    
    94.             if (WriteProcessMemory(hProcess,lpAddress,lpData,ulFuncLen,&BytesWritten))  
    95.             {  
    96.                 // Restore old protection :)    
    97.                 VirtualProtectEx(hProcess,lpAddress,ulFuncLen,dwOldProtect,NULL);  
    98.                 // Return remote address for lpData    
    99.                 return lpAddress;  
    100.             }  
    101.             // Restore old protection :)    
    102.             VirtualProtectEx(hProcess,lpAddress,ulFuncLen,dwOldProtect,NULL);  
    103.         }  
    104.     }  
    105.     return 0;  
    106. }  
    107.    
    108. // !! we use LoadDllInProcessEx instead !!!    
    109.    
    110. // Loads a dll in a process, uses kernel32.LoadLibraryA    
    111. // NOTE: we should use NTDLL.LdrLoadDll instead !    
    112. /*BOOL LoadDllInProcess(DWORD dwPid,char* DllPathName)  
    113. {  
    114.     HANDLE hProcess,hThread;  
    115.     ULONG ulSize;  
    116.     SECURITY_ATTRIBUTES saSecAttr;  
    117.     DWORD dwActual;  
    118.     LPVOID lpAddress=NULL;  
    119.     HMODULE hmKernel32;  
    120.     FARPROC fpLoadLibraryA;  
    121.      
    122.     // Open process  
    123.     if (hProcess=OpenProcess(PROCESS_ALL_ACCESS,0,dwPid))  
    124.     {  
    125.         ulSize=strlen(DllPathName)+1; // size to write  
    126.         if (lpAddress=InjectData(hProcess,DllPathName,ulSize))  
    127.         // Inject the LoadLibraryA parameter in the process  
    128.         {  
    129.             // Set security attributes  
    130.             saSecAttr.nLength=sizeof(SECURITY_ATTRIBUTES);  
    131.             saSecAttr.lpSecurityDescriptor = NULL;  
    132.             saSecAttr.bInheritHandle = TRUE;  
    133.             // Get address from kernel32  
    134.             hmKernel32=GetModuleHandle("kernel32");  
    135.             // Get address from kernel32.LoadLibraryA  
    136.             fpLoadLibraryA=GetProcAddress(hmKernel32,"LoadLibraryA");  
    137.             // Execute LoadLibraryA in the process  
    138.             if (hThread=CreateRemoteThread(hProcess,&saSecAttr,0,(LPTHREAD_START_ROUTINE)fpLoadLibraryA,lpAddress,0,&dwActual))  
    139.             {  
    140.                 // Wait till thread responds  
    141.                 WaitForSingleObject(hThread, INFINITE);  
    142.                 // Get result for unhooking ??  
    143.                 // Free memory allocated by InjectData  
    144.                 VirtualFreeEx(hProcess, lpAddress, ulSize, MEM_RELEASE);  
    145.                 // close remotethreead handle  
    146.                 CloseHandle(hThread);  
    147.                 // close process handle  
    148.                 CloseHandle(hProcess);  
    149.                 return TRUE;  
    150.             }  
    151.         }  
    152.         CloseHandle(hProcess);  
    153.     }  
    154.     return FALSE;  
    155. }*/  
    156.    
    157. NTSTATUS __stdcall RemoteThread(RemoteProcessData *rpd)  
    158. {  
    159.        
    160.     NTSTATUS rc=  
    161.         (NTSTATUS)rpd->pLdrLoadDll(  
    162.                     rpd->PathToFile,  
    163.                     rpd->Flags,  
    164.                     &rpd->ModuleFileName,  
    165.                     &rpd->ModuleHandle  
    166.                     );  
    167.     return rc;  
    168. }  
    169. void __stdcall EndRemoteThread(void) { }  
    170.    
    171. // Loads a dll in a process (uses ntdll.LdrLoadData)    
    172. DWORD LoadDllInProcessEx(DWORD dwPid,char* DllPathName)  
    173. {  
    174.     HANDLE hProcess,hThread;  
    175.     RemoteProcessData rpd;  
    176.     PWSTR pwModuleFileName;  
    177.     HANDLE hModule=NULL;  
    178.     UNICODE_STRING usModule;  
    179.     LPVOID lpParameters,lpThread;  
    180.     SECURITY_ATTRIBUTES saSecAttr;  
    181.     DWORD dwActual,dwResult=0,rc;  
    182.    
    183.     hProcess=OpenProcess(PROCESS_ALL_ACCESS,0,dwPid);  
    184.     if (hProcess==NULL)  
    185.         goto cleanup;  
    186.    
    187.     rpd.pLdrLoadDll=(LDRLOADDLL)GetProcAddress(GetModuleHandle("ntdll"),"LdrLoadDll");  
    188.     if (!rpd.pLdrLoadDll)  
    189.         goto cleanup;  
    190.            
    191.     rpd.Flags=0;  
    192.     rpd.PathToFile=NULL;  
    193.     rpd.ModuleHandle=NULL;  
    194.        
    195.     pwModuleFileName=(PWSTR)malloc((strlen(DllPathName)*2)+1);  
    196.     if (!pwModuleFileName)  
    197.         goto cleanup;  
    198.            
    199.     MultiByteToWideChar(CP_ACP,0,DllPathName,strlen(DllPathName),pwModuleFileName,(strlen(DllPathName)*2)+1);  
    200.     usModule.Buffer=(PWSTR)InjectData(hProcess,pwModuleFileName,(strlen(DllPathName)*2)+1);  
    201.    
    202.     free(pwModuleFileName);  
    203.    
    204.     if (!usModule.Buffer)  
    205.         goto cleanup;  
    206.        
    207.     usModule.Length=(strlen(DllPathName)*2)+1;  
    208.     usModule.MaximumLength=(strlen(DllPathName)*2)+1;  
    209.    
    210.     memcpy(&rpd.ModuleFileName,&usModule,sizeof(UNICODE_STRING));  
    211.    
    212.     lpParameters=InjectData(hProcess,&rpd,sizeof(RemoteProcessData)+4096);  
    213.     if (!lpParameters)  
    214.         goto cleanup;  
    215.    
    216.     lpThread=InjectData(hProcess,&RemoteThread,(PBYTE)EndRemoteThread-(PBYTE)RemoteThread+4096);  
    217.     if (!lpThread)  
    218.         goto cleanup;  
    219.    
    220.     // Set security attributes    
    221.     saSecAttr.nLength=sizeof(SECURITY_ATTRIBUTES);  
    222.     saSecAttr.lpSecurityDescriptor = NULL;  
    223.     saSecAttr.bInheritHandle = TRUE;  
    224.    
    225.     hThread=CreateRemoteThread(hProcess,&saSecAttr,0,(LPTHREAD_START_ROUTINE)lpThread,lpParameters,0,&dwActual);  
    226.     if (hThread==NULL)  
    227.         goto cleanup;  
    228.        
    229.     rc=WaitForSingleObject(hThread, INFINITE);    
    230.    
    231.     switch (rc)    
    232.     {  
    233.         case WAIT_TIMEOUT:  
    234.             break;  
    235.         case WAIT_FAILED:  
    236.             break;  
    237.         case WAIT_OBJECT_0:  
    238.             if (ReadProcessMemory(hProcess,lpParameters,&rpd,sizeof(RemoteProcessData),&dwActual))  
    239.                 dwResult=(DWORD)rpd.ModuleHandle;  
    240.             break;  
    241.         default:  
    242.             break;  
    243.     }  
    244.    
    245. cleanup:  
    246.     if (rpd.ModuleFileName.Buffer!=NULL)  
    247.         VirtualFreeEx(hProcess,rpd.ModuleFileName.Buffer,0,MEM_RELEASE);  
    248.    
    249.     if (lpParameters!=NULL)  
    250.         VirtualFreeEx(hProcess,lpParameters,0,MEM_RELEASE);  
    251.    
    252.     if (lpThread!=NULL)  
    253.         VirtualFreeEx(hProcess,lpThread,0,MEM_RELEASE);  
    254.    
    255.     if (hThread) CloseHandle(hThread);  
    256.     if (hProcess) CloseHandle(hProcess);  
    257.    
    258.     return dwResult;  
    259. }
    injector.h
    Код (Text):
    1. #define NTSTATUS LONG
    2. #define NTAPI __stdcall  
    3. #define NTSYSAPI DECLSPEC_IMPORT
    4. #define ACCESS_MASK DWORD;
    5.  
    6. typedef struct _UNICODE_STRING  
    7. {  
    8.     USHORT Length;  
    9.     USHORT MaximumLength;  
    10.     PWSTR Buffer;
    11. }  
    12. UNICODE_STRING, *PUNICODE_STRING;
    13.  
    14. typedef NTSTATUS (NTAPI* LDRLOADDLL)(PWCHAR,ULONG,PUNICODE_STRING,PHANDLE);
    15.  
    16. typedef struct _RemoteProcessData
    17. {
    18.     LDRLOADDLL pLdrLoadDll;
    19.     PWCHAR PathToFile;
    20.     ULONG Flags;
    21.     UNICODE_STRING ModuleFileName;
    22.     HANDLE ModuleHandle;
    23. } RemoteProcessData;
    24.  
    25. // Get debug privileges
    26. BOOL GetDebugPriv(PTOKEN_PRIVILEGES);  
    27.  
    28. // Restores original privileges
    29. BOOL RestorePrivileges(TOKEN_PRIVILEGES);
    30.  
    31. // Checks for NT and returns version numbers when true
    32. BOOL IsWinNt(PDWORD,PDWORD);
    33.  
    34. // Injects data into a process and returns the address of the data
    35. LPVOID InjectData(HANDLE,LPVOID,ULONG);  
    36.  
    37. // Loads a dll in a process. (uses kernel32.LoadLibraryA).  
    38. // Use LoadDllInProcessEx instead !
    39. // BOOL LoadDllInProcess(DWORD,char*);  
    40.  
    41. // Loads a dll in a process (uses ntdll.LdrLoadDll) and returns the
    42. // ModuleHandle.
    43. DWORD LoadDllInProcessEx(DWORD,char*);
     
  12. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    quporos
    Бсодит так как процесс завершается с ошибкой.
    Размеры структур для слепка различны в версиях. Их размер нужно находить динамически. Используйте поиск.
    Ошибка может быть где угодно, например исключение. Для решения таких проблем используют отладчик. Более того винлогон отлаживается олей без проблем. Аттачитесь к процессу, ставите брейк на NtContinue и запускаете свой тред. Там будет видно где проблема.