crokus 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cc241276f39be6875db2caf5b00a5a4922906163c97bbe183d0e05dd697162c1
4
- data.tar.gz: 1491b17c9072e7c1c52a7dc136b3a604444a36ff39548754eb3ca87654e20b6a
3
+ metadata.gz: 7712eb73a1d5f62f9b9b7a63eae496dbd67a346b5a17b56b4e31d60fd9deee3d
4
+ data.tar.gz: fed83c851d88bc36a18bd060883644be97ffe4c6cddf7765aedd4a1c37da3add
5
5
  SHA512:
6
- metadata.gz: 6d2f4763cf304256a1a08ab6974535e5c6448e354eeef787389e1c27424c276268a6cf3b702428c68dafbc8b60f260d143f39b52634152ccd0302537989bf073
7
- data.tar.gz: 9b9d32f8346b783b960c8a4ff077b2d01e001833adbfb72e9c7e3d8961428a894be8e55adba1a39eb6b6932b7b55db41c8822cf743cad742f9278d249a250a26
6
+ metadata.gz: c2d3dd5f960229807f20310e10554c69dd65e030c1f36460a78d49662d7abfa91e2f4aa9ac6fc6f6690276372b191c13c475042c2aeaaca23f898f4aaf841676
7
+ data.tar.gz: fb152f1af14c00705fc59940b99a8cf506898a37cfbadfee28eb9b61c3db6bd4b62b43b3622c3c0b77452561d415a82a0c88851ef66b45f79bd2ec776f51d3c4
data/bin/crokus CHANGED
File without changes
@@ -35,6 +35,10 @@ module Crokus
35
35
  def to_s
36
36
  @tok.val
37
37
  end
38
+
39
+ def self.create str
40
+ Ident.new(Token.create(str))
41
+ end
38
42
  end
39
43
 
40
44
  class Include < Ast
@@ -1,13 +1,18 @@
1
1
  module Crokus
2
2
  class Cleaner
3
3
  def clean str_c
4
-
5
- str_c.gsub!(";;",";")
6
4
  str_c.gsub!(";)",")")
7
5
  str_c.gsub!(/\n+\s*\;/,";")
8
6
  str_c.gsub!(/\;\s*\:/,":")
