A ¡Novel ¡Obfusca/on: ¡ Class ¡Hierarchy ¡Fla9ening ¡ Christophe ¡Foket, ¡Bjorn ¡De ¡Su9er, ¡ ¡ Bart ¡Coppens ¡& ¡Koen ¡De ¡Bosschere ¡ ¡ Computer ¡Systems ¡Lab ¡ Ghent ¡University, ¡Belgium ¡ ¡ FPS ¡2012 ¡ October ¡26, ¡2012 ¡
Outline ¡ • Bytecode ¡obfusca/on ¡ • Class ¡hierarchy ¡fla9ening ¡ • Evalua/on ¡ • Conclusions ¡ 2 ¡
Bytecode ¡is ¡vulnerable ¡ Binary ¡soQware ¡ 3 ¡
Bytecode ¡is ¡vulnerable ¡ Bytecode ¡soQware ¡ Binary ¡soQware ¡ 4 ¡
Bytecode ¡obfusca/on ¡ Bytecode ¡soQware ¡ Goal ¡ Goal ¡ an/-‑reverse ¡ an/-‑code ¡liQing ¡ engineering ¡ an/-‑code ¡injec/on ¡ 5 ¡
Bytecode ¡obfusca/on ¡ Bytecode ¡soQware ¡ Goal ¡ Goal ¡ an/-‑reverse ¡ an/-‑code ¡liQing ¡ engineering ¡ an/-‑code ¡injec/on ¡ remove ¡inheritance ¡ rela/ons ¡between ¡classes ¡ 6 ¡
Class ¡hierarchy ¡fla9ening ¡ Example ¡ class ¡Main ¡{ ¡ ¡ ¡void ¡main(){ ¡ ¡ ¡ ¡ ¡ShapeWindow ¡w ¡= ¡new ¡ShapeWindow(…); ¡ ¡ ¡ ¡ ¡Circle ¡c ¡= ¡new ¡Circle(…); ¡ ¡ ¡ ¡ ¡Rectangle ¡r ¡= ¡new ¡Rectangle(…); ¡ ¡ ¡ ¡ ¡w.<ShapeWindow:add>(c); ¡ ¡ ¡ ¡ ¡w.<ShapeWindow:add>(r); ¡ ¡ ¡ ¡ ¡w.<ShapeWindow:paint>(); ¡ ¡ ¡ ¡ ¡c.<Circle:draw>(); ¡ ¡ ¡ ¡ ¡r.<Rectangle:draw>(); ¡ ¡ ¡} ¡ } ¡ 7 ¡
Class ¡hierarchy ¡fla9ening ¡ Example ¡ class ¡Main ¡{ ¡ ¡ ¡void ¡main(){ ¡ ¡ ¡ ¡ ¡ Common ¡w ¡= ¡new ¡ShapeWindow(…); ¡ ¡ ¡ ¡ ¡ Common ¡c ¡= ¡new ¡Circle(…); ¡ ¡ ¡ ¡ ¡ Common ¡r ¡= ¡new ¡Rectangle(…); ¡ ¡ ¡ ¡ ¡w.< Common :add>(c); ¡ ¡ ¡ ¡ ¡w.< Common :add>(r); ¡ ¡ ¡ ¡ ¡w.< Common :paint>(); ¡ ¡ ¡ ¡ ¡c.< Common :draw>(); ¡ ¡ ¡ ¡ ¡r.< Common :draw>(); ¡ ¡ ¡} ¡ } ¡ 8 ¡
Class ¡hierarchy ¡fla9ening ¡ Step ¡1: ¡subtree ¡selec/on ¡ class ¡Main ¡{ ¡ ¡ ¡void ¡main(){ ¡ ¡ ¡ ¡ ¡ShapeWindow ¡w ¡= ¡new ¡ShapeWindow(…); ¡ ¡ ¡ ¡ ¡Circle ¡c ¡= ¡new ¡Circle(…); ¡ ¡ ¡ ¡ ¡Rectangle ¡r ¡= ¡new ¡Rectangle(…); ¡ ¡ ¡ ¡ ¡w.<ShapeWindow:add>(c); ¡ ¡ ¡ ¡ ¡w.<ShapeWindow:add>(r); ¡ ¡ ¡ ¡ ¡w.<ShapeWindow:paint>(); ¡ ¡ ¡ ¡ ¡c.<Circle:draw>(); ¡ ¡ ¡ ¡ ¡r.<Rectangle:draw>(); ¡ ¡ ¡} ¡ } ¡ 9 ¡
Class ¡hierarchy ¡fla9ening ¡ Step ¡2: ¡interface ¡inser/on ¡ • one ¡interface ¡per ¡subtree ¡ • acts ¡as ¡a ¡common ¡super ¡type ¡ • declares ¡all ¡instance ¡methods ¡ ¡ declared ¡in ¡all ¡classes ¡of ¡the ¡ ¡ subtree ¡ ¡ 10 ¡
Class ¡hierarchy ¡fla9ening ¡ Step ¡3: ¡subtree ¡type ¡abstrac/on ¡ class ¡Main ¡implements ¡Common3 ¡{ ¡ ¡ ¡void ¡main(){ ¡ ¡ ¡ ¡ ¡ShapeWindow ¡w ¡= ¡new ¡ShapeWindow(…); ¡ ¡ ¡ ¡ ¡Circle ¡c ¡= ¡new ¡Circle(…); ¡ ¡ ¡ ¡ ¡Rectangle ¡r ¡= ¡new ¡Rectangle(…); ¡ ¡ ¡ ¡ ¡w.<ShapeWindow:add>(c); ¡ ¡ ¡ ¡ ¡w.<ShapeWindow:add>(r); ¡ ¡ ¡ ¡ ¡w.<ShapeWindow:paint>(); ¡ ¡ ¡ ¡ ¡c.<Circle:draw>(); ¡ ¡ ¡ ¡ ¡r.<Rectangle:draw>(); ¡ ¡ ¡} ¡ } ¡ 11 ¡
Class ¡hierarchy ¡fla9ening ¡ Step ¡3: ¡subtree ¡type ¡abstrac/on ¡ class ¡Main ¡implements ¡Common3 ¡{ ¡ ¡ ¡void ¡main(){ ¡ ¡ ¡ ¡ ¡Common2 ¡w ¡= ¡new ¡ShapeWindow(…); ¡ ¡ ¡ ¡ ¡Common1 ¡c ¡= ¡new ¡Circle(…); ¡ ¡ ¡ ¡ ¡Common1 ¡r ¡= ¡new ¡Rectangle(…); ¡ ¡ ¡ ¡ ¡w.< Common2 :add>(c); ¡ ¡ ¡ ¡ ¡w.< Common2 :add>(r); ¡ ¡ ¡ ¡ ¡w.< Common2 :paint>(); ¡ ¡ ¡ ¡ ¡c.< Common1 :draw>(); ¡ ¡ ¡ ¡ ¡r.< Common1 :draw>(); ¡ ¡ ¡} ¡ } ¡ 12 ¡
Class ¡hierarchy ¡fla9ening ¡ Step ¡4: ¡subtree ¡fla9ening ¡ • recursively ¡traverse ¡each ¡subtree ¡ • copy ¡to ¡each ¡direct ¡subclass ¡ – instance ¡fields ¡ – instance ¡methods ¡ – implemented ¡interfaces ¡ • update ¡super ¡calls ¡ • update ¡field ¡accesses ¡ • move ¡up ¡subclass ¡ in ¡the ¡hierarchy ¡ • add ¡dummy ¡ ¡ methods ¡ ¡ 13 ¡
Class ¡hierarchy ¡fla9ening ¡ Step ¡5: ¡interface ¡merging ¡ class ¡Main ¡implements ¡Common3 ¡{ ¡ class ¡Main ¡implements ¡Common3 ¡{ ¡ ¡ ¡void ¡main(){ ¡ ¡ ¡void ¡main(){ ¡ ¡ ¡ ¡ ¡Common2 ¡w ¡= ¡new ¡ShapeWindow(…); ¡// ¡w ¡can ¡hold ¡objects ¡of ¡2 ¡types ¡ ¡ ¡ ¡ ¡Common2 ¡w ¡= ¡new ¡ShapeWindow(…); ¡ ¡ ¡ ¡ ¡Common1 ¡c ¡= ¡new ¡Circle(…); ¡ ¡ ¡ ¡ ¡ ¡// ¡c ¡can ¡hold ¡objects ¡of ¡3 ¡types ¡ ¡ ¡ ¡ ¡Common1 ¡c ¡= ¡new ¡Circle(…); ¡ ¡ ¡ ¡ ¡Common1 ¡r ¡= ¡new ¡Rectangle(…); ¡ ¡ ¡// ¡r ¡can ¡hold ¡objects ¡of ¡3 ¡types ¡ ¡ ¡ ¡ ¡Common1 ¡r ¡= ¡new ¡Rectangle(…); ¡ ¡ ¡ ¡ ¡w.< Common2 :add>(c); ¡ ¡ ¡ ¡ ¡w.< Common2 :add>(c); ¡ ¡ ¡ ¡ ¡w.< Common2 :add>(r); ¡ ¡ ¡ ¡ ¡w.< Common2 :add>(r); ¡ ¡ ¡ ¡ ¡w.< Common2 :paint>(); ¡ ¡ ¡ ¡ ¡w.< Common2 :paint>(); ¡ ¡ ¡ ¡ ¡c.< Common1 :draw>(); ¡ ¡ ¡ ¡ ¡c.< Common1 :draw>(); ¡ ¡ ¡ ¡ ¡r.< Common1 :draw>(); ¡ ¡ ¡ ¡ ¡r.< Common1 :draw>(); ¡ ¡ ¡} ¡ ¡ ¡} ¡ } ¡ } ¡ 14 ¡
Class ¡hierarchy ¡fla9ening ¡ Step ¡5: ¡interface ¡merging ¡ class ¡Main ¡implements ¡Common ¡{ ¡ ¡ ¡void ¡main(){ ¡ ¡ ¡ ¡ ¡Common ¡w ¡= ¡new ¡ShapeWindow(…); ¡// ¡w ¡can ¡hold ¡objects ¡of ¡ 6 ¡types ¡ ¡ ¡ ¡ ¡Common ¡c ¡= ¡new ¡Circle(…); ¡ ¡ ¡ ¡ ¡ ¡// ¡c ¡can ¡hold ¡objects ¡of ¡ 6 ¡types ¡ ¡ ¡ ¡ ¡Common ¡r ¡= ¡new ¡Rectangle(…); ¡ ¡ ¡// ¡r ¡can ¡hold ¡objects ¡of ¡ 6 ¡types ¡ ¡ ¡ ¡ ¡w.< Common :add>(c); ¡ ¡ ¡ ¡ ¡w.< Common :add>(r); ¡ ¡ ¡ ¡ ¡w.< Common :paint>(); ¡ ¡ ¡ ¡ ¡c.< Common :draw>(); ¡ ¡ ¡ ¡ ¡r.< Common :draw>(); ¡ ¡ ¡} ¡ } ¡ 16 ¡dummy ¡methods ¡ 15 ¡
Class ¡hierarchy ¡fla9ening ¡ Step ¡5: ¡interface ¡merging ¡ class ¡Main ¡implements ¡Common3 ¡{ ¡ ¡ ¡void ¡main(){ ¡ ¡ ¡ ¡ ¡Common2 ¡w ¡= ¡new ¡ShapeWindow(…); ¡// ¡w ¡can ¡hold ¡objects ¡of ¡2 ¡types ¡ ¡ ¡ ¡ ¡Common1 ¡c ¡= ¡new ¡Circle(…); ¡ ¡ ¡ ¡ ¡ ¡// ¡c ¡can ¡hold ¡objects ¡of ¡3 ¡types ¡ ¡ ¡ ¡ ¡Common1 ¡r ¡= ¡new ¡Rectangle(…); ¡ ¡ ¡// ¡r ¡can ¡hold ¡objects ¡of ¡3 ¡types ¡ ¡ ¡ ¡ ¡w.< Common2 :add>(c); ¡ ¡ ¡ ¡ ¡w.< Common2 :add>(r); ¡ ¡ ¡ ¡ ¡w.< Common2 :paint>(); ¡ ¡ ¡ ¡ ¡c.< Common1 :draw>(); ¡ ¡ ¡ ¡ ¡r.< Common1 :draw>(); ¡ ¡ ¡} ¡ } ¡ 16 ¡
Class ¡hierarchy ¡fla9ening ¡ Step ¡5: ¡interface ¡merging ¡ class ¡Main ¡implements ¡Common2 ¡{ ¡ ¡ ¡void ¡main(){ ¡ ¡ ¡ ¡ ¡Common2 ¡w ¡= ¡new ¡ShapeWindow(…); ¡// ¡w ¡can ¡hold ¡objects ¡of ¡ 3 ¡types ¡ ¡ ¡ ¡ ¡Common1 ¡c ¡= ¡new ¡Circle(…); ¡ ¡ ¡ ¡ ¡ ¡// ¡c ¡can ¡hold ¡objects ¡of ¡ 3 ¡types ¡ ¡ ¡ ¡ ¡Common1 ¡r ¡= ¡new ¡Rectangle(…); ¡ ¡ ¡// ¡r ¡can ¡hold ¡objects ¡of ¡ 3 ¡types ¡ ¡ ¡ ¡ ¡w.< Common2 :add>(c); ¡ ¡ ¡ ¡ ¡w.< Common2 :add>(r); ¡ ¡ ¡ ¡ ¡w.< Common2 :paint>(); ¡ ¡ ¡ ¡ ¡c.< Common1 :draw>(); ¡ ¡ ¡ ¡ ¡r.< Common1 :draw>(); ¡ ¡ ¡} ¡ } ¡ 5 ¡dummy ¡methods ¡ 17 ¡
Outline ¡ • Bytecode ¡obfusca/on ¡ • Class ¡hierarchy ¡fla9ening ¡ • Evalua/on ¡ • Conclusions ¡ 18 ¡
Recommend
More recommend