1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "sandbox/win/src/restricted_token_utils.h" 6 #include "sandbox/win/tools/finder/finder.h" 7 8 #define PARAM_IS(y) (argc > i) && (_wcsicmp(argv[i], y) == 0) 9 10 void PrintUsage(wchar_t *application_name) { 11 wprintf(L"\n\nUsage: \n %ls --token type --object ob1 [ob2 ob3] " 12 L"--access ac1 [ac2 ac3] [--log filename]", application_name); 13 wprintf(L"\n\n Token Types : \n\tLOCKDOWN \n\tRESTRICTED " 14 L"\n\tLIMITED_USER \n\tINTERACTIVE_USER \n\tNON_ADMIN \n\tUNPROTECTED"); 15 wprintf(L"\n Object Types: \n\tREG \n\tFILE \n\tKERNEL"); 16 wprintf(L"\n Access Types: \n\tR \n\tW \n\tALL"); 17 wprintf(L"\n\nSample: \n %ls --token LOCKDOWN --object REG FILE KERNEL " 18 L"--access R W ALL", application_name); 19 } 20 21 int wmain(int argc, wchar_t* argv[]) { 22 // Extract the filename from the path. 23 wchar_t *app_name = wcsrchr(argv[0], L'\\'); 24 if (!app_name) { 25 app_name = argv[0]; 26 } else { 27 app_name++; 28 } 29 30 // parameters to read 31 ATL::CString log_file; 32 sandbox::TokenLevel token_type = sandbox::USER_LOCKDOWN; 33 DWORD object_type = 0; 34 DWORD access_type = 0; 35 36 // no arguments 37 if (argc == 1) { 38 PrintUsage(app_name); 39 return -1; 40 } 41 42 // parse command line. 43 for (int i = 1; i < argc; ++i) { 44 if (PARAM_IS(L"--token")) { 45 i++; 46 if (argc > i) { 47 if (PARAM_IS(L"LOCKDOWN")) { 48 token_type = sandbox::USER_LOCKDOWN; 49 } else if (PARAM_IS(L"RESTRICTED")) { 50 token_type = sandbox::USER_RESTRICTED; 51 } else if (PARAM_IS(L"LIMITED_USER")) { 52 token_type = sandbox::USER_LIMITED; 53 } else if (PARAM_IS(L"INTERACTIVE_USER")) { 54 token_type = sandbox::USER_INTERACTIVE; 55 } else if (PARAM_IS(L"NON_ADMIN")) { 56 token_type = sandbox::USER_NON_ADMIN; 57 } else if (PARAM_IS(L"USER_RESTRICTED_SAME_ACCESS")) { 58 token_type = sandbox::USER_RESTRICTED_SAME_ACCESS; 59 } else if (PARAM_IS(L"UNPROTECTED")) { 60 token_type = sandbox::USER_UNPROTECTED; 61 } else { 62 wprintf(L"\nAbord. Invalid token type \"%ls\"", argv[i]); 63 PrintUsage(app_name); 64 return -1; 65 } 66 } 67 } else if (PARAM_IS(L"--object")) { 68 bool is_object = true; 69 do { 70 i++; 71 if (PARAM_IS(L"REG")) { 72 object_type |= kScanRegistry; 73 } else if (PARAM_IS(L"FILE")) { 74 object_type |= kScanFileSystem; 75 } else if (PARAM_IS(L"KERNEL")) { 76 object_type |= kScanKernelObjects; 77 } else { 78 is_object = false; 79 } 80 } while(is_object); 81 i--; 82 } else if (PARAM_IS(L"--access")) { 83 bool is_access = true; 84 do { 85 i++; 86 if (PARAM_IS(L"R")) { 87 access_type |= kTestForRead; 88 } else if (PARAM_IS(L"W")) { 89 access_type |= kTestForWrite; 90 } else if (PARAM_IS(L"ALL")) { 91 access_type |= kTestForAll; 92 } else { 93 is_access = false; 94 } 95 } while(is_access); 96 i--; 97 } else if (PARAM_IS(L"--log")) { 98 i++; 99 if (argc > i) { 100 log_file = argv[i]; 101 } 102 else { 103 wprintf(L"\nAbord. No log file specified"); 104 PrintUsage(app_name); 105 return -1; 106 } 107 } else { 108 wprintf(L"\nAbord. Unrecognized parameter \"%ls\"", argv[i]); 109 PrintUsage(app_name); 110 return -1; 111 } 112 } 113 114 // validate parameters 115 if (0 == access_type) { 116 wprintf(L"\nAbord, Access type not specified"); 117 PrintUsage(app_name); 118 return -1; 119 } 120 121 if (0 == object_type) { 122 wprintf(L"\nAbord, Object type not specified"); 123 PrintUsage(app_name); 124 return -1; 125 } 126 127 128 // Open log file 129 FILE * file_output; 130 if (log_file.GetLength()) { 131 errno_t err = _wfopen_s(&file_output, log_file, L"w"); 132 if (err) { 133 wprintf(L"\nAbord, Cannot open file \"%ls\"", log_file.GetBuffer()); 134 return -1; 135 } 136 } else { 137 file_output = stdout; 138 } 139 140 Finder finder_obj; 141 finder_obj.Init(token_type, object_type, access_type, file_output); 142 finder_obj.Scan(); 143 144 fclose(file_output); 145 146 return 0; 147 } 148