9
- #str_c.gsub!(/\n\s+\{/,"{")
7
+ str_c.gsub!(/\n\s+\{/,"{")
8
+ str_c.gsub!(/\;+/,";")
10
9
  str_c
11
10
  end
11
+
12
+ def debug str_c
13
+ puts "hit a key"
14
+ $stdin.gets.chomp
15
+ puts str_c
16
+ end
12
17
  end
13
18
  end
@@ -36,7 +36,7 @@ module Crokus
36
36
  pretty_print
37
37
 
38
38
  if options[:trojan]
39
- return_code=insert_trojan
39
+ return_code=insert_trojan()
40
40
  return return_code
41
41
  end
42
42
 
@@ -107,7 +107,7 @@ module Crokus
107
107
 
108
108
  def insert_trojan
109
109
  puts "[+] inserting trojan" unless options[:mute]
110
- infected_ast=TrojanInserter.new.insert(ast)
110
+ infected_ast=TrojanInserter.new(@options).insert(ast)
111
111
  if infected_ast
112
112
  code=PrettyPrinter.new.visit(infected_ast)
113
113
  pp_c=@base_name+"_troj.c"
@@ -69,8 +69,14 @@ module Crokus
69
69
  options[:random] = params_filename
70
70
  end
71
71
 
72
- parser.on('--trojan', "generates random c files, using parameters") do
72
+ # optional argument for --trojan
73
+ parser.on('--trojan FUNC', "insert Syracuse Trojan in function FUNC") do |target_func|
74
+ if target_func.end_with?(".c")
75
+ puts "wrong argument for --trojan . It requires a function name as argument."
76
+ abort
77
+ end
73
78
  options[:trojan] = true
79
+ options[:trojan_target_func]=target_func
74
80
  end
75
81
 
76
82
  parser.on("--vv", "verbose") do
@@ -5,6 +5,10 @@ module Crokus
5
5
 
6
6
  class TrojanInserter < Transformer
7
7
 
8
+ def initialize options={}
9
+ @options=options
10
+ end
11
+
8
12
  def insert ast
9
13
  @nb_trojans=0
10
14
  new_ast=transform(ast)
@@ -13,6 +17,12 @@ module Crokus
13
17
  return new_ast
14
18
  else
15
19
  puts " "*1+"|--[?] insertion failed"
20
+ if func=@options[:trojan_target_func] and @target_reached.nil?
21
+ puts " "*5+"|-- no function named '#{func}' found"
22
+ end
23
+ if @failure_reason
24
+ puts " "*5+"|-- #{@failure_reason}"
25
+ end
16
26
  end
17
27
  nil
18
28
  end
@@ -25,11 +35,20 @@ module Crokus
25
35
  end
26
36
 
27
37
  def visitFunction func,args=nil
28
- puts " "*1+"|--[+] func #{func.name}"
29
38
  func_troj=super(func,args)
30
- success=insert_trojan(func_troj)
31
- if success
32
- @nb_trojans+=1
39
+ if @options[:trojan_target_func].nil? or (name=@options[:trojan_target_func] and target_reached=(func.name.to_s==name))
40
+ puts " "*1+"|--[+] func #{func.name}"
41
+ if target_reached
42
+ @target_reached=true
43
+ end
44
+ success=insert_trojan(func_troj)
45
+ if success
46
+ # hannah request : add a _troj to the function :
47
+ func_troj.name=Ident.create(func.name.to_s+'_troj')
48
+ @rename_funcs||={} # take cares of future calls to func !
49
+ @rename_funcs[func.name.to_s]=func_troj.name.to_s
50
+ @nb_trojans+=1
51
+ end
33
52
  end
34
53
  func_troj
35
54
  end
@@ -37,7 +56,7 @@ module Crokus
37
56
  def insert_trojan func
38
57
  if trojan=build_trojan(func)
39
58
  bodies=bodies_collect(func)
40
- puts "\t#bodies = #{bodies.size}"
59
+ #puts "\t#bodies = #{bodies.size}"
41
60
  target_body=bodies.sample
42
61
  stmts=target_body.stmts
43
62
  nb_decls=stmts.select{|stmt| stmt.is_a? Decl}.size
@@ -48,6 +67,18 @@ module Crokus
48
67
  success=false
49
68
  end
50
69
 
70
+ def visitFunCall fcall,args=nil
71
+ name=fcall.name.accept(self)
72
+ if @rename_funcs # propagate func renaming applied during visitFunction
73
+ if @rename_funcs.keys.include?(name.to_s)
74
+ new_name=@rename_funcs[name.to_s]
75
+ name=Ident.create(new_name)
76
+ end
77
+ end
78
+ args=fcall.args.collect{|arg| arg.accept(self)}
79
+ FunCall.new(name,args)
80
+ end
81
+
51
82
  def bodies_collect func
52
83
  bodies=[]
53
84
  bodies << func.body
@@ -86,7 +117,10 @@ module Crokus
86
117
  def build_trojan func
87
118
  trojan=Body.new
88
119
  anchor_var=choose_anchor(func)
89
- return unless anchor_var
120
+ if anchor_var.nil?
121
+ @failure_reason="no int type variable found in function local declarations, needed in the trojan insertion process."
122
+ return
123
+ end
90
124
  u_=Ident.new(Token.create("u_"))
91
125
  v_=Ident.new(Token.create("v_"))
92
126
  i_=Ident.new(Token.create("i_"))
@@ -124,8 +158,13 @@ module Crokus
124
158
  def build_trigger func
125
159
  args=find_int_arg(func)
126
160
  arg_names=get_arg_names(args)
127
- return unless arg_names.size>1
128
- cond=Binary.new(Parenth.new(Binary.new(arg_names[0],AND,arg_names[1])),EQUAL,T42)
161
+ unless arg_names.size>1
162
+ @failure_reason="not enough args of type int in func '#{func.name}' to build a trigger."
163
+ return
164
+ end
165
+ arg1,arg2=arg_names.shuffle[0..1]
166
+ puts " "*5+"|--> trigger variables are : #{arg1},#{arg2}"
167
+ cond=Binary.new(Parenth.new(Binary.new(arg1,AND,arg2)),EQUAL,T42)
129
168
  If.new(cond,nil)
130
169
  end
131
170
 
@@ -1,3 +1,3 @@
1
1
  module Crokus
2
- VERSION="0.1.3"
2
+ VERSION="0.1.5"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: crokus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean-Christophe Le Lann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-12 00:00:00.000000000 Z
11
+ date: 2020-05-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: distribution