diff options
32 files changed, 436 insertions, 1065 deletions
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd index 91723a00..d71cd2e 100644 --- a/chrome/browser/browser_resources.grd +++ b/chrome/browser/browser_resources.grd @@ -401,7 +401,7 @@ <include name="IDR_AUTOMATIC_PROFILE_RESET_RULES_DRY" file="internal\resources\profile_reset\automatic_profile_reset_rules_dry.dat" type="BINDATA" /> <include name="IDR_AUTOMATIC_PROFILE_RESET_HASH_SEED" file="internal\resources\profile_reset\automatic_profile_reset_hash_seed.dat" type="BINDATA" /> <include name="IDR_AUTOMATIC_PROFILE_RESET_HASH_SEED_DRY" file="internal\resources\profile_reset\automatic_profile_reset_hash_seed_dry.dat" type="BINDATA" /> - <include name="IDR_ADDITIONAL_MODULE_IDS" file="${additional_modules_list_file}" use_base_dir="false" type="BINDATA" /> + <include name="IDR_ADDITIONAL_MODULES_LIST" file="${additional_modules_list_file}" use_base_dir="false" type="BINDATA" /> </if> <if expr="pp_ifdef('chromeos')"> <include name="IDR_SOUND_STARTUP_WAV" file="resources\chromeos\sounds\startup.wav" type="BINDATA" /> diff --git a/chrome/browser/chrome_browser_main_win.cc b/chrome/browser/chrome_browser_main_win.cc index 68c0efa..7be7e23 100644 --- a/chrome/browser/chrome_browser_main_win.cc +++ b/chrome/browser/chrome_browser_main_win.cc @@ -22,7 +22,7 @@ #include "base/win/windows_version.h" #include "base/win/wrapped_window_proc.h" #include "chrome/browser/browser_util_win.h" -#include "chrome/browser/install_verification/win/install_verification.h" +#include "chrome/browser/install_module_verifier_win.h" #include "chrome/browser/profiles/profile_info_cache.h" #include "chrome/browser/profiles/profile_shortcut_manager.h" #include "chrome/browser/shell_integration.h" @@ -234,7 +234,7 @@ void ChromeBrowserMainPartsWin::PostBrowserStart() { content::BrowserThread::GetMessageLoopProxyForThread( content::BrowserThread::UI)->PostDelayedTask( FROM_HERE, - base::Bind(&VerifyInstallation), + base::Bind(&BeginModuleVerification), base::TimeDelta::FromSeconds(45)); } diff --git a/chrome/browser/install_module_verifier_unittest_win.cc b/chrome/browser/install_module_verifier_unittest_win.cc new file mode 100644 index 0000000..0e1f501 --- /dev/null +++ b/chrome/browser/install_module_verifier_unittest_win.cc @@ -0,0 +1,156 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/install_module_verifier_win.h" + +#include <set> +#include <string> +#include <utility> +#include <vector> + +#include "base/md5.h" +#include "base/memory/scoped_ptr.h" +#include "base/values.h" +#include "chrome/browser/enumerate_modules_model_win.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace { + +void AddModule(base::ListValue* list, + ModuleEnumerator::ModuleType type, + const std::string& name) { + scoped_ptr<base::DictionaryValue> data(new DictionaryValue()); + data->SetInteger("type", type); + data->SetString("name", name); + list->Append(data.release()); +} + +} // namespace + +TEST(InstallModuleVerifierTest, ExtractLoadedModuleNameDigests) { + std::set<std::string> loaded_module_name_digests; + scoped_ptr<base::ListValue> list(new ListValue()); + ExtractLoadedModuleNameDigests(*list, &loaded_module_name_digests); + ASSERT_TRUE(loaded_module_name_digests.empty()); + // WinSock modules are ignored. + AddModule(list.get(), + ModuleEnumerator::SHELL_EXTENSION, "winsock_module.dll"); + // Shell Extension modules are ignored. + AddModule( + list.get(), + ModuleEnumerator::WINSOCK_MODULE_REGISTRATION, "shell_extension.dll"); + AddModule(list.get(), ModuleEnumerator::LOADED_MODULE, "fancy_pants.dll"); + AddModule(list.get(), ModuleEnumerator::LOADED_MODULE, "chrome.dll"); + ExtractLoadedModuleNameDigests(*list, &loaded_module_name_digests); + ASSERT_EQ(2, loaded_module_name_digests.size()); + ASSERT_NE(loaded_module_name_digests.end(), + loaded_module_name_digests.find(base::MD5String("chrome.dll"))); + ASSERT_NE(loaded_module_name_digests.end(), + loaded_module_name_digests.find( + base::MD5String("fancy_pants.dll"))); +} + +TEST(InstallModuleVerifierTest, VerifyModules) { + std::set<std::string> loaded_module_name_digests; + std::set<size_t> reported_module_ids; + + VerifyModules(loaded_module_name_digests, + AdditionalModules(), + &reported_module_ids); + ASSERT_TRUE(reported_module_ids.empty()); + + // Expected, Loaded modules are reported. + loaded_module_name_digests.insert(base::MD5String("chrome.dll")); + // Unexpected modules are ignored. + loaded_module_name_digests.insert(base::MD5String("fancy_pants.dll")); + VerifyModules(loaded_module_name_digests, + AdditionalModules(), + &reported_module_ids); + ASSERT_EQ(1, reported_module_ids.size()); + // chrome.dll + ASSERT_NE(reported_module_ids.end(), reported_module_ids.find(1u)); + reported_module_ids.clear(); + + // AdditionalModules can be used to detect other modules. + AdditionalModules additional_modules; + std::string fancy_pants_md5_digest(base::MD5String("fancy_pants.dll")); + additional_modules.push_back( + std::make_pair(123u, base::StringPiece(fancy_pants_md5_digest))); + VerifyModules(loaded_module_name_digests, + additional_modules, + &reported_module_ids); + ASSERT_EQ(2, reported_module_ids.size()); + // chrome.dll + ASSERT_NE(reported_module_ids.end(), reported_module_ids.find(1u)); + // fancy_pants.dll + ASSERT_NE(reported_module_ids.end(), reported_module_ids.find(123u)); + reported_module_ids.clear(); + + // TODO(erikwright): Verify case-insensitive. +} + +TEST(InstallModuleVerifierTest, ParseAdditionalModules) { + std::vector<std::pair<size_t, base::StringPiece> > additional_modules; + + ParseAdditionalModules(base::StringPiece(), &additional_modules); + ASSERT_EQ(0u, additional_modules.size()); + + // Invalid input. + ParseAdditionalModules("hello", &additional_modules); + ASSERT_EQ(0u, additional_modules.size()); + ParseAdditionalModules("hello world", &additional_modules); + ASSERT_EQ(0u, additional_modules.size()); + ParseAdditionalModules("hello world\nfoo bar", &additional_modules); + ASSERT_EQ(0u, additional_modules.size()); + ParseAdditionalModules("123 world\nfoo bar", &additional_modules); + ASSERT_EQ(0u, additional_modules.size()); + + // A single valid line followed by an invalid line. + ParseAdditionalModules("hello 0123456789abcdef0123456789abcdef\nfoo bar", + &additional_modules); + ASSERT_EQ(0u, additional_modules.size()); + ParseAdditionalModules("123 0123456789abcdef0123456789abcdef\nfoo bar", + &additional_modules); + ASSERT_EQ(1u, additional_modules.size()); + ASSERT_EQ(123u, additional_modules[0].first); + ASSERT_EQ("0123456789abcdef0123456789abcdef", additional_modules[0].second); + additional_modules.clear(); + + // The same, but with \r\n. + ParseAdditionalModules("123 0123456789abcdef0123456789abcdef\r\nfoo bar", + &additional_modules); + ASSERT_EQ(1u, additional_modules.size()); + ASSERT_EQ(123u, additional_modules[0].first); + ASSERT_EQ("0123456789abcdef0123456789abcdef", additional_modules[0].second); + additional_modules.clear(); + + // Several valid and invalid lines, with varying line terminations etc. + ParseAdditionalModules("123 0123456789abcdef0123456789abcdef\r\n" + "456 DEADBEEFDEADBEEF\r" + "789 DEADBEEFDEADBEEFDEADBEEFDEADBEEF\n" + "\n" + "\n" + "321 BAADCAFEBAADCAFEBAADCAFEBAADCAFE\n", + &additional_modules); + ASSERT_EQ(3u, additional_modules.size()); + ASSERT_EQ(123u, additional_modules[0].first); + ASSERT_EQ("0123456789abcdef0123456789abcdef", additional_modules[0].second); + ASSERT_EQ(789u, additional_modules[1].first); + ASSERT_EQ("DEADBEEFDEADBEEFDEADBEEFDEADBEEF", additional_modules[1].second); + ASSERT_EQ(321u, additional_modules[2].first); + ASSERT_EQ("BAADCAFEBAADCAFEBAADCAFEBAADCAFE", additional_modules[2].second); + additional_modules.clear(); + + // Leading empty lines, no termination on final line. + ParseAdditionalModules("\n" + "123 0123456789abcdef0123456789abcdef\r\n" + "321 BAADCAFEBAADCAFEBAADCAFEBAADCAFE", + &additional_modules); + ASSERT_EQ(2u, additional_modules.size()); + ASSERT_EQ(123u, additional_modules[0].first); + ASSERT_EQ("0123456789abcdef0123456789abcdef", additional_modules[0].second); + ASSERT_EQ(321u, additional_modules[1].first); + ASSERT_EQ("BAADCAFEBAADCAFEBAADCAFEBAADCAFE", additional_modules[1].second); + additional_modules.clear(); +} diff --git a/chrome/browser/install_module_verifier_win.cc b/chrome/browser/install_module_verifier_win.cc new file mode 100644 index 0000000..bca42a5 --- /dev/null +++ b/chrome/browser/install_module_verifier_win.cc @@ -0,0 +1,219 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/install_module_verifier_win.h" + +#include <string> + +#include "base/basictypes.h" +#include "base/compiler_specific.h" +#include "base/logging.h" +#include "base/md5.h" +#include "base/memory/scoped_ptr.h" +#include "base/metrics/sparse_histogram.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_tokenizer.h" +#include "base/strings/string_util.h" +#include "base/values.h" +#include "chrome/browser/chrome_notification_types.h" +#include "chrome/browser/enumerate_modules_model_win.h" +#include "content/public/browser/notification_observer.h" +#include "content/public/browser/notification_registrar.h" +#include "content/public/browser/notification_service.h" +#include "content/public/browser/notification_source.h" +#include "grit/browser_resources.h" +#include "ui/base/resource/resource_bundle.h" + +namespace { + +struct { size_t id; const char* module_name_digest; } + kExpectedInstallModules[] = { + {1u, "c8cc47613e155f2129f480c6ced84549"}, // chrome.dll + {2u, "49b78a23b0d8d5d8fb60d4e472b22764"}, // chrome_child.dll + }; + +// Helper to extract canonical loaded module names from the EnumerateModulesWin +// output and then verify the results. +void VerifyEnumeratedModules(const base::ListValue& module_list) { + std::set<std::string> module_name_digests; + ExtractLoadedModuleNameDigests(module_list, &module_name_digests); + + AdditionalModules additional_modules; + ParseAdditionalModules( + ResourceBundle::GetSharedInstance().GetRawDataResource( + IDR_ADDITIONAL_MODULES_LIST), + &additional_modules); + + std::set<size_t> installed_module_ids; + VerifyModules(module_name_digests, additional_modules, &installed_module_ids); + for (std::set<size_t>::iterator it = installed_module_ids.begin(); + it != installed_module_ids.end(); + ++it) { + UMA_HISTOGRAM_SPARSE_SLOWLY("InstallVerifier.ModuleMatch", *it); + } +} + +// Waits for NOTIFICATION_MODULE_LIST_ENUMERATED, which indicates that +// EnumerateModulesWin has completed its work. Retrieves the enumerated module +// list and processes it. +class InstallModuleVerifier : public content::NotificationObserver { + public: + // Creates an instance that will wait for module enumeration to complete, + // process the results, and then delete itself. + static void WaitForModuleList() { + // Will delete itself when scan results are available. + new InstallModuleVerifier(); + } + + private: + InstallModuleVerifier() { + notification_registrar_.Add(this, + chrome::NOTIFICATION_MODULE_LIST_ENUMERATED, + content::NotificationService::AllSources()); + } + + ~InstallModuleVerifier() {} + + // content::NotificationObserver implementation. + virtual void Observe(int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) OVERRIDE { + DCHECK_EQ(type, chrome::NOTIFICATION_MODULE_LIST_ENUMERATED); + EnumerateModulesModel* model = + content::Source<EnumerateModulesModel>(source).ptr(); + scoped_ptr<base::ListValue> module_list(model->GetModuleList()); + + if (module_list.get()) + VerifyEnumeratedModules(*module_list); + + delete this; + } + + content::NotificationRegistrar notification_registrar_; + + DISALLOW_COPY_AND_ASSIGN(InstallModuleVerifier); +}; + +} // namespace + +void BeginModuleVerification() { + scoped_ptr<base::ListValue> module_list( + EnumerateModulesModel::GetInstance()->GetModuleList()); + if (module_list.get()) { + VerifyEnumeratedModules(*module_list); + } else { + InstallModuleVerifier::WaitForModuleList(); + EnumerateModulesModel::GetInstance()->ScanNow(); + } +} + +void ExtractLoadedModuleNameDigests( + const base::ListValue& module_list, + std::set<std::string>* module_name_digests) { + DCHECK(module_name_digests); + + // EnumerateModulesModel produces a list of dictionaries. + // Each dictionary corresponds to a module and exposes a number of properties. + // We care only about 'type' and 'name'. + for (size_t i = 0; i < module_list.GetSize(); ++i) { + const base::DictionaryValue* module_dictionary = NULL; + if (!module_list.GetDictionary(i, &module_dictionary)) + continue; + ModuleEnumerator::ModuleType module_type = + ModuleEnumerator::LOADED_MODULE; + if (!module_dictionary->GetInteger( + "type", reinterpret_cast<int*>(&module_type)) || + module_type != ModuleEnumerator::LOADED_MODULE) { + continue; + } + std::string module_name; + if (!module_dictionary->GetString("name", &module_name)) + continue; + StringToLowerASCII(&module_name); + module_name_digests->insert(base::MD5String(module_name)); + } +} + +void VerifyModules( + const std::set<std::string>& module_name_digests, + const AdditionalModules& additional_modules, + std::set<size_t>* installed_module_ids) { + DCHECK(installed_module_ids); + + for (size_t i = 0; i < arraysize(kExpectedInstallModules); ++i) { + if (module_name_digests.find( + kExpectedInstallModules[i].module_name_digest) != + module_name_digests.end()) { + installed_module_ids->insert(kExpectedInstallModules[i].id); + } + } + + for (AdditionalModules::const_iterator it = additional_modules.begin(); + it != additional_modules.end(); ++it) { + std::string additional_module = it->second.as_string(); + StringToLowerASCII(&additional_module); + + if (module_name_digests.find(additional_module) + != module_name_digests.end()) { + installed_module_ids->insert(it->first); + } + } +} + +namespace { + +// Parses a line consisting of a positive decimal number and a 32-digit +// hexadecimal number, separated by a space. Inserts the output, if valid, into +// |additional_modules|. Unexpected leading or trailing characters will cause +// the line to be ignored, as will invalid decimal/hexadecimal characters. +void ParseAdditionalModuleLine( + const base::StringPiece& line, + AdditionalModules* additional_modules) { + DCHECK(additional_modules); + + base::CStringTokenizer line_tokenizer(line.begin(), line.end(), " "); + + if (!line_tokenizer.GetNext()) + return; // Empty string. + base::StringPiece id_piece(line_tokenizer.token_piece()); + + if (!line_tokenizer.GetNext()) + return; // No delimiter (' '). + base::StringPiece digest_piece(line_tokenizer.token_piece()); + + if (line_tokenizer.GetNext()) + return; // Unexpected trailing characters. + + unsigned id = 0; + if (!StringToUint(id_piece, &id)) + return; // First token was not decimal. + + if (digest_piece.length() != 32) + return; // Second token is not the right length. + + for (base::StringPiece::const_iterator it = digest_piece.begin(); + it != digest_piece.end(); ++it) { + if (!IsHexDigit(*it)) + return; // Second token has invalid characters. + } + + // This is a valid line. + additional_modules->push_back(std::make_pair(id, digest_piece)); +} + +} // namespace + +void ParseAdditionalModules( + const base::StringPiece& raw_data, + AdditionalModules* additional_modules) { + DCHECK(additional_modules); + + base::CStringTokenizer file_tokenizer(raw_data.begin(), + raw_data.end(), + "\r\n"); + while (file_tokenizer.GetNext()) { + ParseAdditionalModuleLine(base::StringPiece(file_tokenizer.token_piece()), + additional_modules); + } +} diff --git a/chrome/browser/install_module_verifier_win.h b/chrome/browser/install_module_verifier_win.h new file mode 100644 index 0000000..ab0683d --- /dev/null +++ b/chrome/browser/install_module_verifier_win.h @@ -0,0 +1,48 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_INSTALL_MODULE_VERIFIER_WIN_H_ +#define CHROME_BROWSER_INSTALL_MODULE_VERIFIER_WIN_H_ + +#include <set> +#include <string> +#include <utility> +#include <vector> + +#include "base/strings/string_piece.h" + +namespace base { +class ListValue; +} // namespace base + +typedef std::vector<std::pair<size_t, base::StringPiece> > AdditionalModules; + +// Starts a background process to verify installed modules. Results are reported +// via UMA. +void BeginModuleVerification(); + +// Converts a list of modules descriptions extracted from EnumerateModulesModel +// into a list of loaded module name digests. +void ExtractLoadedModuleNameDigests( + const base::ListValue& module_list, + std::set<std::string>* loaded_module_name_digests); + +// Verifies a list of installed module name digests and inserts installed module +// IDs into the supplied set. +void VerifyModules(const std::set<std::string>& module_name_digests, + const AdditionalModules& additional_modules, + std::set<size_t>* installed_module_ids); + +// Parses a list of additional modules to verify. The data format is a series of +// lines. Each line starts with a decimal ID, then a module name digest, +// separated by a space. Lines are terminated by \r and/or \n. The result is a +// vector of pairs where the first value is an ID and the second value is the +// corresponding module name digest. The StringPieces use the same underlying +// storage as |raw_data|. +// +// Invalid lines are ignored. +void ParseAdditionalModules(const base::StringPiece& raw_data, + AdditionalModules* additional_modules); + +#endif // CHROME_BROWSER_INSTALL_MODULE_VERIFIER_WIN_H_ diff --git a/chrome/browser/install_verification/OWNERS b/chrome/browser/install_verification/OWNERS deleted file mode 100644 index 11103fa..0000000 --- a/chrome/browser/install_verification/OWNERS +++ /dev/null @@ -1,3 +0,0 @@ -erikwright@chromium.org -mad@chromium.org -robertshield@chromium.org diff --git a/chrome/browser/install_verification/win/imported_module_verification.cc b/chrome/browser/install_verification/win/imported_module_verification.cc deleted file mode 100644 index 9a3b7da..0000000 --- a/chrome/browser/install_verification/win/imported_module_verification.cc +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/install_verification/win/imported_module_verification.h" - -#include <Windows.h> - -#include <algorithm> -#include <iterator> -#include <string> -#include <vector> -#include "base/logging.h" -#include "base/strings/string16.h" -#include "chrome/browser/install_verification/win/module_info.h" - -namespace { - -// We must make sure not to include modules here that are likely to get unloaded -// because the scanning of the module is not done within a loader lock, so is -// not resilient to changes made to the modules list. -const wchar_t* const kModulesToScan[] = { - L"chrome.dll", - L"kernel32.dll", - L"user32.dll" -}; - -bool AddressBeyondRange(const ModuleInfo& module, uintptr_t address) { - return module.base_address + module.size < address; -} - -void ScanImportAddressTable( - HMODULE module_handle, - const std::set<ModuleInfo>& loaded_modules, - std::set<base::string16>* imported_modules) { - DCHECK(module_handle); - DCHECK(imported_modules); - - // To find the Import Address Table address, we start from the DOS header. - // The module handle is actually the base address where the header is. - IMAGE_DOS_HEADER* dos_header = - reinterpret_cast<IMAGE_DOS_HEADER*>(module_handle); - // The e_lfanew is an offset from the DOS header to the NT header. It should - // never be 0. - DCHECK(dos_header->e_lfanew); - IMAGE_NT_HEADERS* nt_headers = reinterpret_cast<IMAGE_NT_HEADERS*>( - module_handle + dos_header->e_lfanew / sizeof(uintptr_t)); - // For modules that have an import address table, its offset from the - // DOS header is stored in the second data directory's VirtualAddress. - if (!nt_headers->OptionalHeader.DataDirectory[1].VirtualAddress) - return; - IMAGE_IMPORT_DESCRIPTOR* image_descriptor = - reinterpret_cast<IMAGE_IMPORT_DESCRIPTOR*>(module_handle + - nt_headers->OptionalHeader.DataDirectory[1].VirtualAddress / - sizeof(uintptr_t)); - // The list of Import Address Tables ends with an empty {0} descriptor. - while (image_descriptor->Characteristics) { - uintptr_t* address = reinterpret_cast<uintptr_t*>( - module_handle + image_descriptor->FirstThunk / sizeof(uintptr_t)); - // Each section of the Import Address Table ends with a NULL funcpointer. - while (*address) { - std::set<ModuleInfo>::const_iterator lower_bound = std::lower_bound( - loaded_modules.begin(), loaded_modules.end(), *address, - AddressBeyondRange); - if (lower_bound != loaded_modules.end() && - lower_bound->ContainsAddress(*address)) { - imported_modules->insert(lower_bound->name); - } - ++address; - } - image_descriptor += sizeof(image_descriptor) / sizeof(uintptr_t); - } -} - -} // namespace - -void VerifyImportedModules(const std::set<ModuleInfo>& loaded_modules, - const ModuleIDs& module_ids, - ModuleVerificationDelegate* delegate){ - std::set<base::string16> imported_module_names; - for (size_t i = 0; i < arraysize(kModulesToScan); ++i) { - HMODULE module_handle = ::GetModuleHandle(kModulesToScan[i]); - if (module_handle) { - ScanImportAddressTable(module_handle, - loaded_modules, - &imported_module_names); - } - } - - std::vector<std::string> module_name_digests; - std::transform(imported_module_names.begin(), - imported_module_names.end(), - std::back_inserter(module_name_digests), - &CalculateModuleNameDigest); - ReportModuleMatches(module_name_digests, module_ids, delegate); -} diff --git a/chrome/browser/install_verification/win/imported_module_verification.h b/chrome/browser/install_verification/win/imported_module_verification.h deleted file mode 100644 index 749c358..0000000 --- a/chrome/browser/install_verification/win/imported_module_verification.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_INSTALL_VERIFICATION_WIN_IMPORTED_MODULE_VERIFICATION_H_ -#define CHROME_BROWSER_INSTALL_VERIFICATION_WIN_IMPORTED_MODULE_VERIFICATION_H_ - -#include <set> - -#include "chrome/browser/install_verification/win/module_ids.h" -#include "chrome/browser/install_verification/win/module_verification_common.h" - -struct ModuleInfo; - -// Verifies module imports using the provided |loaded_modules| info and the -// expected |module_ids|. Reports results to |delegate|. -void VerifyImportedModules(const std::set<ModuleInfo>& loaded_modules, - const ModuleIDs& module_ids, - ModuleVerificationDelegate* delegate); - -#endif // CHROME_BROWSER_INSTALL_VERIFICATION_WIN_IMPORTED_MODULE_VERIFICATION_H_ diff --git a/chrome/browser/install_verification/win/imported_module_verification_unittest.cc b/chrome/browser/install_verification/win/imported_module_verification_unittest.cc deleted file mode 100644 index 464eadf..0000000 --- a/chrome/browser/install_verification/win/imported_module_verification_unittest.cc +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/install_verification/win/imported_module_verification.h" - -#include <set> -#include <utility> -#include <vector> -#include "chrome/browser/install_verification/win/module_ids.h" -#include "chrome/browser/install_verification/win/module_info.h" -#include "chrome/browser/install_verification/win/module_verification_test.h" -#include "testing/gtest/include/gtest/gtest.h" - -class ImportedModuleVerificationTest : public ModuleVerificationTest {}; - -TEST_F(ImportedModuleVerificationTest, TestCase) { - std::set<ModuleInfo> loaded_modules; - ModuleIDs empty_modules_of_interest; - ModuleIDs non_matching_modules_of_interest; - ModuleIDs matching_modules_of_interest; - - // This set of IDs will match because user32.dll imports advapi32.dll. - matching_modules_of_interest.insert( - std::make_pair(CalculateModuleNameDigest(L"fancy_pants.dll"), 999u)); - matching_modules_of_interest.insert( - std::make_pair(CalculateModuleNameDigest(L"advapi32.dll"), 666u)); - matching_modules_of_interest.insert( - std::make_pair(CalculateModuleNameDigest(L"unit_tests.exe"), 777u)); - matching_modules_of_interest.insert( - std::make_pair(CalculateModuleNameDigest(L"user32.dll"), 888u)); - - non_matching_modules_of_interest.insert( - std::make_pair(CalculateModuleNameDigest(L"fancy_pants.dll"), 999u)); - - // With empty loaded_modules, nothing matches. - VerifyImportedModules(loaded_modules, - empty_modules_of_interest, - &ImportedModuleVerificationTest::ReportModule); - ASSERT_TRUE(reported_module_ids_.empty()); - VerifyImportedModules(loaded_modules, - non_matching_modules_of_interest, - &ImportedModuleVerificationTest::ReportModule); - ASSERT_TRUE(reported_module_ids_.empty()); - VerifyImportedModules(loaded_modules, - matching_modules_of_interest, - &ImportedModuleVerificationTest::ReportModule); - ASSERT_TRUE(reported_module_ids_.empty()); - - // With populated loaded_modules, only the 'matching' module data gives a - // match. - ASSERT_TRUE(GetLoadedModuleInfoSet(&loaded_modules)); - VerifyImportedModules(loaded_modules, - empty_modules_of_interest, - &ImportedModuleVerificationTest::ReportModule); - ASSERT_TRUE(reported_module_ids_.empty()); - VerifyImportedModules(loaded_modules, - non_matching_modules_of_interest, - &ImportedModuleVerificationTest::ReportModule); - ASSERT_TRUE(reported_module_ids_.empty()); - VerifyImportedModules(loaded_modules, - matching_modules_of_interest, - &ImportedModuleVerificationTest::ReportModule); - ASSERT_EQ(1u, reported_module_ids_.size()); - ASSERT_EQ(666u, *reported_module_ids_.begin()); -} diff --git a/chrome/browser/install_verification/win/install_verification.cc b/chrome/browser/install_verification/win/install_verification.cc deleted file mode 100644 index c113dd2..0000000 --- a/chrome/browser/install_verification/win/install_verification.cc +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/install_verification/win/install_verification.h" - -#include <set> -#include <vector> - -#include "base/metrics/sparse_histogram.h" -#include "chrome/browser/install_verification/win/imported_module_verification.h" -#include "chrome/browser/install_verification/win/loaded_module_verification.h" -#include "chrome/browser/install_verification/win/module_ids.h" -#include "chrome/browser/install_verification/win/module_info.h" -#include "chrome/browser/install_verification/win/module_verification_common.h" - -namespace { - -void ReportModuleMatch(size_t module_id) { - UMA_HISTOGRAM_SPARSE_SLOWLY("InstallVerifier.ModuleMatch", module_id); -} - -void ReportImport(size_t module_id) { - UMA_HISTOGRAM_SPARSE_SLOWLY("InstallVerifier.ModuleImport", module_id); -} - -} // namespace - -void VerifyInstallation() { - ModuleIDs module_ids; - LoadModuleIDs(&module_ids); - std::set<ModuleInfo> loaded_modules; - if (GetLoadedModules(&loaded_modules)) { - VerifyLoadedModules(loaded_modules, module_ids, &ReportModuleMatch); - VerifyImportedModules(loaded_modules, module_ids, &ReportImport); - } -} diff --git a/chrome/browser/install_verification/win/install_verification.h b/chrome/browser/install_verification/win/install_verification.h deleted file mode 100644 index 64f6c42..0000000 --- a/chrome/browser/install_verification/win/install_verification.h +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_INSTALL_VERIFICATION_WIN_INSTALL_VERIFICATION_H_ -#define CHROME_BROWSER_INSTALL_VERIFICATION_WIN_INSTALL_VERIFICATION_H_ - -// Starts a background process to verify the Chrome installation. Results are -// reported via UMA. -void VerifyInstallation(); - -#endif // CHROME_BROWSER_INSTALL_VERIFICATION_WIN_INSTALL_VERIFICATION_H_ diff --git a/chrome/browser/install_verification/win/loaded_module_verification.cc b/chrome/browser/install_verification/win/loaded_module_verification.cc deleted file mode 100644 index da6253a..0000000 --- a/chrome/browser/install_verification/win/loaded_module_verification.cc +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/install_verification/win/loaded_module_verification.h" - -#include <algorithm> -#include <iterator> -#include <string> -#include "chrome/browser/install_verification/win/module_ids.h" -#include "chrome/browser/install_verification/win/module_info.h" - -namespace { - -std::string ExtractModuleNameDigest(const ModuleInfo& module_info) { - return CalculateModuleNameDigest(module_info.name); -} - -} // namespace - -void VerifyLoadedModules(const std::set<ModuleInfo>& loaded_modules, - const ModuleIDs& module_ids, - ModuleVerificationDelegate* delegate) { - std::vector<std::string> module_name_digests; - std::transform(loaded_modules.begin(), - loaded_modules.end(), - std::back_inserter(module_name_digests), - &ExtractModuleNameDigest); - ReportModuleMatches(module_name_digests, module_ids, delegate); -} diff --git a/chrome/browser/install_verification/win/loaded_module_verification.h b/chrome/browser/install_verification/win/loaded_module_verification.h deleted file mode 100644 index 94786cc..0000000 --- a/chrome/browser/install_verification/win/loaded_module_verification.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_INSTALL_VERIFICATION_WIN_LOADED_MODULE_VERIFICATION_H_ -#define CHROME_BROWSER_INSTALL_VERIFICATION_WIN_LOADED_MODULE_VERIFICATION_H_ - -#include <set> - -#include "chrome/browser/install_verification/win/module_ids.h" -#include "chrome/browser/install_verification/win/module_verification_common.h" - -struct ModuleInfo; - -// Verifies the provided |loaded_modules| info against the expected -// |module_ids|. Reports results to |delegate|. -void VerifyLoadedModules(const std::set<ModuleInfo>& loaded_modules, - const ModuleIDs& module_ids, - ModuleVerificationDelegate* delegate); - -#endif // CHROME_BROWSER_INSTALL_VERIFICATION_WIN_LOADED_MODULE_VERIFICATION_H_ diff --git a/chrome/browser/install_verification/win/loaded_module_verification_unittest.cc b/chrome/browser/install_verification/win/loaded_module_verification_unittest.cc deleted file mode 100644 index 6cff3af..0000000 --- a/chrome/browser/install_verification/win/loaded_module_verification_unittest.cc +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/install_verification/win/loaded_module_verification.h" - -#include "chrome/browser/install_verification/win/module_verification_test.h" -#include "testing/gtest/include/gtest/gtest.h" - -class LoadedModuleVerificationTest : public ModuleVerificationTest { }; - -TEST_F(LoadedModuleVerificationTest, TestCase) { - std::set<ModuleInfo> loaded_modules; - ModuleIDs empty_modules_of_interest; - ModuleIDs non_matching_modules_of_interest; - ModuleIDs matching_modules_of_interest; - - matching_modules_of_interest.insert( - std::make_pair(CalculateModuleNameDigest(L"fancy_pants.dll"), 999u)); - matching_modules_of_interest.insert( - std::make_pair(CalculateModuleNameDigest(L"advapi32.dll"), 666u)); - matching_modules_of_interest.insert( - std::make_pair(CalculateModuleNameDigest(L"unit_tests.exe"), 777u)); - matching_modules_of_interest.insert( - std::make_pair(CalculateModuleNameDigest(L"user32.dll"), 888u)); - - non_matching_modules_of_interest.insert( - std::make_pair(CalculateModuleNameDigest(L"fancy_pants.dll"), 999u)); - - // With empty loaded_modules, nothing matches. - VerifyLoadedModules(loaded_modules, - empty_modules_of_interest, - &ModuleVerificationTest::ReportModule); - ASSERT_TRUE(reported_module_ids_.empty()); - VerifyLoadedModules(loaded_modules, - non_matching_modules_of_interest, - &ModuleVerificationTest::ReportModule); - ASSERT_TRUE(reported_module_ids_.empty()); - VerifyLoadedModules(loaded_modules, - matching_modules_of_interest, - &ModuleVerificationTest::ReportModule); - ASSERT_TRUE(reported_module_ids_.empty()); - - // With populated loaded_modules, only the 'matching' module data gives a - // match. - ASSERT_TRUE(GetLoadedModuleInfoSet(&loaded_modules)); - VerifyLoadedModules(loaded_modules, - empty_modules_of_interest, - &ModuleVerificationTest::ReportModule); - ASSERT_TRUE(reported_module_ids_.empty()); - VerifyLoadedModules(loaded_modules, - non_matching_modules_of_interest, - &ModuleVerificationTest::ReportModule); - ASSERT_TRUE(reported_module_ids_.empty()); - VerifyLoadedModules(loaded_modules, - matching_modules_of_interest, - &ModuleVerificationTest::ReportModule); - ASSERT_EQ(3u, reported_module_ids_.size()); - ASSERT_NE(reported_module_ids_.end(), reported_module_ids_.find(666u)); - ASSERT_NE(reported_module_ids_.end(), reported_module_ids_.find(777u)); - ASSERT_NE(reported_module_ids_.end(), reported_module_ids_.find(888u)); -} diff --git a/chrome/browser/install_verification/win/loaded_modules_snapshot.cc b/chrome/browser/install_verification/win/loaded_modules_snapshot.cc deleted file mode 100644 index 33d620f..0000000 --- a/chrome/browser/install_verification/win/loaded_modules_snapshot.cc +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/install_verification/win/loaded_modules_snapshot.h" - -#include <Psapi.h> - -#include "base/logging.h" - -bool GetLoadedModulesSnapshot(std::vector<HMODULE>* snapshot) { - DCHECK(snapshot); - DCHECK_EQ(0u, snapshot->size()); - snapshot->resize(1); - - HANDLE process = ::GetCurrentProcess(); - - // We will retry at least once after first determining |bytes_required|. If - // the list of modules changes after we receive |bytes_required| we may retry - // more than once. - int retries_remaining = 5; - do { - DWORD bytes_required = 0; - // EnumProcessModules returns 'success' even if the buffer size is too - // small. - if (!::EnumProcessModules(process, - &(*snapshot)[0], - snapshot->size() * sizeof(HMODULE), - &bytes_required)) { - DPLOG(ERROR) << "::EnumProcessModules failed."; - return false; - } - DCHECK_EQ(0u, bytes_required % sizeof(HMODULE)); - size_t num_modules = bytes_required / sizeof(HMODULE); - if (num_modules <= snapshot->size()) { - // Buffer size was too big, presumably because a module was unloaded. - snapshot->erase(snapshot->begin() + num_modules, snapshot->end()); - return true; - } else if (num_modules == 0) { - DLOG(ERROR) << "Can't determine the module list size."; - return false; - } else { - // Buffer size was too small. Try again with a larger buffer. - snapshot->resize(num_modules, NULL); - } - } while (--retries_remaining); - - DLOG(ERROR) << "Failed to enumerate modules."; - return false; -} diff --git a/chrome/browser/install_verification/win/loaded_modules_snapshot.h b/chrome/browser/install_verification/win/loaded_modules_snapshot.h deleted file mode 100644 index d7266e2..0000000 --- a/chrome/browser/install_verification/win/loaded_modules_snapshot.h +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_INSTALL_VERIFICATION_WIN_LOADED_MODULES_SNAPSHOT_H_ -#define CHROME_BROWSER_INSTALL_VERIFICATION_WIN_LOADED_MODULES_SNAPSHOT_H_ - -#include <Windows.h> - -#include <vector> - -// Takes a snapshot of the modules loaded in the current process. The returned -// HMODULEs are not add-ref'd, so they should not be closed and may be -// invalidated at any time (should a module be unloaded). -bool GetLoadedModulesSnapshot(std::vector<HMODULE>* snapshot); - -#endif // CHROME_BROWSER_INSTALL_VERIFICATION_WIN_LOADED_MODULES_SNAPSHOT_H_ diff --git a/chrome/browser/install_verification/win/loaded_modules_snapshot_unittest.cc b/chrome/browser/install_verification/win/loaded_modules_snapshot_unittest.cc deleted file mode 100644 index ce6f89c..0000000 --- a/chrome/browser/install_verification/win/loaded_modules_snapshot_unittest.cc +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/install_verification/win/loaded_modules_snapshot.h" - -#include <Windows.h> - -#include <algorithm> -#include <vector> - -#include "base/bind.h" -#include "base/callback_helpers.h" -#include "chrome/browser/install_verification/win/module_verification_test.h" -#include "testing/gtest/include/gtest/gtest.h" - -TEST(LoadedModulesSnapshotTest, TestCase) { - std::vector<HMODULE> snapshot; - - ASSERT_TRUE(GetLoadedModulesSnapshot(&snapshot)); - size_t original_snapshot_size = snapshot.size(); - ASSERT_GT(original_snapshot_size, 0u); - snapshot.clear(); - HMODULE chrome_dll = ::LoadLibrary(L"chrome.dll"); - ASSERT_NE(static_cast<HMODULE>(NULL), chrome_dll); - base::ScopedClosureRunner release_chrome_dll( - base::Bind(base::IgnoreResult(&::FreeLibrary), chrome_dll)); - ASSERT_TRUE(GetLoadedModulesSnapshot(&snapshot)); - ASSERT_GT(snapshot.size(), original_snapshot_size); - ASSERT_NE(snapshot.end(), - std::find(snapshot.begin(), snapshot.end(), chrome_dll)); -} diff --git a/chrome/browser/install_verification/win/module_ids.cc b/chrome/browser/install_verification/win/module_ids.cc deleted file mode 100644 index c470c5d..0000000 --- a/chrome/browser/install_verification/win/module_ids.cc +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/install_verification/win/module_ids.h" - -#include <utility> - -#include "base/basictypes.h" -#include "base/logging.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/string_piece.h" -#include "base/strings/string_tokenizer.h" -#include "base/strings/string_util.h" -#include "grit/browser_resources.h" -#include "ui/base/resource/resource_bundle.h" - -namespace { - -struct { size_t id; const char* module_name_digest; } - kExpectedInstallModules[] = { - {1u, "c8cc47613e155f2129f480c6ced84549"}, // chrome.dll - {2u, "49b78a23b0d8d5d8fb60d4e472b22764"}, // chrome_child.dll - }; - -// Parses a line consisting of a positive decimal number and a 32-digit -// hexadecimal number, separated by a space. Inserts the output, if valid, into -// |module_ids|. Unexpected leading or trailing characters will cause -// the line to be ignored, as will invalid decimal/hexadecimal characters. -void ParseAdditionalModuleID( - const base::StringPiece& line, - ModuleIDs* module_ids) { - DCHECK(module_ids); - - base::CStringTokenizer line_tokenizer(line.begin(), line.end(), " "); - - if (!line_tokenizer.GetNext()) - return; // Empty string. - base::StringPiece id_piece(line_tokenizer.token_piece()); - - if (!line_tokenizer.GetNext()) - return; // No delimiter (' '). - base::StringPiece digest_piece(line_tokenizer.token_piece()); - - if (line_tokenizer.GetNext()) - return; // Unexpected trailing characters. - - unsigned id = 0; - if (!StringToUint(id_piece, &id)) - return; // First token was not decimal. - - if (digest_piece.length() != 32) - return; // Second token is not the right length. - - for (base::StringPiece::const_iterator it = digest_piece.begin(); - it != digest_piece.end(); ++it) { - if (!IsHexDigit(*it)) - return; // Second token has invalid characters. - } - - // This is a valid line. - module_ids->insert(std::make_pair(digest_piece.as_string(), id)); -} - -} // namespace - -void ParseAdditionalModuleIDs( - const base::StringPiece& raw_data, - ModuleIDs* module_ids) { - DCHECK(module_ids); - - base::CStringTokenizer file_tokenizer(raw_data.begin(), - raw_data.end(), - "\r\n"); - while (file_tokenizer.GetNext()) { - ParseAdditionalModuleID(base::StringPiece(file_tokenizer.token_piece()), - module_ids); - } -} - -void LoadModuleIDs(ModuleIDs* module_ids) { - for (size_t i = 0; i < arraysize(kExpectedInstallModules); ++i) { - module_ids->insert( - std::make_pair( - kExpectedInstallModules[i].module_name_digest, - kExpectedInstallModules[i].id)); - } - ParseAdditionalModuleIDs( - ResourceBundle::GetSharedInstance().GetRawDataResource( - IDR_ADDITIONAL_MODULE_IDS), - module_ids); -} diff --git a/chrome/browser/install_verification/win/module_ids.h b/chrome/browser/install_verification/win/module_ids.h deleted file mode 100644 index 22cea1d..0000000 --- a/chrome/browser/install_verification/win/module_ids.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_IDS_H_ -#define CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_IDS_H_ - -#include <map> -#include <string> - -#include "base/strings/string_piece.h" - -typedef std::map<std::string, size_t> ModuleIDs; - -// Parses a list of additional modules to verify. The data format is a series of -// lines. Each line starts with a decimal ID, then a module name digest, -// separated by a space. Lines are terminated by \r and/or \n. Invalid lines are -// ignored. -// -// The result is a map of module name digests to module IDs. -void ParseAdditionalModuleIDs( - const base::StringPiece& raw_data, - ModuleIDs* module_ids); - -// Loads standard module IDs and additional module IDs from a resource. -void LoadModuleIDs(ModuleIDs* module_ids); - -#endif // CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_IDS_H_ diff --git a/chrome/browser/install_verification/win/module_ids_unittest.cc b/chrome/browser/install_verification/win/module_ids_unittest.cc deleted file mode 100644 index 55b1f0c..0000000 --- a/chrome/browser/install_verification/win/module_ids_unittest.cc +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/install_verification/win/module_ids.h" - -#include "base/strings/string_piece.h" -#include "chrome/browser/install_verification/win/module_verification_common.h" -#include "testing/gtest/include/gtest/gtest.h" - -TEST(ModuleIDsTest, LoadModuleIDs) { - ModuleIDs module_ids; - LoadModuleIDs(&module_ids); - ASSERT_EQ(1u, module_ids[CalculateModuleNameDigest(L"chrome.dll")]); -} - -TEST(ModuleIDsTest, ParseAdditionalModuleIDs) { - ModuleIDs module_ids; - - ParseAdditionalModuleIDs(base::StringPiece(), &module_ids); - ASSERT_EQ(0u, module_ids.size()); - - // Invalid input. - ParseAdditionalModuleIDs("hello", &module_ids); - ASSERT_EQ(0u, module_ids.size()); - ParseAdditionalModuleIDs("hello world", &module_ids); - ASSERT_EQ(0u, module_ids.size()); - ParseAdditionalModuleIDs("hello world\nfoo bar", &module_ids); - ASSERT_EQ(0u, module_ids.size()); - ParseAdditionalModuleIDs("123 world\nfoo bar", &module_ids); - ASSERT_EQ(0u, module_ids.size()); - ParseAdditionalModuleIDs("hello 0123456789abcdef0123456789abcdef\nfoo bar", - &module_ids); - ASSERT_EQ(0u, module_ids.size()); - - // A single valid line followed by an invalid line. - ParseAdditionalModuleIDs("123 0123456789abcdef0123456789abcdef\nfoo bar", - &module_ids); - ASSERT_EQ(1u, module_ids.size()); - ASSERT_EQ(123u, module_ids.begin()->second); - ASSERT_EQ("0123456789abcdef0123456789abcdef", module_ids.begin()->first); - module_ids.clear(); - - // The same, but with \r\n. - ParseAdditionalModuleIDs("123 0123456789abcdef0123456789abcdef\r\nfoo bar", - &module_ids); - ASSERT_EQ(1u, module_ids.size()); - ASSERT_EQ(123u, module_ids.begin()->second); - ASSERT_EQ("0123456789abcdef0123456789abcdef", module_ids.begin()->first); - module_ids.clear(); - - // Several valid and invalid lines, with varying line terminations etc. - ParseAdditionalModuleIDs("123 0123456789abcdef0123456789abcdef\r\n" - "456 DEADBEEFDEADBEEF\r" - "789 DEADBEEFDEADBEEFDEADBEEFDEADBEEF\n" - "\n" - "\n" - "321 BAADCAFEBAADCAFEBAADCAFEBAADCAFE\n", - &module_ids); - ASSERT_EQ(3u, module_ids.size()); - ASSERT_EQ(123u, module_ids["0123456789abcdef0123456789abcdef"]); - ASSERT_EQ(789u, module_ids["DEADBEEFDEADBEEFDEADBEEFDEADBEEF"]); - ASSERT_EQ(321u, module_ids["BAADCAFEBAADCAFEBAADCAFEBAADCAFE"]); - module_ids.clear(); - - // Leading empty lines, no termination on final line. - ParseAdditionalModuleIDs("\n" - "123 0123456789abcdef0123456789abcdef\r\n" - "321 BAADCAFEBAADCAFEBAADCAFEBAADCAFE", - &module_ids); - ASSERT_EQ(2u, module_ids.size()); - ASSERT_EQ(123u, module_ids["0123456789abcdef0123456789abcdef"]); - ASSERT_EQ(321u, module_ids["BAADCAFEBAADCAFEBAADCAFEBAADCAFE"]); - module_ids.clear(); -} diff --git a/chrome/browser/install_verification/win/module_info.h b/chrome/browser/install_verification/win/module_info.h deleted file mode 100644 index db3fb41..0000000 --- a/chrome/browser/install_verification/win/module_info.h +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_INFO_H_ -#define CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_INFO_H_ - -#include "base/strings/string16.h" - -// Represents and facilitates operations on the address range corresponding to a -// loaded module. -struct ModuleInfo { - ModuleInfo() : base_address(0), size(0) { - } - - ModuleInfo(const base::char16* const module_name, - uintptr_t module_base_address, - size_t module_size) - : base_address(module_base_address), - size(module_size), - name(module_name) { - } - - // Sorts modules by their base address. - bool operator< (const ModuleInfo& compare) const { - return base_address < compare.base_address; - } - - // Identifies if an address is within a module. - bool ContainsAddress(uintptr_t address) const { - return address >= base_address && address < base_address + size; - } - - base::string16 name; - uintptr_t base_address; - size_t size; -}; - -#endif // CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_INFO_H_ diff --git a/chrome/browser/install_verification/win/module_info_unittest.cc b/chrome/browser/install_verification/win/module_info_unittest.cc deleted file mode 100644 index 6aa5b46..0000000 --- a/chrome/browser/install_verification/win/module_info_unittest.cc +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/install_verification/win/module_info.h" - -#include "testing/gtest/include/gtest/gtest.h" - -TEST(ModuleInfoTest, TestCase) { - ModuleInfo foo(L"foo", 0, 10); - ModuleInfo bar(L"bar", 5, 10); - - ASSERT_LT(foo, bar); - - ASSERT_EQ(L"foo", foo.name); - ASSERT_TRUE(foo.ContainsAddress(4)); - ASSERT_TRUE(foo.ContainsAddress(5)); - ASSERT_TRUE(foo.ContainsAddress(9)); - ASSERT_FALSE(foo.ContainsAddress(10)); - ASSERT_FALSE(foo.ContainsAddress(11)); - - ASSERT_FALSE(bar.ContainsAddress(4)); - ASSERT_TRUE(bar.ContainsAddress(5)); - ASSERT_TRUE(bar.ContainsAddress(9)); - ASSERT_TRUE(bar.ContainsAddress(10)); - ASSERT_TRUE(bar.ContainsAddress(11)); -} diff --git a/chrome/browser/install_verification/win/module_list.cc b/chrome/browser/install_verification/win/module_list.cc deleted file mode 100644 index 3080806..0000000 --- a/chrome/browser/install_verification/win/module_list.cc +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/install_verification/win/module_list.h" - -#include <Psapi.h> - -#include <algorithm> - -#include "base/logging.h" -#include "chrome/browser/install_verification/win/module_info.h" - -namespace { - -void CheckFreeLibrary(HMODULE module) { - BOOL result = ::FreeLibrary(module); - DCHECK(result); -} - -} // namespace - -ModuleList::~ModuleList() { - std::for_each(modules_.begin(), modules_.end(), &CheckFreeLibrary); -} - -scoped_ptr<ModuleList> ModuleList::FromLoadedModuleSnapshot( - const std::vector<HMODULE>& snapshot) { - scoped_ptr<ModuleList> instance(new ModuleList); - - for (size_t i = 0; i < snapshot.size(); ++i) { - HMODULE module = NULL; - // ::GetModuleHandleEx add-ref's the module if successful. - if (::GetModuleHandleEx( - GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS, - reinterpret_cast<LPCWSTR>(snapshot[i]), - &module)) { - instance->modules_.push_back(module); - } - } - - return instance.Pass(); -} - -void ModuleList::GetModuleInfoSet(std::set<ModuleInfo>* module_info_set) { - HANDLE current_process = ::GetCurrentProcess(); - for (size_t i = 0; i < modules_.size(); ++i) { - wchar_t filename[MAX_PATH]; - // Simply ignore modules where GetModuleFileName or GetModuleInformation - // failed, they might have been unloaded. - if (::GetModuleFileName(modules_[i], filename, MAX_PATH) && - filename[0]) { - MODULEINFO sys_module_info = {}; - if (::GetModuleInformation( - current_process, modules_[i], - &sys_module_info, sizeof(sys_module_info))) { - module_info_set->insert(ModuleInfo( - filename, - reinterpret_cast<uintptr_t>(sys_module_info.lpBaseOfDll), - sys_module_info.SizeOfImage)); - } - } - } -} - -ModuleList::ModuleList() {} diff --git a/chrome/browser/install_verification/win/module_list.h b/chrome/browser/install_verification/win/module_list.h deleted file mode 100644 index f5b1789..0000000 --- a/chrome/browser/install_verification/win/module_list.h +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_LIST_H_ -#define CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_LIST_H_ - -#include <Windows.h> - -#include <set> -#include <vector> - -#include "base/basictypes.h" -#include "base/memory/scoped_ptr.h" - -struct ModuleInfo; - -// Manages a list of HMODULEs, releasing them upon destruction. -class ModuleList { - public: - ~ModuleList(); - - // Attempts to AddRef each HMODULE in |snapshot|. If a module was unloaded - // since |snapshot| was taken it will be silently dropped. Successfully - // AddRef'd HMODULEs will be inserted in the returned ModuleList. - // - // This method _always_ returns a valid ModuleList instance. - static scoped_ptr<ModuleList> FromLoadedModuleSnapshot( - const std::vector<HMODULE>& snapshot); - - // Retrieves name and address information for the module list. - void GetModuleInfoSet(std::set<ModuleInfo>* module_info_set); - - size_t size() const { - return modules_.size(); - } - - HMODULE operator[](size_t index) const { - return modules_[index]; - } - - private: - ModuleList(); - - std::vector<HMODULE> modules_; - - DISALLOW_COPY_AND_ASSIGN(ModuleList); -}; - -#endif // CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_LIST_H_ diff --git a/chrome/browser/install_verification/win/module_list_unittest.cc b/chrome/browser/install_verification/win/module_list_unittest.cc deleted file mode 100644 index da047f1..0000000 --- a/chrome/browser/install_verification/win/module_list_unittest.cc +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/install_verification/win/module_list.h" - -#include <Windows.h> -#include <vector> -#include "base/bind.h" -#include "base/bind_helpers.h" -#include "base/callback_helpers.h" -#include "base/memory/scoped_ptr.h" -#include "chrome/browser/install_verification/win/loaded_modules_snapshot.h" -#include "testing/gtest/include/gtest/gtest.h" - -TEST(ModuleListTest, TestCase) { - std::vector<HMODULE> snapshot; - ASSERT_TRUE(GetLoadedModulesSnapshot(&snapshot)); - scoped_ptr<ModuleList> module_list( - ModuleList::FromLoadedModuleSnapshot(snapshot)); - - // Lookup the number of loaded modules. - size_t original_list_size = module_list->size(); - ASSERT_GT(original_list_size, 0u); - snapshot.clear(); - - // Load in a new module. - HMODULE chrome_dll = ::LoadLibrary(L"chrome.dll"); - ASSERT_NE(static_cast<HMODULE>(NULL), chrome_dll); - base::ScopedClosureRunner release_chrome_dll( - base::Bind(base::IgnoreResult(&::FreeLibrary), chrome_dll)); - - // Verify that there is an increase in the snapshot size. - ASSERT_TRUE(GetLoadedModulesSnapshot(&snapshot)); - module_list = ModuleList::FromLoadedModuleSnapshot(snapshot); - ASSERT_GT(module_list->size(), original_list_size); - - // Unload the module. - release_chrome_dll.Reset(); - - // Reset module_list here. That should typically be the last ref on - // chrome.dll, so it will be unloaded now. - module_list.reset(); - ASSERT_EQ(NULL, ::GetModuleHandle(L"chrome.dll")); - - // List the modules from the stale snapshot (including a dangling HMODULE to - // chrome.dll), simulating a race condition. - module_list = ModuleList::FromLoadedModuleSnapshot(snapshot); - ASSERT_EQ(module_list->size(), original_list_size); -} diff --git a/chrome/browser/install_verification/win/module_verification_common.cc b/chrome/browser/install_verification/win/module_verification_common.cc deleted file mode 100644 index fe40c1e..0000000 --- a/chrome/browser/install_verification/win/module_verification_common.cc +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/install_verification/win/module_verification_common.h" - -#include "base/files/file_path.h" -#include "base/md5.h" -#include "base/strings/string_util.h" -#include "base/strings/utf_string_conversions.h" -#include "chrome/browser/install_verification/win/loaded_modules_snapshot.h" -#include "chrome/browser/install_verification/win/module_info.h" -#include "chrome/browser/install_verification/win/module_list.h" - -std::string CalculateModuleNameDigest(const base::string16& module_name) { - return base::MD5String(StringToLowerASCII(base::UTF16ToUTF8( - base::FilePath(module_name).BaseName().value()))); -} - -bool GetLoadedModules(std::set<ModuleInfo>* loaded_modules) { - std::vector<HMODULE> snapshot; - if (!GetLoadedModulesSnapshot(&snapshot)) - return false; - - ModuleList::FromLoadedModuleSnapshot(snapshot)->GetModuleInfoSet( - loaded_modules); - return true; -} - -void ReportModuleMatches(const std::vector<std::string>& module_name_digests, - const ModuleIDs& module_ids, - ModuleVerificationDelegate* delegate) { - for (size_t i = 0; i < module_name_digests.size(); ++i) { - ModuleIDs::const_iterator entry = module_ids.find(module_name_digests[i]); - if (entry != module_ids.end()) - delegate(entry->second); - } -} diff --git a/chrome/browser/install_verification/win/module_verification_common.h b/chrome/browser/install_verification/win/module_verification_common.h deleted file mode 100644 index 2f05618..0000000 --- a/chrome/browser/install_verification/win/module_verification_common.h +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_VERIFICATION_COMMON_H_ -#define CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_VERIFICATION_COMMON_H_ - -#include <set> -#include <string> -#include <vector> -#include "base/strings/string16.h" -#include "chrome/browser/install_verification/win/module_ids.h" - -struct ModuleInfo; - -// Calculates a canonical digest for |module_name|. Ignores case and strips path -// information if present. -std::string CalculateModuleNameDigest(const base::string16& module_name); - -// Retrieves a ModuleInfo set representing all currenly loaded modules. Returns -// false in case of failure. -bool GetLoadedModules(std::set<ModuleInfo>* loaded_modules); - -// Receives notification of a module verification result. -typedef void (ModuleVerificationDelegate)(size_t module_id); - -// For each module in |module_name_digests|, reports the associated ID from -// |module_ids|, if any, to |delegate|. -void ReportModuleMatches(const std::vector<std::string>& module_name_digests, - const ModuleIDs& module_ids, - ModuleVerificationDelegate* delegate); - -#endif // CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_VERIFICATION_COMMON_H_ diff --git a/chrome/browser/install_verification/win/module_verification_test.cc b/chrome/browser/install_verification/win/module_verification_test.cc deleted file mode 100644 index 02f0106..0000000 --- a/chrome/browser/install_verification/win/module_verification_test.cc +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/install_verification/win/module_verification_test.h" - -#include <Windows.h> - -#include <vector> -#include "chrome/browser/install_verification/win/loaded_modules_snapshot.h" -#include "chrome/browser/install_verification/win/module_list.h" - -std::set<size_t> ModuleVerificationTest::reported_module_ids_; - -void ModuleVerificationTest::SetUp() { - reported_module_ids_.clear(); -} - -bool ModuleVerificationTest::GetLoadedModuleInfoSet( - std::set<ModuleInfo>* loaded_module_info_set) { - std::vector<HMODULE> snapshot; - if (!GetLoadedModulesSnapshot(&snapshot)) - return false; - ModuleList::FromLoadedModuleSnapshot(snapshot)->GetModuleInfoSet( - loaded_module_info_set); - return true; -} - -// static -void ModuleVerificationTest::ReportModule(size_t module_id) { - reported_module_ids_.insert(module_id); -} diff --git a/chrome/browser/install_verification/win/module_verification_test.h b/chrome/browser/install_verification/win/module_verification_test.h deleted file mode 100644 index 5dfc458..0000000 --- a/chrome/browser/install_verification/win/module_verification_test.h +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_VERIFICATION_TEST_H_ -#define CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_VERIFICATION_TEST_H_ - -#include <set> -#include "base/compiler_specific.h" -#include "chrome/browser/install_verification/win/module_info.h" -#include "testing/gtest/include/gtest/gtest.h" - -struct ModuleInfo; - -class ModuleVerificationTest : public testing::Test { - public: - virtual void SetUp() OVERRIDE; - - protected: - bool GetLoadedModuleInfoSet(std::set<ModuleInfo>* loaded_module_info_set); - - static void ReportModule(size_t module_id); - - static std::set<size_t> reported_module_ids_; -}; - -#endif // CHROME_BROWSER_INSTALL_VERIFICATION_WIN_MODULE_VERIFICATION_TEST_H_ - diff --git a/chrome/browser/profile_resetter/automatic_profile_resetter_delegate.cc b/chrome/browser/profile_resetter/automatic_profile_resetter_delegate.cc index e793669..45441d1 100644 --- a/chrome/browser/profile_resetter/automatic_profile_resetter_delegate.cc +++ b/chrome/browser/profile_resetter/automatic_profile_resetter_delegate.cc @@ -4,11 +4,8 @@ #include "chrome/browser/profile_resetter/automatic_profile_resetter_delegate.h" -#include <string> - #include "base/callback.h" #include "base/logging.h" -#include "base/md5.h" #include "base/memory/scoped_vector.h" #include "base/strings/string_number_conversions.h" #include "base/strings/string_util.h" @@ -23,6 +20,7 @@ #if defined(OS_WIN) #include "chrome/browser/enumerate_modules_model_win.h" +#include "chrome/browser/install_module_verifier_win.h" #endif namespace { @@ -60,35 +58,6 @@ scoped_ptr<base::DictionaryValue> BuildSubTreeFromTemplateURL( return tree.Pass(); } -#if defined(OS_WIN) -void ExtractLoadedModuleNameDigests( - const base::ListValue& module_list, - base::ListValue* module_name_digests) { - DCHECK(module_name_digests); - - // EnumerateModulesModel produces a list of dictionaries. - // Each dictionary corresponds to a module and exposes a number of properties. - // We care only about 'type' and 'name'. - for (size_t i = 0; i < module_list.GetSize(); ++i) { - const base::DictionaryValue* module_dictionary = NULL; - if (!module_list.GetDictionary(i, &module_dictionary)) - continue; - ModuleEnumerator::ModuleType module_type = - ModuleEnumerator::LOADED_MODULE; - if (!module_dictionary->GetInteger( - "type", reinterpret_cast<int*>(&module_type)) || - module_type != ModuleEnumerator::LOADED_MODULE) { - continue; - } - std::string module_name; - if (!module_dictionary->GetString("name", &module_name)) - continue; - StringToLowerASCII(&module_name); - module_name_digests->AppendString(base::MD5String(module_name)); - } -} -#endif - } // namespace @@ -154,11 +123,15 @@ void AutomaticProfileResetterDelegateImpl:: scoped_ptr<base::ListValue> AutomaticProfileResetterDelegateImpl:: GetLoadedModuleNameDigests() const { DCHECK(modules_have_been_enumerated_event_.is_signaled()); - scoped_ptr<base::ListValue> result(new base::ListValue); + std::set<std::string> module_name_digests; #if defined(OS_WIN) if (module_list_) - ExtractLoadedModuleNameDigests(*module_list_, result.get()); + ExtractLoadedModuleNameDigests(*module_list_, &module_name_digests); #endif + scoped_ptr<base::ListValue> result(new base::ListValue); + for (std::set<std::string>::const_iterator it = module_name_digests.begin(); + it != module_name_digests.end(); ++it) + result->AppendString(*it); return result.Pass(); } diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 4386064..17e3b3f 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -902,21 +902,8 @@ 'browser/infobars/insecure_content_infobar_delegate.h', 'browser/infobars/simple_alert_infobar_delegate.cc', 'browser/infobars/simple_alert_infobar_delegate.h', - 'browser/install_verification/win/imported_module_verification.cc', - 'browser/install_verification/win/imported_module_verification.h', - 'browser/install_verification/win/install_verification.cc', - 'browser/install_verification/win/install_verification.h', - 'browser/install_verification/win/loaded_module_verification.cc', - 'browser/install_verification/win/loaded_module_verification.h', - 'browser/install_verification/win/loaded_modules_snapshot.cc', - 'browser/install_verification/win/loaded_modules_snapshot.h', - 'browser/install_verification/win/module_ids.cc', - 'browser/install_verification/win/module_ids.h', - 'browser/install_verification/win/module_info.h', - 'browser/install_verification/win/module_list.cc', - 'browser/install_verification/win/module_list.h', - 'browser/install_verification/win/module_verification_common.cc', - 'browser/install_verification/win/module_verification_common.h', + 'browser/install_module_verifier_win.cc', + 'browser/install_module_verifier_win.h', 'browser/internal_auth.cc', 'browser/internal_auth.h', 'browser/intranet_redirect_detector.cc', diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi index 77e7699..4e53a4d 100644 --- a/chrome/chrome_tests_unit.gypi +++ b/chrome/chrome_tests_unit.gypi @@ -971,14 +971,7 @@ 'browser/importer/firefox_profile_lock_unittest.cc', 'browser/importer/profile_writer_unittest.cc', 'browser/internal_auth_unittest.cc', - 'browser/install_verification/win/imported_module_verification_unittest.cc', - 'browser/install_verification/win/loaded_module_verification_unittest.cc', - 'browser/install_verification/win/loaded_modules_snapshot_unittest.cc', - 'browser/install_verification/win/module_ids_unittest.cc', - 'browser/install_verification/win/module_info_unittest.cc', - 'browser/install_verification/win/module_list_unittest.cc', - 'browser/install_verification/win/module_verification_test.cc', - 'browser/install_verification/win/module_verification_test.h', + 'browser/install_module_verifier_unittest_win.cc', 'browser/invalidation/invalidation_service_android_unittest.cc', 'browser/invalidation/invalidation_service_test_template.cc', 'browser/invalidation/invalidation_service_test_template.h', |