OLD | NEW |
1 // Copyright (c) 2010 Google Inc. | 1 // Copyright (c) 2010 Google Inc. |
2 // All rights reserved. | 2 // All rights reserved. |
3 // | 3 // |
4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
6 // met: | 6 // met: |
7 // | 7 // |
8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
(...skipping 26 matching lines...) Expand all Loading... |
37 #include <vector> | 37 #include <vector> |
38 | 38 |
39 #include "processor/exploitability_win.h" | 39 #include "processor/exploitability_win.h" |
40 | 40 |
41 #include "common/scoped_ptr.h" | 41 #include "common/scoped_ptr.h" |
42 #include "google_breakpad/common/minidump_exception_win32.h" | 42 #include "google_breakpad/common/minidump_exception_win32.h" |
43 #include "google_breakpad/processor/minidump.h" | 43 #include "google_breakpad/processor/minidump.h" |
44 #include "processor/disassembler_x86.h" | 44 #include "processor/disassembler_x86.h" |
45 #include "processor/logging.h" | 45 #include "processor/logging.h" |
46 | 46 |
47 #include "third_party/libdisasm/libdis.h" | 47 //#include "third_party/libdisasm/libdis.h" |
48 | 48 |
49 namespace google_breakpad { | 49 namespace google_breakpad { |
50 | 50 |
51 // The cutoff that we use to judge if and address is likely an offset | 51 // The cutoff that we use to judge if and address is likely an offset |
52 // from various interesting addresses. | 52 // from various interesting addresses. |
53 static const uint64_t kProbableNullOffset = 4096; | 53 static const uint64_t kProbableNullOffset = 4096; |
54 static const uint64_t kProbableStackOffset = 8192; | 54 static const uint64_t kProbableStackOffset = 8192; |
55 | 55 |
56 // The various cutoffs for the different ratings. | 56 // The various cutoffs for the different ratings. |
57 static const size_t kHighCutoff = 100; | 57 static const size_t kHighCutoff = 100; |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
217 available_memory, | 217 available_memory, |
218 instruction_ptr); | 218 instruction_ptr); |
219 disassembler.NextInstruction(); | 219 disassembler.NextInstruction(); |
220 if (bad_read) | 220 if (bad_read) |
221 disassembler.setBadRead(); | 221 disassembler.setBadRead(); |
222 else | 222 else |
223 disassembler.setBadWrite(); | 223 disassembler.setBadWrite(); |
224 if (disassembler.currentInstructionValid()) { | 224 if (disassembler.currentInstructionValid()) { |
225 // Check if the faulting instruction falls into one of | 225 // Check if the faulting instruction falls into one of |
226 // several interesting groups. | 226 // several interesting groups. |
227 switch (disassembler.currentInstructionGroup()) { | 227 if (disassembler.currentInstructionIsGroup(X86_GRP_JUMP) || |
228 case libdis::insn_controlflow: | 228 disassembler.currentInstructionIsGroup(X86_GRP_CALL)) { |
229 exploitability_weight += kLargeBump; | 229 exploitability_weight += kLargeBump; |
230 break; | 230 } else if (disassembler.currentInstructionIsBlockData()) { |
231 case libdis::insn_string: | 231 exploitability_weight += kHugeBump; |
232 exploitability_weight += kHugeBump; | |
233 break; | |
234 default: | |
235 break; | |
236 } | 232 } |
237 // Loop the disassembler through the code and check if it | 233 // Loop the disassembler through the code and check if it |
238 // IDed any interesting conditions in the near future. | 234 // IDed any interesting conditions in the near future. |
239 // Multiple flags may be set so treat each equally. | 235 // Multiple flags may be set so treat each equally. |
240 while (disassembler.NextInstruction() && | 236 while (disassembler.NextInstruction() && |
241 disassembler.currentInstructionValid() && | 237 disassembler.currentInstructionValid() && |
242 !disassembler.endOfBlock()) | 238 !disassembler.endOfBlock()) |
243 continue; | 239 continue; |
244 if (disassembler.flags() & DISX86_BAD_BRANCH_TARGET) | 240 if (disassembler.flags() & DISX86_BAD_BRANCH_TARGET) |
245 exploitability_weight += kLargeBump; | 241 exploitability_weight += kLargeBump; |
(...skipping 28 matching lines...) Expand all Loading... |
274 return EXPLOITABLITY_MEDIUM; | 270 return EXPLOITABLITY_MEDIUM; |
275 if (exploitability_weight >= kLowCutoff) | 271 if (exploitability_weight >= kLowCutoff) |
276 return EXPLOITABILITY_LOW; | 272 return EXPLOITABILITY_LOW; |
277 if (exploitability_weight >= kInterestingCutoff) | 273 if (exploitability_weight >= kInterestingCutoff) |
278 return EXPLOITABILITY_INTERESTING; | 274 return EXPLOITABILITY_INTERESTING; |
279 | 275 |
280 return EXPLOITABILITY_NONE; | 276 return EXPLOITABILITY_NONE; |
281 } | 277 } |
282 | 278 |
283 } // namespace google_breakpad | 279 } // namespace google_breakpad |
OLD | NEW |