diff --git a/slides.typ b/slides.typ index 5a4fa1e..9dea613 100644 --- a/slides.typ +++ b/slides.typ @@ -27,7 +27,7 @@ aspect-ratio : "16-9", title : [From Large Scale Analysis to Dynamic Deobfuscation], subtitle : [The Woes of Android Reverse Engineering], - footer-text : [Jean-Marie Mineau PhD Defense], + footer-text : [Jean-Marie Mineau -- PhD Defense], //short-event : [Rennes, 2025/12/9], title-size : 32pt, section-size : 18pt, @@ -715,15 +715,44 @@ } #slide( - title: [Android ClassLoaders], // TODO CHANGE DRAWING - foreground: rotate(30deg, text(fill: pirat-color.red, size: 50pt)[DESSIN RUNTIME CL \ \ WITH DELEGATION]) -)[ - /* - #set align(center+horizon) - #show figure.caption: none - #scale(60%, reflow: true, get_figure()) - */ -] + title: [Android ClassLoaders], + foreground: { + //rotate(30deg, text(fill: pirat-color.red, size: 50pt)[DESSIN RUNTIME CL \ \ WITH DELEGATION]) + let stroke = black + 3pt + let y0 = 170pt + let y1 = 270pt + let x0 = 250pt + let x1 = 292pt + let x2 = 550pt + let x3 = 600pt + place(bottom+left, line(start: (x0, -y0), end: (x0, -y1), stroke: stroke)) + place(bottom+left, line(start: (x3, -y0), end: (x3, -y1), stroke: stroke)) + arrow((x0, y1), (x1, y1), strk: stroke) + arrow((x3, y1), (x2, y1), strk: stroke) + place-fg(x: x0 - 2.5em, y: (y0+y1)/2)[Delegate] + place-fg(x: x3 + 2.5em, y: (y0+y1)/2)[Delegate] + }, { + set align(center+horizon) + set rect(width: 250pt, height: 75pt, radius: 20pt, inset: 20pt) + + v(1fr) + + rect()[Boot Class Loader] + + v(1fr) + + stack( + dir: ltr, + 1fr, + rect()[System Class Loader], + 1fr, + rect()[APK Class Loader], + 1fr, + ) + + v(1fr) + +}) #slide( title: [MultiDex] @@ -1115,7 +1144,15 @@ #slide( title: [Transformation: Dynamic Code Loading], - foreground: ghost-6(x: 80%, y: 15%, mirror: true) + foreground: { + ghost-6(x: 80%, y: 15%, mirror: true) + align(horizon+center, line(length: 80%, stroke: (thickness: 3pt, dash: (10pt, 5pt)))) + place(horizon+right, dx: -1em)[ + Collected at Runtime + + Patched Application + ] + } )[ // Split schema: observed dyn code loaded / new apk #set align(center+horizon) @@ -1237,6 +1274,11 @@ ] } +#slide( + foreground: rotate(30deg, text(fill: pirat-color.red, size: 50pt)[Overview Dessin]), +)[] + +#counter("logical-slide").update( n => n - 1 ) #slide( title: [Dynamic Analysis], foreground: ghost-1(x: 97%, y: 10%, height: 70pt) @@ -1283,8 +1325,12 @@ // TODO schema!!! +#slide( + foreground: rotate(30deg, text(fill: pirat-color.red, size: 50pt)[Overview Dessin]), +)[] + #for i in range(3) { - if i != 0 { counter("logical-slide").update( n => n - 1 ) } + counter("logical-slide").update( n => n - 1 ) slide( title: [Added Method Calls], @@ -1311,7 +1357,7 @@ ] } -// TODO: Remove? +/* #slide( title: [Toy Example: New Call Graph], foreground: ghost-3(x: 93%, y: 10%) @@ -1325,16 +1371,22 @@ labels: (name) => { move(dy: -7pt, scale(140%, text(size: 10pt, weight: "bold", name))) } ))) ] +*/ #slide( title: [Impact on Finishing Rate], + foreground: { + let strk = 3pt + pirat-color.blue + arrow((360pt, 330pt), (380pt, 310pt), strk: strk) + arrow((420pt, 330pt), (400pt, 310pt), strk: strk) + } )[ #set align(center+horizon) #show figure.caption: none - #scale(90%, reflow: true, get_figure()) - // TODO: Fleche original - // TODO: Fleche theseus - // + + Original #h(2em) Transformed + + #box(width: 80%, get_figure()) ] #slide( @@ -1428,12 +1480,6 @@ * - slide text bof * - Parti 3: plus dure a comprendre * - Expliquer ce qui est fait avant le résultat (surtout parti 3) -* - 'Analysing Applications: Which Tools?': 1 - 2 bof -* plus décrire les papier avec des bullets + limites, *critiquer* -* 1) test pas les outils -* 2) a l'air de dire que ca marche pas, mais pas a l'echelle -* bascullement de which tools? a tester les outils, on est pas sur que les outils fonctionne -* * * slite titre problemenatiques: PB1, PB2 PB3 * diff --git a/slides/icons.typ b/slides/icons.typ new file mode 100644 index 0000000..4c14035 --- /dev/null +++ b/slides/icons.typ @@ -0,0 +1,187 @@ + +#let phone( + width: 200pt, + height: 400pt, + stroke: 3pt+black, + body: [], +) = { + + let h_screen = height*12/15 + let w_screen = width*8/10 + let r = (height/15) + + let h_button = (height - h_screen) / 6 + let w_button = w_screen / 3 + let dy_button = -((height - h_screen) / 2 - h_button) / 2 + + let h-top-line = ((height - h_screen) / 2) / 6 + let w-top-line-bar = w_screen / 2 + let dy-top-line = (((height - h_screen) / 2) - h-top-line) / 3 + + let r-cam = ((height - h_screen) / 2) / 5 + let dx-cam = -r-cam*2 + let dy-cam = ((height - h_screen) / 2 / 2) - r-cam + + let top-line = stack( + dir: ltr, + circle(radius: h-top-line/2, stroke: stroke), + h(h-top-line), + rect( + width: w-top-line-bar, + height: h-top-line, + radius: h-top-line/2, + stroke: stroke, + ), + h(h-top-line), + circle(radius: h-top-line/2, stroke: stroke), + h(h-top-line), + circle(radius: h-top-line/2, stroke: stroke) + ) + + rect( + width: width, + height: height, + inset: 0pt, + stroke: stroke, + radius: r, + { + place(center+horizon, + rect( + width: w_screen, + height: h_screen, + stroke: stroke, + body, + ) + ) + place(center+bottom, + dy: dy_button, + rect( + width: w_button, + height: h_button, + stroke: stroke, + radius: h_screen / 2, + ) + ) + place(center+top, + dy: dy-top-line, + top-line + ) + place(right+top, + dx: dx-cam, + dy: dy-cam, + circle(radius: r-cam, stroke: stroke) + ) + } + ) +} + +#let polar( + x0: 0pt, y0: 0pt, + r: 0pt, + th: 0deg, +) = { + ( + x0 + r * calc.cos(th), + y0 + r * calc.sin(th), + ) +} + +#let gear( + //x0: 0pt, y0: 0pt, + out-rad: 100pt, + in-rad: none, + nb-teeth: 6, + teeth-angle: none, + stroke: black + 3pt, + fill: luma(70%), + fill-center: white, +) = { + let x0 = out-rad + let y0 = out-rad + let teeth-angle = if teeth-angle == none { 360deg / nb-teeth / 2 } else { teeth-angle } + let in-rad = if in-rad == none { out-rad * 0.75 } else { in-rad } + box(width: 2*out-rad, height: 2*out-rad, { + //place(left+bottom, line(start: (0%, -50%), end: (100%, -50%))) + //place(left+bottom, line(start: (50%, 0%), end: (50%, -100%))) + polygon( + stroke: stroke, + fill: fill, + ..for i in range(nb-teeth) { + let angle = i * 360deg / nb-teeth + let center_off = calc.sin(teeth-angle/2) * in-rad + let (x0_1, y0_1) = polar(x0: x0, y0: y0, r: center_off, th: angle - 90deg) + let (x0_2, y0_2) = polar(x0: x0, y0: y0, r: center_off, th: angle + 90deg) + ( + (polar(x0: x0, y0: y0, r: in-rad, th: angle - teeth-angle/2)), + //(polar(x0: x0, y0: y0, r: out-rad, th: angle - teeth-angle/2)), + (polar(x0: x0_1, y0: y0_1, r: out-rad, th: angle)), + (polar(x0: x0_2, y0: y0_2, r: out-rad, th: angle)), + //(polar(x0: x0, y0: y0, r: out-rad, th: angle + teeth-angle/2)), + (polar(x0: x0, y0: y0, r: in-rad, th: angle + teeth-angle/2)), + + ) + } + ) + let center-rad = in-rad * 2/3 + place(left+bottom, + // wtf? + dx: out-rad - center-rad, + dy: -out-rad + center-rad, + circle( + radius: center-rad, + stroke: stroke, + fill: fill-center, + ) + ) + }) +} + +#let wrench(height: 200pt) = rotate(45deg, image("imgs/ico/wrench.svg", height: height)) +#let apk(height: 100pt) = image("imgs/ico/apk.svg", height: height) +#let apks(height: 100pt) = { + place(apk(height: height)) + place(dx: height * 4 / 10, dy: -height * 3 / 10, apk(height: height)) + place(dx: height * 6 / 10, dy: height / 10, apk(height: height)) +} + +#let transfo(height: 200pt) = { + box(width: height, height: height, { + place( + left+bottom, + dx: height / 12, + dy: - height * 3 / 12, + gear(out-rad: height/3) + ) + place( + left+bottom, + dx: height * 2 / 5, + dy: 0pt, + wrench(height: height*7/8) + ) + }) +} + +#let loop(height: 100pt) = image("imgs/ico/loop.svg", height: height) + +#let analyse(height: 200pt) = { + box(width: height, stroke: black, { + apk(height: height) + place( + left+top, + dx: - height * 3/10, + dy: - height * 1 / 10, + loop(height: height/2) + ) + }) +} + +#phone(body: [Hello World!]) +#move(dx: 100pt, dy: 100pt, gear()) +#wrench() + +#apk() +#v(4em) +#apks() +#v(12em) +#transfo() +#analyse() diff --git a/slides/imgs/ico/apk.svg b/slides/imgs/ico/apk.svg new file mode 100644 index 0000000..9c9fade --- /dev/null +++ b/slides/imgs/ico/apk.svg @@ -0,0 +1,88 @@ + + + + + + + + + + + + + .APK + + + + + + + + + + + diff --git a/slides/imgs/ico/loop.svg b/slides/imgs/ico/loop.svg new file mode 100644 index 0000000..5a9d5e1 --- /dev/null +++ b/slides/imgs/ico/loop.svg @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/slides/imgs/ico/wrench.svg b/slides/imgs/ico/wrench.svg new file mode 100644 index 0000000..978ddca --- /dev/null +++ b/slides/imgs/ico/wrench.svg @@ -0,0 +1,26 @@ + + + + + + + + + +