plympton 1.1.0 → 1.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +0 -1
- data/README.md +9 -0
- data/VERSION +1 -1
- data/bin/func-auto.py +5 -2
- data/lib/plympton/disassembly.rb +24 -1
- data/lib/plympton/object.rb +1 -1
- data/plympton.gemspec +3 -6
- data/spec/plympton_spec.rb +15 -15
- metadata +2 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aef250c09540302f8fbd9f4b99314e2814a7498e
|
4
|
+
data.tar.gz: a98d40ec8e34936fc41ea248fd7ef90c4db03be0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d4503adfd993f6bbc19b8667fb0a2468201abb7fcbf15eb4a8edfe1c5e484f67a179f50da0ff347eeb273e3c9e00dc8a5840f8dad25f5aef6b7b78febeda3e46
|
7
|
+
data.tar.gz: 5a84bf8c76b7b7a8698b74f1bcd91c3556359e3bbb1fbecbadf741c8bb125fcb5fdc2f85563b1d813619b246a4d5af56062785c360438f1390d79b3110354e35
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -7,6 +7,15 @@ A gem to read program disassembly from a YAML dump. The YAML dump is generated
|
|
7
7
|
[![Coverage Status](https://coveralls.io/repos/rogwfu/plympton/badge.png)](https://coveralls.io/r/rogwfu/plympton)
|
8
8
|
[![Dependency Status](https://www.versioneye.com/user/projects/543603aab2a9c5dd3d000092/badge.svg?style=flat)](https://www.versioneye.com/user/projects/543603aab2a9c5dd3d000092)
|
9
9
|
|
10
|
+
## Dependencies
|
11
|
+
|
12
|
+
The IDA Python auto analysis script requires YAML for serializing program information. To install:
|
13
|
+
|
14
|
+
### Mac OS X
|
15
|
+
```bash
|
16
|
+
sudo /usr/bin/easy_install-2.6 pyyaml
|
17
|
+
```
|
18
|
+
|
10
19
|
## Contributing to plympton
|
11
20
|
|
12
21
|
* Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.1.
|
1
|
+
1.1.1
|
data/bin/func-auto.py
CHANGED
@@ -413,8 +413,11 @@ yamlFilename = os.environ['PWD'] + "/" + GetInputFile() + ".fz"
|
|
413
413
|
# Open the file
|
414
414
|
yamlFile = open(yamlFilename, 'w')
|
415
415
|
|
416
|
-
# Get the start and end of the text section
|
417
|
-
textSegmentSelector = SegByName("
|
416
|
+
# Get the start and end of the text section (__text Mac, .text Linux)
|
417
|
+
textSegmentSelector = SegByName(".text")
|
418
|
+
if textSegmentSelector == BADADDR:
|
419
|
+
textSegmentSelector = SegByName("__text")
|
420
|
+
|
418
421
|
textSegmentStart = SegByBase(textSegmentSelector)
|
419
422
|
textSegmentEnd = SegEnd(textSegmentStart)
|
420
423
|
|
data/lib/plympton/disassembly.rb
CHANGED
@@ -40,6 +40,29 @@ module Plympton
|
|
40
40
|
return(result)
|
41
41
|
end
|
42
42
|
|
43
|
+
# Function to process hit tracing recorded by lldb
|
44
|
+
# @param [String] Path to a lldb trace file
|
45
|
+
def lldb_coverage(lldbTrace)
|
46
|
+
# Open the valgrind xml trace file
|
47
|
+
xmlFile = File.open(lldbTrace, "r")
|
48
|
+
xmlDoc = Nokogiri::XML(xmlFile)
|
49
|
+
|
50
|
+
# Delete any previous hit traces
|
51
|
+
@attributes.functionHitTrace.clear()
|
52
|
+
|
53
|
+
# Parse all the function hits
|
54
|
+
xmlDoc.xpath("//hit").each do |hit|
|
55
|
+
functionOffset = hit.search("offset").first().inner_text()
|
56
|
+
functionHits = hit.search("count").first().inner_text()
|
57
|
+
@attributes.functionHitTrace[functionOffset] = [functionHits.to_i()]
|
58
|
+
end
|
59
|
+
|
60
|
+
# FIXME: Add code to handle the markov matrix
|
61
|
+
|
62
|
+
# Cleanup open file
|
63
|
+
xmlFile.close()
|
64
|
+
end
|
65
|
+
|
43
66
|
# Function to process hit tracing recorded by Valgrind tools (rufus and callgrind)
|
44
67
|
# @param [String] Path to a valgrind trace file
|
45
68
|
def valgrind_coverage(valgrindTrace)
|
@@ -79,7 +102,7 @@ module Plympton
|
|
79
102
|
@attributes.functionHash[functionOffset].numTransitions += BigDecimal("#{numberOfCalls}")
|
80
103
|
|
81
104
|
# Update the transition matrix
|
82
|
-
@attributes.transitionMatrix[@attributes.functionHash[functionOffset].markovIdx, @attributes.functionHash[calleeOffset].markovIdx] = @attributes.transitionMatrix[@attributes.functionHash[functionOffset].markovIdx, @attributes.functionHash[calleeOffset].markovIdx] + BigDecimal("#{numberOfCalls}")
|
105
|
+
# @attributes.transitionMatrix[@attributes.functionHash[functionOffset].markovIdx, @attributes.functionHash[calleeOffset].markovIdx] = @attributes.transitionMatrix[@attributes.functionHash[functionOffset].markovIdx, @attributes.functionHash[calleeOffset].markovIdx] + BigDecimal("#{numberOfCalls}")
|
83
106
|
|
84
107
|
# Keep track of call trace and number of times called
|
85
108
|
@attributes.trace << "#{@attributes.functionHash[functionOffset].markovIdx}:#{@attributes.functionHash[calleeOffset].markovIdx}:#{numberOfCalls}"
|
data/lib/plympton/object.rb
CHANGED
@@ -47,7 +47,7 @@ module Plympton
|
|
47
47
|
# Transition matrix persists across test case runs
|
48
48
|
# dimension = @functionHash.size() + 1
|
49
49
|
dimension = @functionHash.size()
|
50
|
-
@transitionMatrix = NMatrix.object(dimension, dimension).fill!(BigDecimal("0"))
|
50
|
+
# @transitionMatrix = NMatrix.object(dimension, dimension).fill!(BigDecimal("0"))
|
51
51
|
|
52
52
|
# Allocate a trace for Markov chains
|
53
53
|
@trace = Array.new()
|
data/plympton.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: plympton 1.1.
|
5
|
+
# stub: plympton 1.1.1 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "plympton"
|
9
|
-
s.version = "1.1.
|
9
|
+
s.version = "1.1.1"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Roger Seagle"]
|
14
|
-
s.date = "2014-
|
14
|
+
s.date = "2014-11-17"
|
15
15
|
s.description = "A Gem to read program disassembly from a YAML dump. The YAML dump is generated from an ida pro python script. This script is included along with this Gem (func.py)"
|
16
16
|
s.email = "roger.seagle@gmail.com"
|
17
17
|
s.executables = ["func-auto.py", "func.py", "func.py.new", "idascript.py"]
|
@@ -66,7 +66,6 @@ Gem::Specification.new do |s|
|
|
66
66
|
s.add_runtime_dependency(%q<nokogiri>, ["~> 1.6"])
|
67
67
|
s.add_runtime_dependency(%q<antlr3>, ["~> 1.10"])
|
68
68
|
s.add_runtime_dependency(%q<narray>, ["~> 0.6"])
|
69
|
-
s.add_runtime_dependency(%q<coveralls>, [">= 0"])
|
70
69
|
s.add_development_dependency(%q<jeweler>, ["~> 2.0"])
|
71
70
|
s.add_development_dependency(%q<yard>, ["~> 0.8"])
|
72
71
|
s.add_development_dependency(%q<rspec>, ["~> 3.1"])
|
@@ -75,7 +74,6 @@ Gem::Specification.new do |s|
|
|
75
74
|
s.add_dependency(%q<nokogiri>, ["~> 1.6"])
|
76
75
|
s.add_dependency(%q<antlr3>, ["~> 1.10"])
|
77
76
|
s.add_dependency(%q<narray>, ["~> 0.6"])
|
78
|
-
s.add_dependency(%q<coveralls>, [">= 0"])
|
79
77
|
s.add_dependency(%q<jeweler>, ["~> 2.0"])
|
80
78
|
s.add_dependency(%q<yard>, ["~> 0.8"])
|
81
79
|
s.add_dependency(%q<rspec>, ["~> 3.1"])
|
@@ -85,7 +83,6 @@ Gem::Specification.new do |s|
|
|
85
83
|
s.add_dependency(%q<nokogiri>, ["~> 1.6"])
|
86
84
|
s.add_dependency(%q<antlr3>, ["~> 1.10"])
|
87
85
|
s.add_dependency(%q<narray>, ["~> 0.6"])
|
88
|
-
s.add_dependency(%q<coveralls>, [">= 0"])
|
89
86
|
s.add_dependency(%q<jeweler>, ["~> 2.0"])
|
90
87
|
s.add_dependency(%q<yard>, ["~> 0.8"])
|
91
88
|
s.add_dependency(%q<rspec>, ["~> 3.1"])
|
data/spec/plympton_spec.rb
CHANGED
@@ -202,19 +202,19 @@ describe "PlymptonRefactor" do
|
|
202
202
|
end
|
203
203
|
|
204
204
|
# Test probability matrix calculation
|
205
|
-
it "should correctly calculate probability matrix" do
|
206
|
-
@object = Plympton::Disassembly.new(File.expand_path(File.dirname(__FILE__) + "/libFontParser.64.dylib.fz"), "U")
|
207
|
-
@object.valgrind_coverage(File.expand_path(File.dirname(__FILE__) + "/steady-state.64bit.trace.xml"))
|
208
|
-
onePass = @object.evaluate()
|
209
|
-
|
210
|
-
|
211
|
-
@object.initialize_solver("U")
|
212
|
-
@object.valgrind_coverage(File.expand_path(File.dirname(__FILE__) + "/steady-state.64bit.trace.xml"))
|
213
|
-
@object.attributes.trace.clear() # Simulate two independent traces
|
214
|
-
@object.valgrind_coverage(File.expand_path(File.dirname(__FILE__) + "/steady-state.64bit.trace.xml"))
|
215
|
-
twoPass = @object.evaluate()
|
216
|
-
|
217
|
-
# Test Function Path Uniqueness
|
218
|
-
onePass.should == twoPass
|
219
|
-
end
|
205
|
+
# it "should correctly calculate probability matrix" do
|
206
|
+
# @object = Plympton::Disassembly.new(File.expand_path(File.dirname(__FILE__) + "/libFontParser.64.dylib.fz"), "U")
|
207
|
+
# @object.valgrind_coverage(File.expand_path(File.dirname(__FILE__) + "/steady-state.64bit.trace.xml"))
|
208
|
+
# onePass = @object.evaluate()
|
209
|
+
## onePass.should == BigDecimal("0.000026097275191916865333298250824189")
|
210
|
+
#
|
211
|
+
# @object.initialize_solver("U")
|
212
|
+
# @object.valgrind_coverage(File.expand_path(File.dirname(__FILE__) + "/steady-state.64bit.trace.xml"))
|
213
|
+
# @object.attributes.trace.clear() # Simulate two independent traces
|
214
|
+
# @object.valgrind_coverage(File.expand_path(File.dirname(__FILE__) + "/steady-state.64bit.trace.xml"))
|
215
|
+
# twoPass = @object.evaluate()
|
216
|
+
#
|
217
|
+
# # Test Function Path Uniqueness
|
218
|
+
# onePass.should == twoPass
|
219
|
+
# end
|
220
220
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: plympton
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roger Seagle
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-11-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -52,20 +52,6 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0.6'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: coveralls
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :runtime
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: jeweler
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|