| Index: chrome/browser/safe_browsing/module_integrity_verifier_unittest.cc
|
| diff --git a/chrome/browser/safe_browsing/module_integrity_verifier_unittest.cc b/chrome/browser/safe_browsing/module_integrity_verifier_unittest.cc
|
| index 479cdba16ebd5b4b0297284c11059d13edd8bf14..b8774db2bcf1705f919b84f6d63ba928add44488 100644
|
| --- a/chrome/browser/safe_browsing/module_integrity_verifier_unittest.cc
|
| +++ b/chrome/browser/safe_browsing/module_integrity_verifier_unittest.cc
|
| @@ -15,6 +15,7 @@
|
| namespace safe_browsing {
|
|
|
| const wchar_t kTestDllName[] = L"verifier_test_dll.dll";
|
| +const char kTestExportName[] = "DummyExport";
|
|
|
| class SafeBrowsingModuleVerifierTest : public testing::Test {
|
| protected:
|
| @@ -67,50 +68,51 @@ class SafeBrowsingModuleVerifierTest : public testing::Test {
|
| reinterpret_cast<HMODULE>(const_cast<uint8*>(disk_dll_handle_.data()));
|
| }
|
|
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(SafeBrowsingModuleVerifierTest);
|
| -};
|
| -
|
| -TEST_F(SafeBrowsingModuleVerifierTest, CountBytesDiffInPtr) {
|
| - // Construct test pointers and try with CountBytesDiffInPtr.
|
| - // The first Bytes differ.
|
| - uintptr_t num_a = 0xFF;
|
| - uintptr_t num_b = 0x00;
|
| -
|
| - // Any inbetween Bytes are identical.
|
| - int num_bytes_to_add = sizeof(num_a) - 2;
|
| - for (int i = 0; i < num_bytes_to_add; ++i) {
|
| - num_a <<= 8;
|
| - num_b <<= 8;
|
| - num_a += 0xFF;
|
| - num_b += 0xFF;
|
| - }
|
| -
|
| - // The last Bytes differ.
|
| - num_a <<= 8;
|
| - num_b <<= 8;
|
| - num_a += 0x0F;
|
| - num_b += 0xFF;
|
| -
|
| - EXPECT_EQ(2, CountBytesDiffInPtr(num_a, num_b));
|
| - EXPECT_EQ(2, CountBytesDiffInPtr(num_b, num_a));
|
| - EXPECT_EQ(0, CountBytesDiffInPtr(num_a, num_a));
|
| + void EditExport(const char* export_name) {
|
| + HMODULE mem_handle;
|
| + GetMemModuleHandle(&mem_handle);
|
| + uint8_t* export_addr =
|
| + reinterpret_cast<uint8_t*>(GetProcAddress(mem_handle, export_name));
|
| + EXPECT_TRUE(NULL != export_addr);
|
| +
|
| + export_addr = export_addr;
|
| +
|
| + // Edit the first byte of the function.
|
| + uint8_t new_val = (*export_addr) + 1;
|
| + SIZE_T bytes_written = 0;
|
| + WriteProcessMemory(GetCurrentProcess(),
|
| + export_addr,
|
| + reinterpret_cast<void*>(&new_val),
|
| + 1,
|
| + &bytes_written);
|
| + EXPECT_EQ(1, bytes_written);
|
| }
|
|
|
| +private:
|
| +DISALLOW_COPY_AND_ASSIGN(SafeBrowsingModuleVerifierTest);
|
| +};
|
| +
|
| TEST_F(SafeBrowsingModuleVerifierTest, VerifyModuleUnmodified) {
|
| + std::set<std::string> modified_exports;
|
| // Call VerifyModule before the module has been loaded, should fail.
|
| - EXPECT_EQ(MODULE_STATE_UNKNOWN, VerifyModule(kTestDllName));
|
| + EXPECT_EQ(MODULE_STATE_UNKNOWN,
|
| + VerifyModule(kTestDllName, &modified_exports));
|
| + EXPECT_EQ(0, modified_exports.size());
|
|
|
| // On loading, the module should be identical (up to relocations) in memory as
|
| // on disk.
|
| SetUpTestDllAndPEImages();
|
| - EXPECT_EQ(MODULE_STATE_UNMODIFIED, VerifyModule(kTestDllName));
|
| + EXPECT_EQ(MODULE_STATE_UNMODIFIED,
|
| + VerifyModule(kTestDllName, &modified_exports));
|
| + EXPECT_EQ(0, modified_exports.size());
|
| }
|
|
|
| TEST_F(SafeBrowsingModuleVerifierTest, VerifyModuleModified) {
|
| + std::set<std::string> modified_exports;
|
| // Confirm the module is identical in memory as on disk before we begin.
|
| SetUpTestDllAndPEImages();
|
| - EXPECT_EQ(MODULE_STATE_UNMODIFIED, VerifyModule(kTestDllName));
|
| + EXPECT_EQ(MODULE_STATE_UNMODIFIED,
|
| + VerifyModule(kTestDllName, &modified_exports));
|
|
|
| uint8_t* mem_code_addr = NULL;
|
| uint8_t* disk_code_addr = NULL;
|
| @@ -132,7 +134,22 @@ TEST_F(SafeBrowsingModuleVerifierTest, VerifyModuleModified) {
|
| EXPECT_EQ(1, bytes_written);
|
|
|
| // VerifyModule should detect the change.
|
| - EXPECT_EQ(MODULE_STATE_MODIFIED, VerifyModule(kTestDllName));
|
| + EXPECT_EQ(MODULE_STATE_MODIFIED,
|
| + VerifyModule(kTestDllName, &modified_exports));
|
| +}
|
| +
|
| +TEST_F(SafeBrowsingModuleVerifierTest, VerifyModuleExportModified) {
|
| + std::set<std::string> modified_exports;
|
| + // Confirm the module is identical in memory as on disk before we begin.
|
| + SetUpTestDllAndPEImages();
|
| + EXPECT_EQ(MODULE_STATE_UNMODIFIED,
|
| + VerifyModule(kTestDllName, &modified_exports));
|
| + modified_exports.clear();
|
| +
|
| + EditExport(kTestExportName);
|
| + EXPECT_EQ(MODULE_STATE_MODIFIED,
|
| + VerifyModule(kTestDllName, &modified_exports));
|
| + EXPECT_EQ(1, modified_exports.size());
|
| }
|
|
|
| } // namespace safe_browsing
|
|
|